PDA

View Full Version : روش خنثی نمودن nil



khoshblagh
یک شنبه 03 آبان 1388, 08:42 صبح
با سلام خدمت دوستان
میدانیم که با nil کدی مانند زیر را غیر فعال میکنیم. حالا با چه کدی دستور nil را خنثی نمائیم؟ متشکرم

frmGharardadEdit.OnMouseWheelDown:=nil

vcldeveloper
یک شنبه 03 آبان 1388, 09:11 صبح
چیزی چیزی رو خنثی نمیکنه. کدی که شما نوشتید، فقط میگه متدی به رویداد OnMouseWheelDown اختصاص پیدا نکنه، همین!

یک رویداد اشاره گری به یک متد هست، وقتی اون رویداد رخ میده، آن متد اجرا میشه. وقتی مقدار اشاره گر مربوطه nil باشه، یعنی به هیچ متدی اشاره نمیکنه. اگر اسم یک متد بهش اختصاص داده شده باشه، یعنی آن رویداد به این متد اشاره میکنه، و رخ دادن آن رویداد باعث فراخوانی این متد میشه.

hadisalahi2
یک شنبه 03 آبان 1388, 09:19 صبح
میشه بیشتر توضیح بدید.
یعنی چی Nil رو خنثی کنیم؟

Mahmood_M
یک شنبه 03 آبان 1388, 09:49 صبح
میدانیم که با nil کدی مانند زیر را غیر فعال میکنیم. حالا با چه کدی دستور nil را خنثی نمائیم؟ متشکرم
frmGharardadEdit.OnMouseWheelDown:=nil
اگه میخواید یک رویداد در زمان خاصی اجرا بشه یا نشه ، یک راهش اینه که مثلا یک متغیر Boolean تعریف کنید و با True و False کردن اون ، اجرا شدن یا نشدن رویداد رو مدیریت کنید ، مثلا در رویداد مورد نظر چک کنید که اگر متغیر True بود کارش رو انجام بده و اگر False بود کاری نکنه ! ، هرجا هم خواستید که چیزی انجام نشه ، متغیر رو False کنید ...
متغیر باید Global باشه ، یعنی مثلا در قسمت Public فرمتون تعریف کنید ...

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

khoshblagh
یک شنبه 03 آبان 1388, 09:52 صبح
میشه بیشتر توضیح بدید.
یعنی چی Nil رو خنثی کنیم؟
با تشکر از دوستان
ببین در برنامه یک جایی باید حالتی را کنترل نماید. اگر صحیح بود دستور Nil پست قبلی را
اجرا نماید. و اگر غلط بود درست عکس حالت اول است. مسئله این است که فرضا اگر حالت
اول پیش بیاید. دستور Nil اجرا میشود و تاثیر آن برقرار میباشد. حالا در مرتبه دیگر اگر حالت دوم پیش بیاید به علت اینکه اثر Nil خنثی نشده همچنان اثر Nil برقرار است که عملکرد برنامه را مختل میکند. متشکرم

if x=1 then
frmGharardadEdit.OnMouseWheelDown=nil
else
frmGharardadEdit.OnMouseWheelDown<>nil

Felony
یک شنبه 03 آبان 1388, 10:03 صبح
میشه بیشتر توضیح بدید.
یعنی چی Nil رو خنثی کنیم؟

منظورشون این هست که وقتی یک رویداد رو nil کردن چهطور باز دوباره به حالت قبل برش گردونن یعنی رویداد رو فعال کنن .

شما باید زمانی که نیاز دارید دوباره رویداد رو فراخوانی کنید ، به شکل زیر :

برای Nil کردن :


Form1.OnMouseWheelDown:=Nil;

برای فراخوانی مجدد :


Form1.OnMouseWheelDown:=FormMouseWheelDown;

Felony
یک شنبه 03 آبان 1388, 10:10 صبح
با تشکر از دوستان
ببین در برنامه یک جایی باید حالتی را کنترل نماید. اگر صحیح بود دستور Nil پست قبلی را
اجرا نماید. و اگر غلط بود درست عکس حالت اول است. مسئله این است که فرضا اگر حالت
اول پیش بیاید. دستور Nil اجرا میشود و تاثیر آن برقرار میباشد. حالا در مرتبه دیگر اگر حالت دوم پیش بیاید به علت اینکه اثر Nil خنثی نشده همچنان اثر Nil برقرار است که عملکرد برنامه را مختل میکند. متشکرم

if x=1 then
frmGharardadEdit.OnMouseWheelDown=nil
else
frmGharardadEdit.OnMouseWheelDown<>nil

همونطور که آقای کشاورز گفتند nil از اختصاص یک متد به رویداد جلوگیری میکنه ، پس نمیتونیم مثلا بگیم Edit1.OnChange<>Nil چون وقتی یک رویداد رو با nil مقدار دهی میکنید دیگه تا زمانی که دوباره یه متد بهش اختصاص ندید نمیتونه اون رویداد رو اجرا کنه .

راه حل در پست قبلی گفته شد .

