Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Labels dynamisch erzeugen...merkwürdiges Verhalten (https://www.delphipraxis.net/178644-labels-dynamisch-erzeugen-merkwuerdiges-verhalten.html)

Codix32 19. Jan 2014 12:23

Labels dynamisch erzeugen...merkwürdiges Verhalten
 
Woran es wohl liegt?

Ich möchte ein Panel während der Laufzeit erzeugen und kriege die Merldung:
Delphi-Quellcode:
  public
    { Public-Deklarationen }
    procedure erzeugePanel(Lft,tp,wdth,hght:integer);
    procedure erzeugeLabels(MDatum:TDatetime);
    function LblFeiertag(LTag,LMonat:byte;LArray:THolidayTable):string;
//...
implementation
//...
procedure TForm1.erzeugePanel(Lft,tp,wdth,hght:integer);
begin
Panel1:=TPanel.Create(Form1);
Panel1.Parent:=Form1;
Panel1.visible:=true;
Panel1.Left:= Lft;
Panel1.top:=tp;
Panel1.width:=wdth;
Panel1.height:=hght;
end;
[Fehler] Unit1.pas(65): E2003 Undefinierter Bezeichner: 'Panel1'

Setze ich aber eine Komponente TPanel auf das Formular, dann wird auch die Prozedur 'erzeugePanel' ausgeführt.

Dasselbe bei einem Array aus Labeln:
Delphi-Quellcode:
{global}
var
  Labels: array of TLabel;   // <- unbekannter Bezeichner ???
//....

procedure TForm1.erzeugeLabels(MDatum:TDatetime);
var
index,                   // Zeilenzähler
Reihe:integer;           // Spaltenzähler
index2,FTmp:integer;
tg: byte;
begin
//...
tg:= TageInMonat(MDatum);
SetLength(Labels,tg+1);
FTmp:=TagNummer(MDatum);
index2 := 1; Reihe:=0;
  for index:=1 to tg do
   begin
     Labels[index]:=TLabel.Create(Panel1);
     If ((Labels[index].top+Labels[index].height)*index2 + 100) >= Panel1.ClientHeight then
       begin
        inc(Reihe); index2:=1;
         Labels[index].left:=60*Reihe;
         Labels[index].Top:= 1+(index2*20);
       end;
     Labels[index].Parent:= Panel1;
     Labels[index].Top := 1+(index2*20);
     Labels[index].Left := 60+(150*Reihe);
     Labels[index].Height:= 20;
     Labels[index].Width:=140;
     Labels[index].AutoSize := false;
     Labels[index].Font.Size := 10;
     Labels[index].name:='Labels'+inttostr(index);
     Labels[index].Caption:= inttostr(index)+' '+NamendesTages(ArrIdxalsTagDatum(index,MonthOf(Now),YearOf(Now)));
     Labels[index].Alignment := taLeftjustify;
     Labels[index].Cursor:=crHandPoint;
     Labels[index].Font.color:=clmaroon;
     Labels[index].color:= clmoneygreen;
     if (NamendesTages(ArrIdxalsTagDatum(index,MonthOf(Now),YearOf(Now))) = 'Samstag') or
        (NamendesTages(ArrIdxalsTagDatum(index,MonthOf(Now),YearOf(Now))) = 'Sonntag') then Labels[index].Color:= clskyblue;
     if (MonthOf(MDatum)= MonthOf(Now))and (FTmp=index)then Labels[index].Color:= clred;
     if LblFeiertag(index, monthOf(MDatum), FTArray)<>'' then
     begin
     Labels[index].caption:= LblFeiertag(index,monthOf(MDatum), FTArray);
     Labels[index].Color:= clyellow;
     end;
     Labels[index].Tag:= index;
     Labels[index].OnClick := ClickEvent;       //<-ClickEreignis zuweisen !!!
   inc(index2);
   end;
  end;
Auch hier muss mindestens ein Label auf das Formular gezogen werden, damit bei ' var Labels: Array of TLabel' das 'TLabel' nicht unbekannt ist.
Da stimmt doch was nicht, oder?

Zacherl 19. Jan 2014 12:41

AW: Labels dynamisch erzeugen...merkwürdiges Verhalten
 
Beim obigen Code fehlt dir einfach eine lokale Variable "Panel1: TPanel". Beim unteren Code fehlte dir wohl die Unit, in der TLabel deklariert ist in der uses Klausel.

Dein Code ist aber auch an weiteren Stellen von der Logik her fehlerhaft. Ich wage zu bezweifeln, dass die die Labels IMMER auf Panel1 erzeugen willst. Ansonsten würde das dynamische Erstellen nämlich wenig Sinn machen.

Codix32 19. Jan 2014 13:01

AW: Labels dynamisch erzeugen...merkwürdiges Verhalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Zacherl (Beitrag 1244325)
Beim obigen Code fehlt dir einfach eine lokale Variable "Panel1: TPanel". Beim unteren Code fehlte dir wohl die Unit, in der TLabel deklariert ist in der uses Klausel.

Dein Code ist aber auch an weiteren Stellen von der Logik her fehlerhaft. Ich wage zu bezweifeln, dass die die Labels IMMER auf Panel1 erzeugen willst. Ansonsten würde das dynamische Erstellen nämlich wenig Sinn machen.

Danke Zacherl,

ich habe tatsächlich vergessen die Variable für das Panel zu erstellen.

Die Labels sind deshalb dynamisch, weil sie die Tage des jeweils aktuellen Monats darstellen sollen.
Das sind dann mal 28, 29, 30 oder 31 Labels, je nach Monat halt.

Sieht noch nicht schön aus, erfüllt aber soweit seinen Zweck.

Leider hast Du recht, was die Logik betrifft. Mein Programm Code erschreckt sicherlich den gelernten Programmierer und entwickelt sich zum unübersichtlichen Spaghetti Code.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 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