Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Dynamisch erstellte Labels neu zeichnen... (https://www.delphipraxis.net/137326-dynamisch-erstellte-labels-neu-zeichnen.html)

Codix32 18. Jul 2009 20:28


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*)

mkinzler 18. Jul 2009 20:30

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.

Codix32 18. Jul 2009 21:07

Re: Dynamisch erstellte Labels neu zeichnen...
 
Zitat:

Zitat von mkinzler
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.

mKinzler, muß das Panel während der Laufzeit erzeugt werden, oder genügt es die Komponente einfach
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;

mkinzler 18. Jul 2009 21:12

Re: Dynamisch erstellte Labels neu zeichnen...
 
Am Besten dynamisch. Aber:
Delphi-Quellcode:
Labels[index]:=TLabel.Create( Panel);
Labels[index].Parent:= Panel;
Auf einen Namen kannst du übrigens verzichten

Draos 18. Jul 2009 21:15

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.

Codix32 18. Jul 2009 22:15

Re: Dynamisch erstellte Labels neu zeichnen...
 
Zitat:

Zitat von mkinzler
Am Besten dynamisch. Aber:
Delphi-Quellcode:
Labels[index]:=TLabel.Create( Panel);
Labels[index].Parent:= Panel;
Auf einen Namen kannst du übrigens verzichten

Vielen Dank, erstmal, mKinzler. Ich werde es morgen gleich probieren.

Bis dann :-D

Codix32 19. Jul 2009 18:07

Re: Dynamisch erstellte Labels neu zeichnen...
 
Zitat:

Zitat von Draos
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.

Danke für den Hinweis, Draos.


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.

mkinzler 19. Jul 2009 18:16

Re: Dynamisch erstellte Labels neu zeichnen...
 
Delphi-Quellcode:
Panel.Free;
gibt dies und alle Unterkomponenten frei. danach kannst du dieses und die Labels neu erstellen

Codix32 19. Jul 2009 19:39

Re: Dynamisch erstellte Labels neu zeichnen...
 
Zitat:

Zitat von mkinzler
Delphi-Quellcode:
Panel.Free;
gibt dies und alle Unterkomponenten frei. danach kannst du dieses und die Labels neu erstellen

Ach Gott, logo, ich habe gegreatet, also gebe ich das Ganze frei, wenn ichs nicht mehr brauche. :thumb: Danke

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;

Codix32 19. Jul 2009 20:25

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 09:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz