AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Label zur Laufzeiter erstellen-nicht angezeigt auf Groupbox
Thema durchsuchen
Ansicht
Themen-Optionen

Label zur Laufzeiter erstellen-nicht angezeigt auf Groupbox

Ein Thema von Susanne · begonnen am 4. Dez 2006 · letzter Beitrag vom 4. Dez 2006
Antwort Antwort
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#1

Label zur Laufzeiter erstellen-nicht angezeigt auf Groupbox

  Alt 4. Dez 2006, 10:21
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?
Susanne
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 10:25
Hast du ein Neuzeichnen nach Änderung des parents angestoßen? Warum erstellst du das Label nicht gleich mit dem richtigen Pranet?
Markus Kinzler
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 11:16
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;
Susanne
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 11:24
Auf welche Klasse hast du .Repaint angewendet?
Ich würde die Methode .CheckAndSetLabelParent durch solche
function TForm2.GetLabelParent( var i_GbX, i_GbY, i_GbH, i_GbB : Integer ): TObject; ersetzen.
Und die Koordinaten vor der Erzeugung berechnen.
Markus Kinzler
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 11:52
das hab ich jetzt nicht wirklich verstanden?!?
Susanne
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 11:57
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Susanne

Registriert seit: 21. Mai 2004
Ort: Lage
232 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 12:12
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;
Susanne
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Label zur Laufzeiter erstellen-nicht angezeigt auf Group

  Alt 4. Dez 2006, 13:19
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
  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 16:00 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