Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Label zur Laufzeiter erstellen-nicht angezeigt auf Groupbox (https://www.delphipraxis.net/81797-label-zur-laufzeiter-erstellen-nicht-angezeigt-auf-groupbox.html)

Susanne 4. Dez 2006 10:21


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?

mkinzler 4. Dez 2006 10:25

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?

Susanne 4. Dez 2006 11:16

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;

mkinzler 4. Dez 2006 11:24

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:
function TForm2.GetLabelParent( var i_GbX, i_GbY, i_GbH, i_GbB : Integer ): TObject;
ersetzen.
Und die Koordinaten vor der Erzeugung berechnen.

Susanne 4. Dez 2006 11:52

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
 
das hab ich jetzt nicht wirklich verstanden?!?

mkinzler 4. Dez 2006 11:57

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.

Susanne 4. Dez 2006 12:12

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;

marabu 4. Dez 2006 13:19

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group
 
Hallo Susanne,

ein paar Anmerkungen zu deinem folgenden Code-Fragment:

Delphi-Quellcode:
// ...
      // 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;
Grüße vom marabu


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