ورود

View Full Version : خلاصه نویسی کدها



hadisalahi2
سه شنبه 02 مهر 1387, 14:45 عصر
سلام به همگی دوستان. من در حال نوشتن یه برنامه هستم و داخل این برنامه چند EditBox دارم. با قرار گرفتن مکان نما داخل هر کدوم از کادرها رنگ اون سبز میشه و با خارج شدن از کادرها هم رنگ اونها دویاره سفید میشه.



procedure TForm1.Edit1Enter(Sender: TObject);
begin
Edit1.Color:=clMoneyGreen;
end;


procedure TForm1.Edit1Exit(Sender: TObject);
begin
Edit1.Color:=clWhite;
end;

حالا من داخل این فرم نزدیک به 40 تا کادر EditBox دارم و برای
اینکه این کار داخل این 40 کادر انجام بگیره ، مجبورم 40 خط کد برای رویداد OnEnter و 40 خط کد هم برای رویداد OnExit این کادرها بنویسیم و در نهایت 80 تا پروسیجر ایجاد میشه. حالا سوال من اینه که چطور میتونم برای این 40 کادر فقط دو تا رویداد تعریف کنم که کار من رو انجام بده و به جای تعریف 80 پروسیجر برای این کار فقط دو تا پروسیجر بنویسم و در کل کدهای خودم رو جمع و جور کنم و از تکرار کارهای اضافی اجتناب کنم.
یا حق

amin_alexi
سه شنبه 02 مهر 1387, 15:11 عصر
سلام

(Sender as TEdit).Color:=clMoneyGreen
تو 1 دونه از Objectها اين رو واسه enter
و اين يكي رو واسه Exit

(Sender as TEdit).Color:=clWhite
بعد همه Editها رو انتخاب كن OnEnter همه رو اولي و Exit رو هم كد دومي قرار بده

hadisalahi2
سه شنبه 02 مهر 1387, 15:22 عصر
در صورتی که بخوام این عمل رو برای رویداد KeyPress انجام بدم روش کار چه شکلیه؟
من میخوام در صورتی که داخل هر کدوم از Edit ها که کلید Enter رو زدم مکان نما به Edit بعدی منتقل بشه.
ممنون از لطفتون

SYNDROME
سه شنبه 02 مهر 1387, 16:02 عصر
در صورتی که بخوام این عمل رو برای رویداد KeyPress انجام بدم روش کار چه شکلیه؟
من میخوام در صورتی که داخل هر کدوم از Edit ها که کلید Enter رو زدم مکان نما به Edit بعدی منتقل بشه.
ممنون از لطفتون
می توانی به جای OnKeyPRess هر Edit در KeyPress فرمتان بنویسید و KeyPreview را True کنید.
می توانید برای توضیحات بیشتر کلمه KeyPreview را جستجو کنید.
موفق باشید

Cave_Man
سه شنبه 02 مهر 1387, 16:39 عصر
من پیشنهاد میکنم که از کامپوننتی که مختص همین کار هست استفاده کنید
قبلا لینکش رو در هیمن سایت قرار داده بودم
http://delphi.about.com/od/vclwriteenhance/l/aa120603a.htm

hadisalahi2
سه شنبه 02 مهر 1387, 16:50 عصر
جناب Cave_man ممنون از لطفتون ، ولی متاسفانه من کل فرم رو طراحی کردم و وقتم خیلی کمه و نمیتونم دوباره اون edit ها رو حذف کنم و ا زکامپوننت جدید استفاده کنم ، ولی بازهم ممنون از لطفتون
یا حق

hadisalahi2
سه شنبه 02 مهر 1387, 16:58 عصر
آقای امین من کد شما رو استفاده کردم خیلی جالب بود ، فقط یه مشکل داره!
من داخل فرمم چند تا ComboBox هم دارم ، وقتی میخوام وارد این Combo ها بشم برنامه خطا میده و فکر کنم به خاطر عدم سازگاری نوع در تعریف Sender باشه، برای این کادرها چه کاری انجام بدم؟

vcldeveloper
سه شنبه 02 مهر 1387, 19:14 عصر
من داخل فرمم چند تا ComboBox هم دارم ، وقتی میخوام وارد این Combo ها بشم برنامه خطا میده و فکر کنم به خاطر عدم سازگاری نوع در تعریف Sender باشه، برای این کادرها چه کاری انجام بدم؟

with Sender as TWinControl do
begin
TWinControl(Sender).Color := clGreen;
end;

