PDA

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



1072300
سه شنبه 22 تیر 1389, 21:30 عصر
سلام همه
تعداد زیادی لیبل و یک باتوم بر روی فورم قرار دارد می خواهم با هر بار کلیک بر روی باتوم یکی از لیبل ها به ترتیب از لیبل یک تا آخرین لیبل رنگی شود با هر بار کلیک فقط یک لیبل
مثال :گیج:
بعد از اجرای برنامه برای اولین بار روی باتوم کلیک می کنم لیبل یک آبی می شود برای دومین بار کلیک می کنم لیبل دو هم آبی می شود برای سومین بار کلیک می کنم لیبل سه آبی می شود و .....
متشکرم:تشویق:

Pascal
سه شنبه 22 تیر 1389, 22:51 عصر
از يك ProgressBar استفاده كن . خصوصيت حداقل = 0 حداكثر = تعداد ليبل ها
در رويداد Button بنويس



ProgressBar1.Position := ProgressBar1.Position +1;
case ProgressBar1.Position of
1: Label1.Font.Color :=clblue;
2: Label2.Font.Color :=clblue;
3: Label3.Font.Color :=clblue;
4: Label4.Font.Color :=clblue;
5: Label5.Font.Color :=clblue;


اين كد براي 5 عدد ليبل است .

حمیدرضاصادقیان
چهارشنبه 23 تیر 1389, 00:03 صبح
سلام.روش بالا خوبه ولی اگر تعداد لیبل ها زیاد باشه کد نویسی زیاد میشه و قشنگ نیست.
من با استفاده از Tag خود label اینکارو کردم.با این روش هرچه قدر هم تعداد label های شما هم زیاد باشه مجبور به تغییر کدتون نیستید.
موفق باشید

1072300
چهارشنبه 23 تیر 1389, 21:47 عصر
متشکرم از راهنمایی شما
اما متاسفانه نمی توانم از Tag لیبل استفاده کنم چون صد و هفتاد لیبی که در برنامه قرار دارد را به نه دسته تقسیم کرده ام که هر دسته عمل خاصی را انجام می دهد و برای این تقسیم بندی از Tag لیبل استفاده کرده ام لطفا را حل دیگری بفرمایید.:خجالت::عصبانی++:
یک نکته دیگر
اگر امکان دارد زمانی که لیبل بعدی رنگی می شود لیبل قبلی به رنگ اولیه باز گردد :خجالت:
متشکرم:تشویق::خجالت:

مصطفی ساتکی
چهارشنبه 23 تیر 1389, 22:47 عصر
مي تونيد از نام label بعلاوه يه Index توسط تابع FindComponrntاستفاده كنيد يا از خصوصيت Components مربوط به فرم استفاده كنيد

1072300
پنج شنبه 24 تیر 1389, 00:11 صبح
اگر ممکن است یک نمونه مثال بزنید :خجالت:
متشکرم:تشویق::گیج::خجالت:

حمیدرضاصادقیان
پنج شنبه 24 تیر 1389, 09:06 صبح
سلام.همون کدی که براتون نوشتم رو با روشی که در پست 5 ذکر شد ترکیب کنید تا به خواستتون برسید.

1072300
جمعه 25 تیر 1389, 01:25 صبح
کسی میتونه روش پست3 را با پست 5 ترکیب کنه.
متشکرم

SAASTN
جمعه 25 تیر 1389, 19:01 عصر
اما متاسفانه نمی توانم از Tag لیبل استفاده کنم چون صد و هفتاد لیبی که در برنامه قرار دارد را به نه دسته تقسیم کرده ام که هر دسته عمل خاصی را انجام می دهد و برای این تقسیم بندی از Tag لیبل استفاده کرده ام لطفا را حل دیگری بفرمایید.
می تونید شماره بندی Tagها رو به نحوی تغییر بدید که هر دو مفهوم رو داشته باشند مثلا 0-99 دسته اول، 100-199 دسته دو و ...

کسی میتونه روش پست3 را با پست 5 ترکیب کنه.
مشکل کجاست؟

1072300
جمعه 25 تیر 1389, 22:32 عصر
سلام
170 لیبل در برنامه ام وجود دارد که به ده دسته تقسیم می شود که هر دسته عمل خاصی را انجام می دهند و این اعمال به توسط tag لبیل شناخته شده و انجام می شود

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

متشکرم:تشویق:

SAASTN
جمعه 25 تیر 1389, 22:59 عصر
متوجه هستم، مشکلتون در ترکیب پست 3 و 5 چیه؟
ضمنا شما که این همه کنترل داری، و احتمالا همشون هم یه شباهت سیستماتیک به هم دارن بهتره کنترلهات رو با کد ایجاد کنی و در لحظه ایجاد به یه TList اضافشون کنی که همه مشکلاتت حل بشه.

1072300
شنبه 26 تیر 1389, 22:54 عصر
مشکل در ترکیب این دو پست است چون اصلا آشنایی با تابع ذکر شده در پست ندارم اگر ممکن است این دو پست را به گونه ای که تمام احتیاجات برنامه ام را در بگیرد ادغام کنید :خجالت::خجالت::عصبانی::عصبان ++::افسرده:
متشکرم:تشویق::تشویق::تشویق:: شویق:

1072300
چهارشنبه 30 تیر 1389, 21:50 عصر
سلام یکی نیست جواب بده ؟
اگه می تونید کمک کنید.

