تبلیغات
برنامه نویسی و الکترونیک - اختصاص دادن یک Procedure به یک رویداد از یک کامپوننت
 
منوی اصلی


--------------------------

--------------------------

--------------------------

--------------------------


سفارش پروژه

E-Mail :
Mahmood_Mehri@Hotmail.com

سایت برنامه نویس :  Mahmood_M


موضوعات

دانلود نرم افزار
 
تخصصی برنامه نویسی
  تخصصی برق ( الکترونیک )
  کامپوننت ها و ابزارها
  نرم افزارهای متفرقه
برنامه نویسی
  مباحث عمومی
  آموزش Delphi

  آموزش زبان C++ / C
 
آموزش Matlab

  آموزش زبان Assembly
  آموزش DataBase

الکترونیک
  مباحث عمومی
  مباحث عمومی الکترونیک
  معرفی قطعات الکترونیکی
  کار با مولتی متر
  مدارات الکترونیک
  میکروکنترلر
  میکروکنترلرهای AVR
  پروژه ها
مباحث متفرقه
  آموزشهای متفرقه
  معرفی سایت
  معرفی کتاب
  پاسخ به سئوالات
  مطالب عمومی


لینك دوستان
:: جک :: اس ام اس :: عکس
:: الکترونیک 89 گیلان
:: سورسهای نرم افزاری
:: اینترنت بدون تحریم
:: علمی.کتاب.مجله.نرم افزار.مقاله
:: مبارزات آزاد
:: برنامه نویسی از اهل زمین
:: :: جزیره ی دانلود ::
:: :: کامپیوتر و IT ::
:: بزرگترین پایگاه مدل لباس اینترنتی
:: مرکز دانلود ایرانیان
:: پایگاه علمی مهندسی تراشه
:: تمامی راهکارهای کامپیوتری
:: برنامه نویسی و طراحی وب
:: خرید ساعت دیواری
:: :: فناوری روز ::
:: :: همه چیز واسه موبایل ::
:: آموزش تخصصی کامپیوتر
:: * پیاز داغ اینترنت ! *
:: جدیدترین موزیکها و نرم افزارها
:: دانلود سورس ویژوال بیسیک
:: امپراطور دانلود و آموزش
:: موبایل و کامپیوتر
:: جدیدترین آهنگهای هفته
:: درباره ی دلفی !
:: برنامه نویس
:: پروژه های رایگان و آموزش ++C
:: ابراهیم آنلاین

 : " اختصاص دادن یک Procedure به یک رویداد از یک کامپوننت " :
 
با سلام ...
چند مدت پیش دوستی در سایت برنامه نویس سئوالی پرسید که برای جواب دادن به اون سئوال سورس کوچکی ! نوشتم که قصد دارم در این پست اون رو بررسی کنیم :
بدون مقدمه آموزش رو شروع میکنیم :

قصد داریم به یک Event خاص از یک کامپوننت یک Procedure را اختصاص دهیم ...
برای درک بهتر یک برنامه ی نمونه را پی می گیریم ...

صورت مسئله :

فرض کنید تعداد زیادی کامپوننت Edit بر روی فرم گذاشته ایم ، می خواهیم وضعیتی را ایجاد نماییم که در در هنگام ورود به Edit ها رنگشان تغییر کرده و پس از خروج از Edit ها رنگشان به حالت اولیه برگردد ، بدین منظور دو راه به ذهن می رسد :
  1. برای رویداد همه ی Edit ها کد نویسی کنیم و رنگ شان را تغییر دهیم که البته کاری زمانبر و غیر منطقی است
  2. یک Procedure با امضای رویدادهای ذکر شده بسازیم و آن را به همه ی Edit ها اختصاص دهید ( با 2 خط کد ! )
راه حل مسئله :
ابتدا لازم است درباره لغت " امضاء " که در بالا ذکر شد ، توضیحی داده شود ...
منظور از امضاء ( بخوانید Signature ! ) برای یک Procedure یا تابع ( Function ) درواقع نام و نوع متغیرها یا پارامترهای درخواستی است ، به عنوان مثال به Procedure زیر دقت کنید :
Procedure MyProcedure( MyVariable : Integer );
در Procedure بالا قسمتی که امضاء را برای یک Procedure مشخص می کند با رنگ قرمز مشخص شده است ...
حال اگر Event ای با امضای مشابه ی Procedure بالا داشتیم ، می توانیم ، این Procedure را به آن اختصاص دهیم ...
خوب ، به سراغ برنامه نمونه می رویم ... 
پروژه ی جدید ایجاد کنید و به عنوان مثال 10 عدد Edit بر روی آن قرار دهید ، نیاز داریم که در رویداد OnEnter مربوط به Edit ها رنگ آنها را مثلا به clSilver ( رنگ نقره ای ) تغییر دهیم و در رویداد OnExit دوباره رنگ آنها را به clWindow ( رنگ سفید ) برگردانیم ...
مطمئنا نوشتن کد تغییر رنگ برای 10 عدد Edit به صرفه نخواهد بود ، پس بهتر است که دو Procedure با امضای مشابه با Event های OnEnter و OnExit بنویسم و آنها را در زمان اجرای برنامه ( مثلا در رویداد OnCreate فرم ) به Edit ها اختصاص دهیم ...
ابتدا به امضای رویدادهای OnExit و OnEnter توجه کنید ، این رویداد ها مانند بسیاری از رویدادهای کامپوننتهای دیگر امضای این چنینی دارند :
Sender : TObject

