![]() |
Label zur Laufzeiter erstellen-nicht angezeigt auf Groupbox
hallo,
also folgendes Problem: Ich erstelle Groupboxen zur Laufzeit und anschliessend auch Labels. Diese können entweder sich direkt auf der Form befinden oder sie befinden sich in einer der Groupboxen, was anhand von den Koordinaten (kommen aus IniDatei) eines Labels geschieht. Wenn diese sich innerhalb der Koordinaten der Groupbox befinden, dann gehören sie auf die groupbox. Problem ist nun, dass die Labels nicht angezeigt werden. Hab es ausprobiert und die Groupbox nicht anzeigen lassen, dann sind die Labels zu sehen. Ich vermute mal, das dass daran liegen könnte, dass ich die zuerst auf der Form erzeuge mit TLabel.Create(Self); Kann ich nicht irgendwie später sagen, wer Parent ist? Denn das nachträgliche lb_Temp.Parent := Groupbox1; scheint ja nichts zu bringen. Ich erstelle ebenfalls auch EditFelder so und ordne später zu, ob die auf die Groupbox gehören, also wer parent ist, das funktioniert. Warum also nicht auch bei labels? Irgendjemand eine Idee, wie sich das Problem lösen lässt? |
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
Hast du ein Neuzeichnen nach Änderung des parents angestoßen? Warum erstellst du das Label nicht gleich mit dem richtigen Pranet?
|
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
repaint hilft auch nicht.
In FormCreate erzeuge ich die Labels
Delphi-Quellcode:
SetLength(a_Lbl,i_LblCnt);
for i := low(a_Lbl) to high(a_Lbl) do begin a_Lbl[i] := TLabel.Create(Self); a_Lbl[i].Font.Size:= 10; a_Lbl[i].Parent := Form2; a_Lbl[i].Caption := IniFile.ReadString(sl_Lbl[i],'label text',''); a_Lbl[i].Left := IniFile.ReadInteger(sl_Lbl[i],'x',8); a_Lbl[i].Top := IniFile.ReadInteger(sl_Lbl[i],'y',8); //hier rufe ich die Funktion auf und setze das Parent CheckAndSetLabelParent(a_Lbl[i],a_Gbx); end; In der Funktion setze ich das PArent
Delphi-Quellcode:
procedure TForm2.CheckAndSetLabelParent(var lb_Temp : TLabel; a_GbxTemp : GbxArray);
var i_GbX : Integer; i_GbY : Integer; i_GbH : Integer; i_GbB : Integer; x : Integer; y : Integer; i : Integer; begin //alle vorhandenen Groupboxen durch gehen for i := low(a_GbxTemp) to high(a_GbxTemp) do begin i_GbX := a_GbxTemp[i].Left; i_GbY := a_GbxTemp[i].Top; i_GbH := a_GbxTemp[i].height + i_GbY; i_GbB := a_GbxTemp[i].width + i_GbX; //prüfen, in welche groupbox das Label gehört if (lb_Temp.Left >= i_GbX) and (lb_Temp.Left<= i_GbB) and (lb_Temp.Top >= i_GbY) and (lb_Temp.Top<= i_GbH) then begin lb_Temp.Left := lb_Temp.Left - a_GbxTemp[i].Left; lb_Temp.Top := lb_Temp.Top - a_GbxTemp[i].Top; lb_Temp.Parent := a_GbxTemp[i]; lb_Temp.BringToFront; end else lb_Temp.Parent := Form2; end; end; |
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
Auf welche Klasse hast du .Repaint angewendet?
Ich würde die Methode .CheckAndSetLabelParent durch solche
Delphi-Quellcode:
ersetzen.
function TForm2.GetLabelParent( var i_GbX, i_GbY, i_GbH, i_GbB : Integer ): TObject;
Und die Koordinaten vor der Erzeugung berechnen. |
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
das hab ich jetzt nicht wirklich verstanden?!?
|
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
Du erzeugst die Labels zuerst und setzt dann anschließend den richtigen Parent, die richtigen Positionen. Ich würde erst den Parent suchen, die Positionen berechnen und dann die Komponenten mit den richtigen Werten erzeugen.
|
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
Ich hab es nun so versucht - funktioniert aber auch nicht
Delphi-Quellcode:
SetLength(a_Lbl,i_LblCnt);
for i := low(a_Lbl) to high(a_Lbl) do begin for iii := low(a_Gbx) to high(a_Gbx) do begin i_GbX := a_Gbx[iii].Left; i_GbY := a_Gbx[iii].Top; i_GbH := a_Gbx[iii].height + i_GbY; i_GbB := a_Gbx[iii].width + i_GbX; left:= IniFile.ReadInteger(sl_Lbl[i],'x',8); top:= IniFile.ReadInteger(sl_Lbl[i],'y',8); if (Left >= i_GbX) and (Left<= i_GbB) and (Top >= i_GbY) and (Top<= i_GbH) then begin a_Lbl[i] := TLabel.Create(a_Gbx [iii]); a_Lbl[i].Font.Size:= 10; a_Lbl[i].Left := Left a_Lbl[i].Top := Top ; a_Lbl[i].BringToFront; break; end else begin a_Lbl[i] := TLabel.Create(Form2); a_Lbl[i].Font.Size:= 10; end; end; a_Lbl[i].Left := IniFile.ReadInteger(sl_Lbl[i],'x',8); a_Lbl[i].Top := IniFile.ReadInteger(sl_Lbl[i],'y',8); a_Lbl[i].Width := IniFile.ReadInteger(sl_Lbl[i],'cx',8); a_Lbl[i].Height := IniFile.ReadInteger(sl_Lbl[i],'cy',8); end; end; |
Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
Hallo Susanne,
ein paar Anmerkungen zu deinem folgenden Code-Fragment:
Delphi-Quellcode:
Grüße vom marabu
// ...
// if PtInRect(a_Gbx[iii].BoundsRect, Point(Left, Top)) then // oder zumindest: ... (Left <= i_GbX + i_GbB) ... etc. if (Left >= i_GbX) and (Left<= i_GbB) and (Top >= i_GbY) and (Top<= i_GbH) then begin // GroupBox nur dann als Owner von Label festlegen, wenn Label // vom Destruktor der GroupBox zerstört werden soll. a_Lbl[i] := TLabel.Create(a_Gbx [iii]); // Parent muss immer gesetzt werden ... a_Lbl[i].Parent := a_Gbx[iii]; a_Lbl[i].Font.Size:= 10; a_Lbl[i].Left := Left a_Lbl[i].Top := Top ; a_Lbl[i].BringToFront; // Nix zu sehen, weil Caption fehlt ... break; end else begin a_Lbl[i] := TLabel.Create(Form2); a_Lbl[i].Font.Size:= 10; // Parent muss immer gesetzt werden ... a_Lbl[i].Parent := Form2; // hier besser: self end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:27 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