PDA

View Full Version : کار با کنترلهایی که دینامیکی ساخته میشوند



BOB
جمعه 01 آبان 1383, 06:17 صبح
سلام .
فرض کنیم بدون تعریف متغیر ... بوسیله این کد چند تا دکمه بی نام و نشون درست کردیم .

with tbutton.Create(self) do
begin
parent:=form1;
end;
1.حالا چطور میتونیم خصوصیات اونها رو تغییر بدیم یا از همدیگه تشخیصشون بدیم.
2.آیا راهی هست که بشه تشخیص داد یک کنترل دینامیکی ساخته شده یا استاتیک
متشکرم

مهدی کرامتی
جمعه 01 آبان 1383, 12:35 عصر
1- اگر یک نام در مشخصه Name به اونها تخصیص بدید بعدا میتونید با استفاده از این نام به اونها مراجعه کنید.

2- فرقی با هم ندارند که بتوان آنها را از هم تمایز داد. مگر اینکه رد ایجاد آنها را در یک لیست نگهداری کنید تا بدانید کدامیک را شما ایجاد کرده اید.

MiRHaDi
شنبه 02 آبان 1383, 18:17 عصر
سلام
براشون Tag بذار بعدا Component ها رو لیست کن و دکمه ها با تگ خودت مثلا 156324 رو بدون خودت ساختی
بای

BOB
یک شنبه 03 آبان 1383, 15:05 عصر
سلام و متشکرم که جواب دادید . من نمیخواهم اشیا دینامیک را به متغیرهای آبجکت نسبت بدهم . مثلا در مثال زیر من برای هر تغییری روی دکمه ای که ساخته میشه باید از متغیر X استفاده کنم.

var x:TButton;
------------------------
x:=tbutton.Create(self);
with x do
begin
Parent:=form1;
name:='button1';
end;
اگر بدون متغیر این کار رو انجام بدم نمیشه مثلا

with tbutton.Create(self) do
begin
Parent:=form1;
name:='button1';
end;
و از این اسم که به دکمه داده شده هیچ استفاده ای نمیشود کرد چون در زمان اجرا ساخته میشود .
1.حالا لطفا راهنمایی کنید ؟؟
2.برای وقتی که اشیا زیادی دینامیکی ساخته شده اند .. آیا راهی هست که حافظه همه آنها را یکدفعه آزاد کرد؟ (بدون متغیر)

MiRHaDi
یک شنبه 03 آبان 1383, 18:35 عصر
سلام
اولا که میشه از اسم اونا استفاده کرد وقتی داینامیک باشه !
دوما میتونی x رو 100 مرتبه برای 100 تا دکمه با کیریت مساوی کنی و هر دفعه یک جدید بسازی
سوما راهی که بهت گفتم میتونی همه کامپوننت هارو دسترسی داشته باشی حتی بی اسم
چهارما !‌میخوای مین روب بنویسی؟
بای

vcldeveloper
دوشنبه 04 آبان 1383, 03:14 صبح
از TComponentList هم میتونی استفاده کنی.

مهدی کرامتی
دوشنبه 04 آبان 1383, 04:32 صبح
.برای وقتی که اشیا زیادی دینامیکی ساخته شده اند .. آیا راهی هست که حافظه همه آنها را یکدفعه آزاد کرد؟ (بدون متغیر)
بعنوان پارامتر دستور Create نام فرم والد یا Application رو پاس کن:

with tbutton.Create(Form1) do
در اینصورت هنگام بسته شدن فرم و تخریب آن همه این کامپوننتها نیز تخریب و حافظه مورد استفاده شان آزاد میشود.

with tbutton.Create(Application) do
در اینصورت هنگام بسته شدن Application و تخریب آن همه این کامپوننتها نیز تخریب و حافظه مورد استفاده شان آزاد میشود.

اطلاعات بیشتر: http://www.barnamenevis.org/forum/viewtopic.php?t=9015

MSK
دوشنبه 04 آبان 1383, 15:22 عصر
سوالی که من دارم اینه که آیا از pointer هم میشه استفاده کرد.

یعنی مثلا آدرس هر یک از آنها را در جای دیگری زخیره کنیم وبعدا به متغیر مشابهی این آدرس رو بدیم.یعنی یه همچی چیزی:


a:^tbutton;
.
.
.
{aرا برابر یکی از این کلاس های دینامیکی قرار دهیم}
a^.caption:='hello';

اگه همچین کاری میشه کرد ممنون میشم یه مثال بزنید. :(

Sepidar
دوشنبه 04 آبان 1383, 17:15 عصر
در واقع هر متغیر از جنس کلاس یه پویینتره. بنابر این در دلفی همیشه کلاسها روی هیپ ساخته میشن. تنها فرقی که میکنه اینه که وقتی متغیر کلاس در برنامه به صورت سراسری تعریف بشه، فضای خود پویینتر (و نه کلاس) روی سگمنت دیتا تخصیص داده میشه. در اکثر مواقع غیر این حالت متغیر کلاس روی پشته تعریف میشه.

بنابراین در کد زیر:

var
a,b:TAnObject;
begin
a:=TanObject.Create;
b:=a;
a.SomeMethode;
b.SomeMethode;
end;در واقع کلاس جدیدی به وجود نمی آید. و خطوط 6 و 7 برنامه هیچ فرقی با هم ندارند.

MiRHaDi
پنج شنبه 07 آبان 1383, 01:24 صبح
سلام
میتونی یک آرایه از TButton تعریف کنی و یکی یکی Create کنی ! اینجوری همش در دسترسه
بای

MSK
شنبه 09 آبان 1383, 23:17 عصر
کسی جواب منو نداد.

سوال من در استفاده مستقیم از آدرس یه کلاسه.

حالا آدرس های مختلف رو توی یه بافر میشه ذخیره کرد و در واقع به متغیر از نوع اون کلاس داری چون هر وقت بخواهی از یه عضو دیگه استفاده کنی آدرس رو بازیابی می کنی و ازش استفاده می کنی. :گیج:

MiRHaDi
دوشنبه 11 آبان 1383, 02:51 صبح
سلام
آدرس رو نمیخواد بازیابی کنی !
کافیه بگی :

for k := 1 to n do
buttons[k].caption := 'MiRHaDi'+inttostr(k);
همین
بای