hadisalahi2
سه شنبه 02 مهر 1387, 21:39 عصر
جناب استاد کشاورز
کد بالایی رو در رویداد OnEnter یک EditBox نوشتم ، ولی متاسفانه پیغام خطا میده و میگه خاصیت Color رو نمیتونم شناسایی کنم

vcldeveloper
سه شنبه 02 مهر 1387, 23:27 عصر
کد بالایی رو در رویداد OnEnter یک EditBox نوشتم ، ولی متاسفانه پیغام خطا میده و میگه خاصیت Color رو نمیتونم شناسایی کنم
متاسفانه خصوصیت Color در کلاس های پایه بصورت Protected تعریف شده. TWinControl نزدیک ترین کلاس پایه مشترک بین TEdit و TComboBox هست، می تونید یا یک شرط بزارید، اما با توجه به اینکه این خصوصیت در TControl تعریف شده، و این کلاس کلاس والد هر دو کامپوننت هست، اگربجای TWinControl از TEdit هم استفاده کنید، برای هر دو جواب میده، البته به شرطی که در این حالت فقط از خصوصیاتی که در هر دو کامپوننت مشترک هست، استفاده کنید.
پس میشه:

TEdit (Sender).Color := clGreen;
در این حالت از as استفاده نکنید، چون متوجه میشه که Combox از TEdit نیست، و یک خطا تولید میکنه.
در هر حال، این کد Safe نیست.
راه های دیگه هم وجود داره، مثل تعریف یک کلاس Hack برای TControl، یا گذاشتن شرط در داخل کد متد برای بررسی نوع کامپوننتی که رویداد را فراخوانی کرده.

راه حل Hack کردن کلاس:


type
TControlHack = class(TControl);

procedure TForm1.Edit1Click(Sender: TObject);
begin
with Sender as TControlHack do
begin
TControlHack (Sender).Color := clGreen;
end;
end;

چک کردن نوع کامپوننت:


procedure TForm1.Edit1Click(Sender: TObject);
begin
if Sender is TEdit then
//Do something
else
//Do something else
end;

hadisalahi2
چهارشنبه 03 مهر 1387, 13:45 عصر
سلام دوباره
استادکشاورز من از حالت دوم کد شما استفاده کردم و کارم رو راه انداخت ، حالا یه سوال دیگه در همین زمینه دارم، البته چون به نظر من مربوط به ادامه همین بحث میشه داخل یک تاپیک دیگه مطرح نکردم.
سوالم اینه که چطور میتونم به سمت رویدادهای کنترلها خودم یک متغیر یا یک شی ارسال کنم
مثلا دستور زیر رو نگاه بندازید:



procedure TMsgBox.MsgCloseMouseEnter(Sender: TObject);
begin
MsgClose.Picture:=PicForm.MsgCloseOver.Picture;
end;


این یک نمونه کد که من برای تعداد زیادی از دکمه هام که البته Image هستند استفاده می کنم.
حالا میخوام بدونم آیا میتونم اون عکس رو به همراه پارامتر Sender به داخل پروسیجر رویداد MouseEnter یا هر رویداد دیگه ارسال کنم
مثلا چیزی مثل کد زیر:



procedure TMsgBox.MsgCloseMouseEnter(Sender: TObject);
begin
(Sender as Timage) .Picture:=ValueFromUser;
end;

vcldeveloper
چهارشنبه 03 مهر 1387, 17:09 عصر
حالا میخوام بدونم آیا میتونم اون عکس رو به همراه پارامتر Sender به داخل پروسیجر رویداد MouseEnter یا هر رویداد دیگه ارسال کنم
مثلا چیزی مثل کد زیر:
مقدار Sender توسط شی ارسال کننده رویداد تعیین میشه، اگر دکمه های شما TImage هستند، و آنها موجب فراخوانی این رویداد میشند، پس Sender از نوع TImage هست. اما اینکه در کنار Sender مقدار دیگه ایی هم بتونید به عنوان پارامتر بهش ارسال کنید، اگر در تعریف اون رویداد نیامده باشه، خیر امکانش نیست.

hadisalahi2
پنج شنبه 04 مهر 1387, 10:56 صبح
سلام به همگی دوستان و
استادکشاورز
به این کدها یه نگاهی بیندازید.