khoshblagh
یک شنبه 03 آبان 1388, 11:12 صبح
منظورشون این هست که وقتی یک رویداد رو nil کردن چهطور باز دوباره به حالت قبل برش گردونن یعنی رویداد رو فعال کنن .

شما باید زمانی که نیاز دارید دوباره رویداد رو فراخوانی کنید ، به شکل زیر :

برای Nil کردن :


Form1.OnMouseWheelDown:=Nil;

برای فراخوانی مجدد :


Form1.OnMouseWheelDown:=FormMouseWheelDown;
دقیقا من دنبال کد بالا میگشتم. متشکرم.
ولی ظاهرا قسمت دوم کد(قرمز) مشکلی دارد . لطفا کنترل بفرمائید.

vcldeveloper
یک شنبه 03 آبان 1388, 11:21 صبح
ولی ظاهرا قسمت دوم کد(قرمز) مشکلی دارد . لطفا کنترل بفرمائید.
مقداری که به رویداد اختصاص میدید نام یک متد هست. لزوما نام متدی که شما برای رویدادتان نوشتید با نام متدی که در کد بالا نوشته شده یکی نیست. شما باید به جای عبارتی که قرمز کردید، نام متدی که برای اون رویداد در کد خودتان در نظر گرفتید را بنویسید.

tdkhakpur
یک شنبه 03 آبان 1388, 11:24 صبح
دقیقا من دنبال کد بالا میگشتم. متشکرم.
ولی ظاهرا قسمت دوم کد(قرمز) مشکلی دارد . لطفا کنترل بفرمائید.
شما به event‌هاي فرم يه نگاهي بندازيد روي OnMouseWheelDown دابل كليك كنيد كد خالي براي متد شما ايجاد ميشود


procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
// اينجا ميتوانيد كد جديد را براي انجام عمليات وارد كنيد.
end;

البته براي برگشت به حالت قبل بايد آدرس پروسه قبلي را قبل از nil‌ كردن ذخيره كرده باشيد يا از WindowProc براي ادامه كار استفاده كنيد.

Felony
یک شنبه 03 آبان 1388, 12:00 عصر
البته براي برگشت به حالت قبل بايد آدرس پروسه قبلي را قبل از nil‌ كردن ذخيره كرده باشيد يا از WindowProc براي ادامه كار استفاده كنيد.
نیازی به این کار نیست ، همونطور که توضیح دادم کافیه متد رو دوباره به رویداد مورد نظر اختصاص بدیم .

tdkhakpur
یک شنبه 03 آبان 1388, 12:16 عصر
نیازی به این کار نیست ، همونطور که توضیح دادم کافیه متد رو دوباره به رویداد مورد نظر اختصاص بدیم .
كدوم رويداد؟؟؟؟؟؟

Felony
یک شنبه 03 آبان 1388, 14:59 عصر
هر رویدادی که nil کردینش ، فقط کافیه طبق اون کدی که من نوشتم و توضیحات آقای کشاورز عمل کنید .

tdkhakpur
یک شنبه 03 آبان 1388, 17:50 عصر
هر رویدادی که nil کردینش ، فقط کافیه طبق اون کدی که من نوشتم و توضیحات آقای کشاورز عمل کنید .
معني نداره! البته من احتياجي به پاسخ ندارم شما براي اينكه حرف خودتان را بزنيد همش داريد روي حرف خودتان دور ميزنيد..
ببينيد وقتي ميخواهيد يك event‌را تغيير بديد بايد قبل از اين كار پروسه قبلي را ذخيره كنيد وگرنه راه بازگشتي براي اين كار نيست مگر اينكه از windowproc‌استفاده كنيد.

Felony
یک شنبه 03 آبان 1388, 19:33 عصر
:قهقهه:شما عادت دارید دانسته های خودتون رو به دیگران تحمیل کنید ، وقت کردید یه بار دیگه تاپیک رو مطالعه کنید ، در کل بحث علمی این تاپیک فعلا تموم شده و من دیگه کاری اینجا ندارم ، شما میتونید با نظریات خودتون این تاپیک رو ادامه بدید ...

موفق باشید .

vcldeveloper
یک شنبه 03 آبان 1388, 22:46 عصر
وقتی مقدار nil به یک رویداد اختصاص داده میشه، آدرس متد قبلی که به عنوان Event-handler به رویداد اختصاص پیدا کرده بود، از بین میره. برای اینکه در کد دوباره رویداد به همان متد قبلی اشاره کنه، باید آدرس متد قبلی جایی ذخیره شده باشه، یا اینکه برنامه نویس در زمان نوشتن کد بداند دقیقا چه متدی باید جایگزین nil شود.

در ضمن، هر رویداد لزوما متناظر با یک Message نیست، که بشه با override کردن WinProc رخ دادن رویداد را کنترل کرد. خیلی از رویدادها بدون اینکه Message خاصی به WinProc ارسال بشه، توسط برنامه نویس اون کلاس یا کامپوننت فراخوانی میشند.

