![]() |
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:
[Fehler] Unit1.pas(65): E2003 Undefinierter Bezeichner: 'Panel1'
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; 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:
Auch hier muss mindestens ein Label auf das Formular gezogen werden, damit bei ' var Labels: Array of TLabel' das 'TLabel' nicht unbekannt ist.
{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; Da stimmt doch was nicht, oder? |
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. |
AW: Labels dynamisch erzeugen...merkwürdiges Verhalten
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
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 13:18 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