به عنوان یک نکته ی اضافی عرض کنم که رویداد هایی که چنین امضایی دارند در دلفی با نام NotifyEvent شناخته می شوند ، TNotifyEvent یک نوع ( Type ) از Event است که دارای پارامتر اضافی نیست ، مثل رویدادهای OnEnter یا OnExit برای TEdit یا OnClick برای یک دکمه یا ...
این رویدادها ( NotifyEvent ها ) فقط یک Sender دارند ! ، Sender برای یک Procedure ، کامپوننتی را مشخص می کند که رویداد مورد نظر را فراخوانی کرده ، در ادامه بیشتر با Sender آشنا خواهیم شد ...

نوشتن Procedure ها :

در قسمت Public فرم دو Procedure به صورت زیر تعریف کنید :
Public
   procedure MyOnEnter( Sender : TObject );
   procedure MyOnExit( Sender : TObject );
به امضای Procedure ها دقت کنید ...
حال باید برای این Procedure ها کدنویسی کنید ، گفتیم که پارامتر Sender کامپوننتی را مشخص میکند که Procedure را فراخوانی کرده است ، در این صورت پس از اختصاص دادن Procedure ها به رویدادهای موردنظر ، با هر بار که Procedure های تعریف شده فراخوانی شوند ، Sender در اینجا Edit ای که Procedure ما را فراخوانی کرده است خواهد بود ، حال به کدهای زیر دقت کنید :
برای MyOnEnter :

procedure TMainFrm.MyOnEnter(Sender : TObject);
begin
 (Sender as TEdit).Color := clSilver;
end;

برای MyOnExit :

procedure TMainFrm.MyOnExit(Sender : TObject);
begin
 (Sender as TEdit).Color := clWindow;
end;

در کدهای بالا به قسمت " ( Sender as TEdit ) " توجه کنید ، این قسمت به دلفی می گوید ! که کامپوننت فراخوانی کننده ی رویداد را به عنوان یک TEdit در نظر بگیر ...
البته توجه کنید که در اینجا ما Procedure های نوشته شده را به وسیله ی کامپوننت دیگری فراخوانی نمی کنیم ، پس Sender در اینجا همواره Edit فراخوانی کننده خواهد بود ، اما اگر توسط کامپوننت دیگری هم Procedure ما فراخوانی می شد ، لازم که ابتدا Edit بودن Sender را چک کنیم ، مثال :
if Sender is TEdit then
  ...
خوب ، حال نوبت به اختصاص دادن Procedure ها به Edit ها می رسد ، زمان Create شدن فرم زمان مناسبی برای انجام این کار است ، به کد زیر دقت کنید :

procedure TMainFrm.FormCreate(Sender: TObject);
var
 I : Integer;
begin
 for I := 0 to MainFrm.ComponentCount - 1 do
  begin
   if Components[I].ClassName = 'TEdit' then
    begin
     (Components[I] as TEdit).OnExit := MyOnExit;
     (Components[I] as TEdit).OnEnter := MyOnEnter;
    end;
  end;
end;

چند نکته :
  • ComponentCount برای یک WinControl ، تعداد کامپوننتهای Child آن را بر میگرداند ، مثلا در کد بالا ComponentCount برابر تعداد کامپوننتهایی است که Parent آنها فرم اصلی ما یعنی MainFrm است.
  • به وسیله ی " Components " می توانیم به یکی از کامپوننتهای فرزند برای یک WinControl اشاره کنیم ، بدین منظور باید شماره ی Index کامپوننت را به آن بدهیم ، برای نگهداری ترتیب کامپوننتها دلفی به هر کامپوننت یک شماره اختصاص می دهد ( با توجه ترتیب قرار گیری روی فرم و ... ) که این شماره ها از صفر شروع شده و ماکزیمم آن تعداد کامپوننتها منهای یک ! خواهد بود ...
  • برای این که چک کنیم که کامپوننت مورد نظر از نوع TEdit است یا نه ، از نام کلاس کامپوننت استفاده کردیم که آیا TEdit است یا خیر ، می توان از شرطهای دیگر مانند شرطی که برای چک کردن Sender در بالا به آن اشاره شد استفاده کرد ...
خوب ، کار ما به پایان رسید ...
برای درک بهتر برنامه ی نمونه ای هم آماده شده که از لینک زیر می توانید دانلود نمایید :

امیدوارم مفید بوده باشه ...

موفق باشید ...

 

 :: لینك ثابت نویسنده : محمود مهری نظرات Comment

مطالب اخیر

معرفی کانال و گروه های تلگرام
استفاده از Component Template ها در دلفی
مقاله : نحوه ی استفاده از پنل پیامک در نرم افزار
E-Book :: راه اندازی موتورهای DC و پله ای با استفاده از میکرو کنترلر AVR
آشنایی با عملگرهای بیتی ( Bitwise Operators )
تست دیود و ترانزیستور با مولتی متر
دلفی :: ارسال آرایه به حافظه ی Clipboard
یک سایت فوق العاده برای علاقه مندان به علم فیزیک
مداری برای نمایش عبور جریان برق از بدن !!
سال نو مبارک ...
آدرس وبلاگ !
ساخت یک LED فلاشر با میکروکنترلر AVR ATMega16A
آشنایی با کاربرد " رله " ( Relay ) در مدار
کار با ماتریسها در Matlab
SQL :: آشنایی با دستور شرطی WHERE


صفحات وبلاگ :