khoshblagh
دوشنبه 04 آبان 1388, 06:50 صبح
با سلام خدمت دوستان
من نتوانستم دستور nil را خنثی نمایم . در صورت امکان مثالی جهت راهنمایی بنده ارائه نمائید. متشکرم.

شرط را این کد قرار دادم:


if data.tblKhodroData_.Eof then begin




btnRight.Enabled :=False;


btnLeft.Enabled :=False;
frmGharardadEdit.OnMouseWheelDown:=nil;
frmGharardadEdit.OnMouseWheelUp:=nil;
end
else begin
btnRight.Enabled :=True;
btnLeft.Enabled :=True;
frmGharardadEdit.OnMouseWheelDown:= ;
frmGharardadEdit.OnMouseWheelUp:= ;
end;



در رویداد موس اینه نوشتم:


procedure TfrmGharardadEdit.FormMouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
btnRight.SetFocus;
keybd_event(VK_RETURN,0,0,0);
end;
procedure TfrmGharardadEdit.FormMouseWheelUp(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
btnLeft.SetFocus;
keybd_event(VK_RETURN,0,0,0);
end;

vcldeveloper
دوشنبه 04 آبان 1388, 09:28 صبح
من نتوانستم دستور nil را خنثی نمایم . در صورت امکان مثالی جهت راهنمایی بنده ارائه نمائید.
مشکل در این هست که شما درک درستی از nil و از Event در دلفی ندارید.

nil یعنی "هیچی" یعنی مقدار پوچ. وقتی اشاره گری nil میشه، یعنی به هیچی اشاره نمیکنه.

Event در دلفی یعنی اشاره گری [اشاره گر متغیری هست که آدرس یک خانه از حافظه را در خودش نگهداری میکنه. این خانه از حافظه میتونه حاوی هر چیزی باشه] به یک متد. متد به طور ساده یعنی تابع یا procedure ایی که در داخل یک کلاس تعریف شده باشه. یک Event به یک تابع یا procedure ایی که داخل یک کلاس تعریف شده باشه اشاره میکنه، در نتیجه کلاس یا کامپوننتی که اون Event را تعریف کرده، میتونه هر زمان که نیاز به رخ دادن آن Event بود، این متد را فراخوانی کنه. به متدی که به یک Event اختصاص داده میشه Event-handler گفته میشه.

وقتی شما در داخل IDE روی یک شی (فرضا یک دکمه) دابل کلیک می کنید، IDE دلفی بطور خودکار یک Event-handler در داخل کد برای شما ایجاد میکنه، و نام آن را به رویداد OnClick آن دکمه اختصاص میده، یعنی هر زمان که رویداد OnClick این دکمه رخ داد، متد موجود در این خانه از حافظه را اجرا کن.

حالا فرض بگیریم شما یک متغیر ساده عدد صحیح دارید که مقدارش 10 هست:

n := 10;

بعد شما مقدار n را صفر می کنید:

n := 0;

حالا اگر بنویسید

n := ;
انتظار دارید که مقدار 10 به n برگرده؟! یا اینکه اگر به مقدار قبلی n احتیاج داشته باشید، ابتدا آن را در جایی ذخیره می کنید، تا سپس هر وقت بهش نیاز بود، به آن مراجعه کنید؟

n := 10;
m := n;
n := 0;
...
// برگشت مقدار قبلی به n
n := m;

برای یک Event هم همین قاعده حکمفرما ست، چون Event شما هم نوعی متغیر هست. حالا اگر مقدار Event شما همیشه یک چیز هست (یعنی همیشه به یک متد اشاره میکنه) و بعضی وقت ها باید مقدارش nil بشه، با توجه به اینکه همه متدها نام دارند، نیازی نیست حتما آدرس آن یک متد را جایی ذخیره کنید، فقط اسمش را بنویسید، کامپایلر آدرسش را بدست میاره، پس اگر دکمه Button1 ما یک رویداد OnClick داره که متد Button1Click به آن اختصاص پیدا کرده، ما می تونیم با دستور زیر کاری کنیم که در صورت رخ دادن Event، متدی اجرا نشه:

Button1.OnClick := nil;

و می تونیم با استفاده از کدی مثل کد زیر کاری کنیم که این Event مجددا به همان Button1Click اشاره کنه، تا در صورت رخ دادن Event، این متد اجرا بشه:

Button1.OnClick := Button1Click;

اگر فرضا نمی دانستیم که قبل از nil کردن Event چه متدی به آن اختصاص پیدا کرده بود، باید ابتدا مقدار OnClick را در یک متغیر ذخیره می کردیم، تا بعد از nil کردن، اگر لازم بود، دوباره آن مقدار را به Event اختصاص بدیم:

MyClickMethod := Button1.OnClick;
Button1.OnClick := nil;
...
// برگرداندن مقدار قبلی به رویداد
Button1.OnClick := MyClickMethod;

دوستان، این مفاهیم را یاد بگیرید. اینها از اصول اولیه ایی هست که باید بلد باشید، نه نکات پیشرفته ایی که سالی یک بار به کارتان بیاد!