![]() |
Dynamisch erstellte Labels neu zeichnen...
Hallo,
:oops: ich bins mal wieder. Ein Proggi erstellt beim Createn soviel Labels, wie der aktuelle Monat Tage hat. Ähnlich, wie bei einem Kalender werden die Samstage und Sonntage in anderer Farbe angezeigt. Nun aber möchte ich über einen Buttonklick einen anderen Monat eingeben und diesen wieder über die Labels angezeigt bekommen. Wie mache ich das, die Labels müssen doch neu erzeugt werden und die alten gelöscht, oder? Wenn ich meine Proc 'erzeugeLabels' im Buttonclick habe, kriege ich die Meldung: "Komponente Labels1 existiert bereits", weil ich die Procedure schon im OnCreate des Formulars aufgerufen habe. Also, es soll nicht nur neu gezeichnet, sondern die alten Labels weg und dann neu erstellt werden. Hoffentlich versteht jemand mein Kauderwelsch (*sichmalimvornhereinentschuldigtsmilie*) |
Re: Dynamisch erstellte Labels neu zeichnen...
Am Besten erstellst du einen Panle auf dem du die Labels erzeugst und das du als Owner setzt. Dann reicht es dieses Freizugeben und neu erstellen zu lassen.
|
Re: Dynamisch erstellte Labels neu zeichnen...
Zitat:
auf das Formular zu ziehen und dann diesen zu machen?:
Delphi-Quellcode:
with Panels1 do //<- Geht das so? begin tage:=DaysInMonth; SetLength(Labels,tg+1); for index:=1 to tage do begin Labels[index]:=TLabel.Create(self); If ((Labels[index].top+Labels[index].height)*index2+150) >= Form1.ClientHeight then begin inc(Reihe); index2:=1; Labels[index].left:=150*Reihe; Labels[index].Top:= 10+(index2*20); end; Labels[index].Top := 10+(index2*20); Labels[index].Parent:= Form1; //<- Panel1 Labels[index].AutoSize := false; Labels[index].Font.Size := 10; ...... ...... end; |
Re: Dynamisch erstellte Labels neu zeichnen...
Am Besten dynamisch. Aber:
Delphi-Quellcode:
Auf einen Namen kannst du übrigens verzichten
Labels[index]:=TLabel.Create( Panel);
Labels[index].Parent:= Panel; |
Re: Dynamisch erstellte Labels neu zeichnen...
Du weißt das Dynamisce Arrays mit 0 anfangen?
Schau dir mal mod und div vllt für die Platzierung der Label an, dann reicht eine Schleifenvariable. |
Re: Dynamisch erstellte Labels neu zeichnen...
Zitat:
Bis dann :-D |
Re: Dynamisch erstellte Labels neu zeichnen...
Zitat:
mKinzler, die Labels sind jetzt auf dem Panel erzeugt, nochmals Danke. Und nun braucht MeinerEiner, der immer noch ein Greenhorn ist, einen Tip,wie man die auf dem Panel erstellten Labels über einen Buttonklick neu erstellt. Ich finde unter Panel kein onPaint oder onResize Ereignis, wie beim Formular und weiß auch nicht, wie das geht. |
Re: Dynamisch erstellte Labels neu zeichnen...
Delphi-Quellcode:
gibt dies und alle Unterkomponenten frei. danach kannst du dieses und die Labels neu erstellen
Panel.Free;
|
Re: Dynamisch erstellte Labels neu zeichnen...
Zitat:
Aber jetzt ist das Panel nicht mehr da, obwohl ich es neu gegreatet habe:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,idx, tg:Integer; MDate:TDatetime; begin Panel1.Free; Panel1:=TPanel.Create(Form1); MDate:=StrtoDate('25.06.2009'); Panel1.Free; Panel1:=TPanel.Create(Form1); ... ... erzeugeLabels; end; procedure TForm1.erzeugeLabels; var index, // Zeilenzähler Reihe:integer; // Spaltenzähler index2,FTmp, tg: integer; begin tg:=DaysInMonth; SetLength(Labels,tg+1); FTmp:=TagNummer(Now); index2 := 1; Reihe:=0; for index:=1 to tg do begin Labels[index]:=TLabel.Create(Panel1); If ((Labels[index].top+Labels[index].height)*index2+150) >= Form1.ClientHeight then begin inc(Reihe); index2:=1; Labels[index].left:=150*Reihe; Labels[index].Top:= 10+(index2*20); end; Labels[index].Top := 10+(index2*20); Labels[index].Parent:= Panel1; Labels[index].AutoSize := false; Labels[index].Font.Size := 10; Labels[index].Left := 240+(150*Reihe); Labels[index].Height:= 20; Labels[index].Width:=140; Labels[index].name:='Labels'+inttostr(index); Labels[index].Caption:= inttostr(TagArray[index-1].TNum)+' '+TagArray[index-1].TgName; Labels[index].Alignment := taLeftjustify; Labels[index].Cursor:=crHandPoint; Labels[index].Font.color:=clmaroon; Labels[index].color:= clmoneygreen; if (TagArray[index-1].TgName = 'Samstag') or (TagArray[index-1].TGName='Sonntag')then Labels[index].Color:= clskyblue; if FTmp=index then Labels[index].Color:= clred; Labels[index].Tag:= index-1; // Labels[index].OnClick := ClickEvent; //<-ClickEreignis zuweisen !!! inc(index2); end; end; |
Re: Dynamisch erstellte Labels neu zeichnen...
Ok, ich habs fast
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var i,idx, tg:Integer; MDate:TDatetime; begin Panel1.Free; Panel1:=TPanel.Create(Form1); Panel1.Parent:=Form1; Panel1.Left:= 8; Panel1.top:=24; Panel1.width:=649; Panel1.height:=345; ... ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz