PDA

View Full Version : سوال: چگونگی تشخیص اندیس شی ایجاد شده هنگام RunTime در دلفی



kamran_14
پنج شنبه 05 اسفند 1389, 14:08 عصر
سلام
چگونگی تشخیص اندیس شی ایجاد شده هنگام RunTime در دلفی
تا بشه فهمید کاربر روی کدام آرایه ی کنترلی کلیک کرده

vcldeveloper
پنج شنبه 05 اسفند 1389, 17:54 عصر
اشیاء به خودی خود اندیس ندارند. شما باید بنویسید که به چه شکلی اشیاء را در runtime ساختید، تا بشه گفت، اگر بر فرض اندیسی به کار رفته باشه، چطور آن اندیس را به دست بیارید.

kamran_14
پنج شنبه 05 اسفند 1389, 18:38 عصر
شما باید بنویسید که به چه شکلی اشیاء را در runtime ساختید،
سلام
من در مثال پایین گفتم که اشیا را چگونه هنگام Runtime ایجاد کردم
حالا من می خوام روی هر شیی که کلیک می کنم به جای Test اندیس آن شی را در message نمایش بدهد
من می خوام برای هر 10 اشیا ایجاد شده یک روال بنویسم نه اینکه برای هر یک از اشیا یک روال جداگانه بنویسم


procedure tform1.s(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ShowMessage('Test');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
a:array[0..9] of tshape;
begin
for i:=0 to 9 do begin
a[i]:=TShape.Create(self);
a[i].Parent:=self;
a[i].Left:=100*i;
a[i].OnMouseDown:=s;
end;
end;

Felony
پنج شنبه 05 اسفند 1389, 20:17 عصر
شما موقع ساخت به Tag کنترل ها مقدار بدید ، یعنی تو اون حلقه بنویسید :

a[i].Tag:= i;

و رویداد s رو به صورت زیر بنویسید :

ShowMessage(IntToStr(TComponent(Sender).Tag));

Mask
سه شنبه 20 دی 1390, 10:55 صبح
با سلام.
منم یه همچین مشکلی دارم. اما با این تفاوت :
من یه کنترل PopupMenu روی فرم گزاشتم . یه نیو Popup هم ایجاد کردم.
حالا میخام وقتی کاربر روی کنترل من راست کلیک کرد ، توی پاپاپ ایجاد شده . شماره tag کنترل رو نمایش بده.
خودم با یه ترفند این مشکل رو رفع کردم. اما میخام ببینم راه ساده تری هست؟
کد من:

var
Form1: TForm1;
NumberImage:byte;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
a:array[0..1] of TImage;
begin
for i:=0 to 1 do
begin
a[i]:=TImage.Create(self);
try
with a[i] do
begin
Parent:=self;
Left:=100*i;
top:=100*i;
Width := 100;
Height := 100;
OnMouseDown:=s;
Canvas.TextOut(10,10,'salam');
tag:=i;
PopupMenu:=PopupMenu1;
end;
finally

end;
end;
end;

procedure TForm1.s(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
NumberImage:=TComponent(Sender).Tag;
end;

procedure TForm1.GetNumClick(Sender: TObject);
begin
ShowMessage(IntToStr(NumberImage));
end;

end.

MohsenB
سه شنبه 20 دی 1390, 11:44 صبح
سلام


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


...
var
Form1: TForm1;
a:array[0..1] of TImage;

implementation

{$R *.dfm}


procedure TForm1.FirstItem1Click(Sender: TObject);
begin
ShowMessage(IntToStr(pm1.Tag));
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
i:integer;
begin
for i:=0 to 1 do
begin
try
a[i].Free;
finally
end;
end;
end;

procedure TForm1.s(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
pm1.Tag:= TComponent(Sender).Tag;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 1 do
begin
a[i]:=TImage.Create(self);
try
with a[i] do
begin
Parent:=self;
Left:=100*i;
top:=100*i;
Width := 100;
Height := 100;
OnMouseDown:=s;
Canvas.TextOut(10,10,'salam');
tag:=i;
PopupMenu:=pm1;
end;
finally

end;
end;
end;

یک تو ضیح کوچک اینکه محل تعریف آرایه ایمیجها اشتباه بود و برای دسترسی و خارج کردن از حافظه مناسب نبود که اصلاح شد


موفق باشید

Mask
سه شنبه 20 دی 1390, 12:13 عصر
ممنون.
اینم بد نیست.
یه متغیر کم شد.
اما دنبال اینم که مستقیم مستقیم ،تگ کنترل رو نشون بدم.

SAASTN
سه شنبه 20 دی 1390, 21:42 عصر
پراپرتی PopupComponent حاوی کامپوننتی هست که آخرین بار باعث نمایش PopupMenu شده. دیگه نیازی هم به MouseDown نیست.
ShowMessage(IntToStr(PopupMenu1.PopupComponent.Tag ));

SayeyeZohor
چهارشنبه 12 بهمن 1390, 08:08 صبح
با تشكر از دوست گوگولي مگولي خودمون SAASTN
اما من با اين كد جواب نگرفتم
فكركنم اين بهتر باشه

ShowMessage(IntToStr(TMenuItem(Sender).Tag));

SAASTN
چهارشنبه 12 بهمن 1390, 09:51 صبح
ما مخلصیم:لبخند:

فکر کنم یخورده قاتی پاتی شد، موضوع بدست آوردن Tag کنترلی بود که روش راست کلیک شده و PopupMenu براش نمایش پیدا کرده؛ کد شما Tag ایتم کلیک شده PopupMenu رو بر می گردونه.

SayeyeZohor
چهارشنبه 12 بهمن 1390, 10:48 صبح
دمت گرم داداش
يك نگاهي به اين بچه تاپيكم ميندازي؟
http://barnamenevis.org/showthread.php?325850-%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D8%AF%D9%88-PopUpMenu-%D8%A8%D8%A7-%D8%AA%D9%85%D8%A7%D9%85-SubMenu%D9%87%D8%A7%D9%8A-%D8%A2%D9%86-%D8%AF%D8%B1-%D9%8A%D9%83-PopUpMenu-%D8%AF%D9%8A%DA%AF%D8%B1&p=1432208#post1432208