PDA

View Full Version : تغییر همزمان یک خاصیت چندین Label



hesamy2004
یک شنبه 13 خرداد 1386, 23:22 عصر
سلام دوستان من به یک مشکل در دلفی دارم و از شما راهنمایی میخواهم.
فرض کنید در یک صفحه فرم یک باتون و 100 تا لیبل داریم. اسامی لیبل ها هم Label1 تا Label100 هست. میخواهم با کلیکی که بر روی باتون میکنم رنگ Caption همه همزمان فرضاً به رنگ سبز تبدیل شود. یک راهش که کاره مسخره ایه اینه که در قسمت کد دکمه باتون 100 بار بنویسیم :
Label1.font.color:=clGreen
Label2.font.color:=clGreen
.
.
.
Label100.font.color:=clGreen

ولی من دنباله یه راه عاقلانه تر میگردم تا مثلاً در یک حلقه For و در چند خط بتونم این کارو انجام دهم.
اگه کسی این راه رو بلده، لطف کنه و به من هم یاد بده.
با تشکر

SoftDevCo
دوشنبه 14 خرداد 1386, 00:02 صبح
از GeExpert استفاده کن رایگان هست و OpenSource ا.
http://www.gexperts.org/download.html

خیلی امکانات دیگه هم داره.

SoftDevCo
دوشنبه 14 خرداد 1386, 00:07 صبح
از طریق کد نویسی هم به این صورت عمل کن:




Try
For C:=1 to 100 Do
if Assigned(Form1.FindComponent('Label'+IntToStr(C))) then
(Form1.FindComponent('Label'+IntToStr(C)) as TLabel).Color:=ClGreen;
Except
End;

SYNDROME
دوشنبه 14 خرداد 1386, 04:55 صبح
با سلام

از طریق کد نویسی هم به این صورت عمل کن:




Try
For C:=1 to 100 Do
if Assigned(Form1.FindComponent('Label'+IntToStr(C))) then
(Form1.FindComponent('Label'+IntToStr(C)) as TLabel).Color:=ClGreen;
Except
End;


سورس جالبی بود ولی فقط یک مشکل دارد.
اگر نا Lable ها به صورت Label_Name , Label_Family , باشد دیگر کار نمی کند.

MNosouhi
دوشنبه 14 خرداد 1386, 09:22 صبح
این اصولی تره :


procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
For i:=1 to ComponentCount Do
begin
if (Components[i-1] is TLabel) then
with Components[i-1] as TLabel do
Color:=clred;
end;
end;

SoftDevCo
دوشنبه 14 خرداد 1386, 11:37 صبح
با سلام

سورس جالبی بود ولی فقط یک مشکل دارد.
اگر نا Lable ها به صورت Label_Name , Label_Family , باشد دیگر کار نمی کند.
دوست عزیز چون در مثالتون نام ها به این صورت بودن این کد رو گفتم و گرنه کد بالا خیلی جامع تره !

Arman_1367
دوشنبه 14 خرداد 1386, 13:22 عصر
همانطور که می دانید کلاس والد همه ی اشیائی که دیده می شوند TControl است و کلاس پایه اشیائ مرئی و کنترل ها کمپاننت هست پس برای اینکه اجرا کمپاننت که غیر قابل دیدن هستند چک نشوند بهتره از این روش استفاده بشه:

For I:=0 to Form1.ControlsCount-1 do
If Form1.Controls[i] is TLabel then
TLabel(Form1.controls[i]).Color:=ClGreen;

Hamid_PaK
جمعه 18 خرداد 1386, 04:18 صبح
در این گونه موارد از خاصیت زیر مجموعه ای بهتر می توان استفاده کرد.
همه Labelهایی که قصد تغییر همزمان آنها را دارید را در یک GroupBox و یا Panel و یا اشیایی همانند اینها بریزید و از خصوصیت Components اون شی بصورت یک حلقه و یافتن کلاس مورد نظر استفاده کنید ، که دوستان توضیح دادن ...

نقل قول MNosouhi


procedure TForm1.SetSomeProperties(Owner: TObject);
var i:integer;
begin
with Owner do
For i:=0 to ComponentCount -1 Do
begin
if (Components[ i ] is TLabel) then
with Components[ i ] as TLabel do begin
Color:=clred;
end;
{// یا
with TLabel( Components[ i ] ) do begin
Color:=clred;
end; //}
end;
end;


یا حق ...

SoftDevCo
جمعه 18 خرداد 1386, 10:08 صبح
از طریق کد نویسی هم به این صورت عمل کن:




Try
For C:=1 to 100 Do
if Assigned(Form1.FindComponent('Label'+IntToStr(C))) then
(Form1.FindComponent('Label'+IntToStr(C)) as TLabel).Color:=ClGreen;
Except
End;


این مثال برای تغییر تعدادی کنترل با نام خاص هست.