procedure TPolAddForm.RegButtonMouseEnter(Sender: TObject);
begin
RegButton.Picture:=PicForm.RegButtonOver.Picture;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.RegButtonMouseLeave(Sender: TObject);
begin
RegButton.Picture:=PicForm.RegButton.Picture;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.CancleButtonMouseEnter(Sender: TObject);
begin
CancleButton.Picture:=PicForm.CancleButtonOver.Pic ture;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.CancleButtonMouseLeave(Sender: TObject);
begin
CancleButton.Picture:=PicForm.CancleButton.Picture ;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.ExitButtonMouseEnter(Sender: TObject);
begin
ExitButton.Picture:=PicForm.ExitButtonOver.Picture ;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.ExitButtonMouseLeave(Sender: TObject);
begin
ExitButton.Picture:=PicForm.ExitButton.Picture;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.SelectImage1MouseEnter(Sender: TObject);
begin
SelectImage1.Picture:=PicForm.SelectImageOver.Pict ure;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.SelectImage1MouseLeave(Sender: TObject);
begin
SelectImage1.Picture:=PicForm.SelectImage1.Picture ;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.Selectimage2MouseEnter(Sender: TObject);
begin
SelectImage2.Picture:=PicForm.SelectImageOver.Pict ure;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.Selectimage2MouseLeave(Sender: TObject);
begin
SelectImage2.Picture:=PicForm.SelectImage1.Picture ;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.SelectImage3MouseEnter(Sender: TObject);
begin
SelectImage3.Picture:=PicForm.SelectImageOver.Pict ure;
end;
//||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\
procedure TPolAddForm.SelectImage3MouseLeave(Sender: TObject);
begin
SelectImage3.Picture:=PicForm.SelectImage1.Picture ;
end;


این کدها رو من برای ایجاد حالت Over , Up دکمه های استفاده میکنم. در صورتی که در هر فرم چند تا از این دکمه ها داشته باشم ، مجبورم همین کدها رو تکرار کنم. البته این که میگم مجبورم، یعنی اینکه من راهه دیگه ای بلد نیستم.
میتونید راهی به من پیشنهاد کنید که من این کارهای تکراری رو برای دکمه هام انجام ندم ، و فقط یک بار لازم باشه این کار رو با یک پزوسیجر انجام بدم؟

hadisalahi2
پنج شنبه 04 مهر 1387, 15:30 عصر
دوباره سلام.
من مشکلم رو به صورت زیر حل کردم.
این کد رو برای رویداد MouseEnter قرار دادم و برای بقیه دکمه ها هم همین کد رو استفاده کردم.




procedure TPeymanAddForm.RegButtonMouseEnter(Sender: TObject);
begin
if (sender as TImageEx).Name='RegButton' then (sender as TImageEx).Picture:=PicForm.RegButtonOver.Picture;
if (sender as TImageEx).Name='ExitButton' then (sender as TImageEx).Picture:=PicForm.ExitButtonOver.Picture;
if (sender as TImageEx).Name='CancleButton' then (sender as TImageEx).Picture:=PicForm.CancleButtonOver.Pictur e;
end;


این کد رو برای رویداد MouseLeaveقرار دادم و برای بقیه دکمه ها هم همین کد رو استفاده کردم.




procedure TPeymanAddForm.RegButtonMouseLeave(Sender: TObject);
begin
if (sender as TImageEx).Name='RegButton' then (sender as TImageEx).Picture:=PicForm.RegButton.Picture;
if (sender as TImageEx).Name='ExitButton' then (sender as TImageEx).Picture:=PicForm.ExitButton.Picture;
if (sender as TImageEx).Name='CancleButton' then (sender as TImageEx).Picture:=PicForm.CancleButton.Picture;
end;


ولی حالا یه سوال دیگه برام پیش اومده؟ من چطور میتونم از رویدادی که در فرم اول تعریف کردم اینجا(مثلا فرم 2) استفاده کنم. مثلا من این دستورات رو داخل فرم 1 نوشتم ، ولی داخل همه فرمهای دیگه هم این دکمه ها رو دارم. میخوام بجای اینکه این کدها رو توی فرمهای دیگه هم کپی کنم، فقط از کدهای همون فرم اول استفاده کنم.
ممنون میشم
یا حق

hadisalahi2
جمعه 05 مهر 1387, 12:18 عصر
من کدهای هدر پروسیجر رویدادهای MouseEnter و MouseLeave رو در قسمت Puplic قرار دادم تا بتونم از اونها در فرمهای دیگه هم استفاده کنم ، ولی متاسفانه موقع اجرا و در زمان ایجاد فرم پیغام خطا میده.
کسی از دوستان نمیتونه به سوال من پاسخ بده؟
یا حق

vcldeveloper
جمعه 05 مهر 1387, 15:58 عصر
کسی از دوستان نمیتونه به سوال من پاسخ بده؟
همچین کاری ارزش نداره، یک کامپوننت درست کنید و این قابلیت را در داخل آن پیاده سازی کنید.