PDA

View Full Version : سوال: مشکل در تعریف اشیای پویا



sajioo
یک شنبه 30 آبان 1389, 21:30 عصر
سلام دوستان
من در برنامم چند شی به صورت پویا ایجاد کردم. یک image هم در برنامه دارم.
می خوام در رویداد onclick این شی ها بگم که اون image موجود در برنامه مقادیر left , top اش با مقادیر top و left این شی پویا یکی بشه .اما نمی تونم چنین چیزی رو تعریف کنم.
برای onclick شی پویا پروسیجر زیر را تعریف کردم.
//-------------------------------------
procedure TForm1.imageclick(sender:TObject) ;
begin
if sender.ClassType=TImage then
begin
image19.Left:=sender.left.
image19.Top:=sender.top;
end;
//-------------------------------------
اما وقتی می خوام بنویسم sender.left یا sender.top خطا می گیره.
میشه یکی کمکم کنه؟

Felony
یک شنبه 30 آبان 1389, 22:04 عصر
بایدم خطا بگیره ، Sender یه شئ از نوع کلاس پایه TObject هست ، شما باید برای دستیابی به متدهای شئ مورد نظر اون رو TypeCast کنید ، مثلا در همون کد بالا اگر مطمئن هستید که شئ Sender یک TImage هست :
procedure TForm1.imageclick(sender:TObject) ;
begin
if sender.ClassType=TImage then
begin
image19.Left:= TImage(Sender).left;
image19.Top:= TImage(Sender).top;
end;
end;

Mahmood_M
یک شنبه 30 آبان 1389, 22:13 عصر
باید با یک TypeCast متغیر Sender رو به عنوان یک TImage در نظر بگیرید ، شرط رو هم می تونید با IS انجام بدید :
procedure TForm1.ImageClick(Sender: TObject);
begin
if Sender is TImage then
begin
Image19.Left := TImage(Sender).Left;
Image19.Top := TImage(Sender).Top;
end;
end;

توجه کنید که در اینجا چون قبل از TypeCast نوع Sender رو چک کردیم ، می تونیم با اطمینان از TImage(Sender) استفاده کنیم ، در غیر اینصورت اگر از TImage بودن یک Object ( در اینجا Sender ) اطمینان نداشته باشید بهتره به صورت زیر عمل کنید :
begin
Image19.Left := (Sender as TImage).Left;
Image19.Top := (Sender as TImage).Top;
end;
در این صورت اگر Sender یک TImage نباشه یک پیغام خطا نمایش داده میشه و دستور اجرا نمیشه ...
اما اگر بدون چک کردن نوع Sender از روش اول استفاده کنید ، ممکنه Sender یک TImage نباشه ولی باز کد اجرا میشه و این می تونه مشکل ایجاد کنه ...
فرض کنید Sender ممکنه یک TEdit یا یک TButton باشه ، در اینصورت اگر Sender یک TEdit باشه و شما به صورت زیر عمل کنید :
procedure TForm1.Click(Sender: TObject);
var
S : String;
begin
S := TButton(Sender).Caption;
end;
اگر یک Edit بر روی فرم بزارید و این Procedure رو به رویداد OnClick اون نسبت بدید ، با کلیک بر روی Edit متغیر S مقدار Text مربوط به Edit رو خواهد گرفت ، چون در این حالت برنامه با Sender به عنوان یک Control خام عمل می کنه و در این حالت خاصیت Caption مربوط به TButton با خاصیت Text مربوط به Edit برابره ، درواقع هر دو عنوان یک پنجره در ویندوز هستند ( WinControl )

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

ویرایش : جوابها همزمان شد !