bootshow
شنبه 02 مرداد 1389, 16:30 عصر
راه های عجیب قریب دیگه ای هم هست .آسونترین راه همینه
procedure TForm1.Button1Click(Sender: TObject);
begin
Inc(CurrentlblNumber);
if CurrentLbl<>nil then
CurrentLbl.Color:=clBtnFace;
CurrentLbl:=FindComponent('label'+IntToStr(Current lblNumber) ) as TLabel;
if CurrentLbl=nil then
CurrentlblNumber:=0
else CurrentLbl.Color:=clRed;
end;
http://rapidshare.com/files/408786978/ColoredLable.rar

1072300
شنبه 02 مرداد 1389, 23:22 عصر
سلام
متشکرم از پاسخ شما :تشویق::تشویق:
فقط یک سوال دیگر :خجالت:
اگر بخواهیم با کلید دیگری به لیبل قبلی برویم این سورس چگونه تغییر می کند؟
باز هم از کمک شما سپاسگزارم.:تشویق::تشویق::تشو یق:

SAASTN
شنبه 02 مرداد 1389, 23:35 عصر
ضمنا شما که این همه کنترل داری، و احتمالا همشون هم یه شباهت سیستماتیک به هم دارن بهتره کنترلهات رو با کد ایجاد کنی و در لحظه ایجاد به یه TList اضافشون کنی که همه مشکلاتت حل بشه.
از اونجایی که این حدس رو رد نکردید با همین فرض یه نمونه نوشتم، ببین به دردت می خوره.
متاسفانه upload هنوز مشکل داره نتونستم پروژه رو بذارم. سه تا button روی فرم بذار و OnClick هاشون رو با اون متد های Nextو Previous و Clear ست کن.
TForm1 = class(TForm)
ButtonPreviousIndex: TButton;
ButtonNextIndex: TButton;
ButtonClear: TButton;

procedure FormCreate(Sender: TObject);
procedure ButtonNextIndexClick(Sender: TObject);
procedure ButtonPreviousIndexClick(Sender: TObject);
procedure ButtonClearClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
const
GroupsCount = 5;
GroupMembersCount = 10;
LabelsWidth = 100;
LabelsHeight = 20;
private
HighlightedLabel: TLabel;
AllLabels: TList;
Groups: array [0 .. GroupsCount - 1] of TList;
procedure HighlightLabel(const aLabel: TLabel);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ButtonClearClick(Sender: TObject);
begin
HighlightLabel(nil);
end;

procedure TForm1.ButtonNextIndexClick(Sender: TObject);
begin
if Assigned(HighlightedLabel) then
HighlightLabel(TLabel(AllLabels.Items[
(AllLabels.IndexOf(HighlightedLabel) + 1) mod
(GroupsCount * GroupMembersCount)]))
else
HighlightLabel(TLabel(AllLabels.First))
end;

procedure TForm1.ButtonPreviousIndexClick(Sender: TObject);
begin
if Assigned(HighlightedLabel) then
HighlightLabel(TLabel(AllLabels.Items[
(AllLabels.Count + AllLabels.IndexOf(HighlightedLabel) - 1) mod
(GroupsCount * GroupMembersCount)]))
else
HighlightLabel(TLabel(AllLabels.Last))
end;

procedure TForm1.FormCreate(Sender: TObject);
var
I: Integer;
J: Integer;
aLabel: TLabel;
begin
AllLabels := TList.Create;
for I := 0 to GroupsCount - 1 do
begin
Groups[I] := TList.Create;
for J := 0 to GroupMembersCount - 1 do
begin
aLabel := TLabel.Create(Self);
aLabel.Parent := Self;
aLabel.SetBounds(I * LabelsWidth, J * LabelsHeight, LabelsWidth,
LabelsHeight);
aLabel.Transparent := False;
aLabel.Caption := Format('Group: %d, Index: %d', [I + 1, J + 1]);
AllLabels.Add(aLabel);
Groups[I].Add(aLabel);
end;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := 0 to AllLabels.Count - 1 do
TLabel(AllLabels.Items[I]).Free;
end;

procedure TForm1.HighlightLabel(const aLabel: TLabel);
begin
if Assigned(HighlightedLabel) then
HighlightedLabel.Color := clBtnFace;
HighlightedLabel := aLabel;
if Assigned(HighlightedLabel) then
HighlightedLabel.Color := clSkyBlue;
end;

1072300
شنبه 02 مرداد 1389, 23:50 عصر
سلام دوست خوبم SAASTN
به دلایلی نمی توانم کنترلها رو با کد ایجاد کنم و در لحظه ایجاد به یه TList اضافشون کنم اما با این وجود از لطف و همکاری شما در بر طرف کردن مشکل بده سپاسگزارم.:خجالت::تشویق::تشو یق:

SAASTN
یک شنبه 03 مرداد 1389, 19:31 عصر
نمی دونم دلایلتون چیه ولی به نظر من وقتی با بیشتر از 7-8 کنترل هم شکل و هم رفتار طرف هستی حتما باید با کد ایجادشون کنی. 170 کنترل چیز کمی نیست، کوچکترین رفتاری که بخواد تو برنامه تغییر کنه حجم زیادی کار رو تحمیل می کنه. یا آدم رو مجبور می کنه بره سراغ کارای غیر اصولی، مثلا همون پردازش رشته روی اسم کنترل ها که من تصور نمی کنم خیلی کار درست و با ثباتی باشه و تازه مرتب کردن اسم اون همه کنترل رو هم به دنبال داره:عصبانی++:
در مورد اون سوالتون هم فقط توی خط اول Inc رو به Dec تبدیل کنید و اگه CurrentlblNumber صفر شد برابر بیشترین مقدار موجود قرارش بدین.