PDA

View Full Version : نسبت دادن funtion در یک global unit به event



zman123456
شنبه 30 شهریور 1387, 10:47 صبح
با سلام
من یه global unit دارم که function - procedure های عمومی خودمو تو اینها تعریف میکنم و بعد با یه use کردن این unit میشه تو هر فرمی از این توابع استفاده کرد.
حالا به یه مشکلی برخورد کردم.
یه procedure نوشتم که به جای event یکی از کامپوننتای فرمم عمل میکنه و از این تو اکثر کامپوننتام دارم استفاده میکنم.
تا به حال این procedure رو تو هر فرم تعریف میکردم و ازش استفاده میکردم.
حالا می خوام بدونم چطوری میشه اونو تو global unit بذارم و تو object inspector بگم که event این کامپوننت باید این procedure باشه.
این کار رو امتحان کردم نشد.unit رو use هم کردم.

vcldeveloper
شنبه 30 شهریور 1387, 11:07 صبح
در دلفی Event-handler ایی که به یک Event ایی که Published شده اختصاص پیدا میکنه، باید متدی از یک شی باشه، مثلا:


TNotifyEvent = procedure(Sender: TObject) of TObject;

zman123456
شنبه 30 شهریور 1387, 12:12 عصر
با عرض پوزش
خب حالا یعنی من بیام تو Global Unit این تابعی که نوشتم رو آخرش of Tobject بذارم یا من درست متوجه نشدم؟

shervin farzin
شنبه 30 شهریور 1387, 16:00 عصر
سلام
نه ، نبايد آخرش TObject بذاري . همون ورودي كه از نوع Object بهش ميدي كافيه .
فقط به يه نكته ديگه هم توجه كن . اگه ميخواي يه Procedure به Event يه كامپوننت اختصاص
بدي حتما بايد ورودي هاي Procedure ورودي هاي تعيين شده توسط دلفي باشن . مثلا
Onclick Event براي يه دكمه فقط يه ورودي از نوع Tobject مي گيره و شما اگه يه تابع با اعلان زير داشته باشي ميتوني اونو به Onclick Event يه دكمه نسبت بدي


Procedure BTNClick ( X : TObject ) ;

نكته اي هم كه آقاي كشاورز اشاره كردند همين بود كه تمام Event ها ورودي از نوع Tobject دارند . حالا اگه شما تابعت رو ميخواي به يه Event ديگه نسبت بدي من پيشنهاد ميكنم اول
به صورت معمولي از طريق خود دلفي اون Event رو بساز تا متوجه بشي اين Event خاص چه
نوع ورودي هايي داره . بعد پاكش كن و يه تابع بنويس با همون ورودي ها و ديگه مشكلت حل ميشه .
موفق باشيد .

vcldeveloper
شنبه 30 شهریور 1387, 18:54 عصر
نكته اي هم كه آقاي كشاورز اشاره كردند همين بود كه تمام Event ها ورودي از نوع Tobject دارند . حالا اگه شما تابعت رو ميخواي به يه Event ديگه نسبت بديخیر من همچین چیزی نگفتم! بلکه گفتم؛ "باید متدی از یک شی باشه"، یعنی باید در داخل یک کلاس بصورت متد تعریف شده باشه. یک Procedure عادی که خارج کلاس تعریف میشه، نمیتونه of TObject باشه. Eventهایی هم که در بخش Published یک کلاس تعریف میشند تا در Object Inspector نمایش داده بشند، نمی تونند یک Procedure عادی را به عنوان Event-handler قبول کنند.

zman123456
یک شنبه 31 شهریور 1387, 09:33 صبح
با تشکر از دوستان
من یه procedure دارو که ورودیش TObject هست.ولی به قول آقای کشاورز جزء کلاس خاصی نیست.یعنی به صورت معمولی فقط تو یه unit نوشتمش.از راهنماییتون ممنون.حالا چطوری اینو بذارم تو یه کلاس تا بشه وصلش کرد به یه event؟
اگه میشه یه مثال ساده بزنید.

shervin farzin
یک شنبه 31 شهریور 1387, 11:18 صبح
سلام
مثال اين طوريه كه من توي فرم اصلي برنامه دو تا دكمه دارم و دكمه دوم (Button2) هيچ Event
نداره و ميخوام وقتي روي دكمه اول كليك كردم يه تابع به نام Test كه توي يه Unit ديگست به
Onclick Event دكمه دوم نسبت داده بشه و از اون به بعد با كليك دكمه دوم تابع Test فراخواني
بشه .
اين كد Unit كه تابع Test درونش تعريف شده :


unit Unit2;

interface

uses Dialogs,classes;

type
MyClass = Class
Public
Procedure Test(x:tobject);
End;

implementation

{ MyClass }

procedure MyClass.Test(x: tobject);
begin
showmessage('Test');
end;

end.


اينم كد Unit فرم اصلي برنامه :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, unit2;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
Tmp:MyClass;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
button2.OnClick:=Tmp.Test;
end;

end.


در Unit1 به متغير Tmp توجه كنيد كه يك نمونه از كلاسي كه تابع Test تحتش اعلان شده .
نكته ديگه اينه كه Unit2 هيچ فرمي نداره ، يعني من يه Unit خالي به پروژه Add كردم نه يك فرم .
براي همين مجبورم يه كلاس بسازم و تابع Test رو درونش قرار بدم اما اگه يه فرم Add ميكردم
چون با خودش به طور اتوماتيك يه كلاس به نام مثلا Form2 ساخته ميشه ميتونستم از تعريف
همين كلاس براي تابعم استفاده كنم و متغير Tmp هم يه نمونه از Form2 ميشد .
موفق باشيد .

zman123456
یک شنبه 31 شهریور 1387, 14:29 عصر
دست شما درد نکنه.
منم یه Global Unit دارم.پس فقط کافیه که تو اون یونیت برم یه کلاس برای خودم تعریف کنم و تابع مورد نظر رو تو اون اضافه کنم و در یونیت مورد استفاده یه متغیر بذارم از نوع کلاس تعریف شده و ... خدا خیرت بده.
از اینکه کامل جواب دادید ممنون.از آقای کشاورز هم متشکرم.

zman123456
چهارشنبه 03 مهر 1387, 12:24 عصر
دست همگی درد نکنه.
تنها نکته ای که باقی میمونه و باید گفت اینکه که اون unit که تابع توش هست رو حتما باید در بالا use کرد تا تشخیص داده بشه.
مشل حل شد