AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisch erstellte Labels neu zeichnen...

Ein Thema von Codix32 · begonnen am 18. Jul 2009 · letzter Beitrag vom 19. Jul 2009
Antwort Antwort
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#1

Dynamisch erstellte Labels neu zeichnen...

  Alt 18. Jul 2009, 21:28
Hallo,

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*)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 18. Jul 2009, 21:30
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 18. Jul 2009, 22:07
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;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 18. Jul 2009, 22:12
Am Besten dynamisch. Aber:
Delphi-Quellcode:
Labels[index]:=TLabel.Create( Panel);
Labels[index].Parent:= Panel;
Auf einen Namen kannst du übrigens verzichten
Markus Kinzler
  Mit Zitat antworten Zitat
Draos

Registriert seit: 12. Aug 2008
42 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 18. Jul 2009, 22:15
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.
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 18. Jul 2009, 23:15
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
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#7

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 19. Jul 2009, 19:07
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 19. Jul 2009, 19:16
Panel.Free; gibt dies und alle Unterkomponenten frei. danach kannst du dieses und die Labels neu erstellen
Markus Kinzler
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 19. Jul 2009, 20:39
Zitat von mkinzler:
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. 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;
  Mit Zitat antworten Zitat
Codix32

Registriert seit: 23. Apr 2009
137 Beiträge
 
Delphi 2005 Personal
 
#10

Re: Dynamisch erstellte Labels neu zeichnen...

  Alt 19. Jul 2009, 21:25
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;
...
...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:11 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