AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Komponenten während der Laufzeit erstellen und löschen

Komponenten während der Laufzeit erstellen und löschen

Ein Thema von Pytroxis · begonnen am 17. Apr 2019 · letzter Beitrag vom 23. Apr 2019
Antwort Antwort
Seite 1 von 2  1 2   
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#1

Komponenten während der Laufzeit erstellen und löschen

  Alt 17. Apr 2019, 20:35
Guten Tag,

ich erstelle während der Laufzeit Labels, der Code ist hierfür:
Delphi-Quellcode:
  procedure CreateLabel (Form:TForm; Text:string; X,Y:Integer);
  var
    Lab : TLabel;
  begin
    Lab := TLabel.Create(Form);
    Lab.Parent := Form;
    Lab.Caption := Text;
    Lab.Left := X;
    Lab.Top := Y;
  end;
Die Labels werden auf einem 2. Form erstellt.
Wie kann ich es am geschicktesten anstellen, dass die Label gelöscht werden, sobald Form2 geschlossen wird und neu erstellt werden, sobald Form2 wieder aufgerufen wird?
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.419 Beiträge
 
Delphi 5 Professional
 
#2

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 17. Apr 2019, 20:54
Solcherlei Erzeugung gehört ins OnCreate des Formulars, und dann kann/sollte die Zerstörung der Objekte im OnDestroy (oder OnClose) gemacht werden.

Andererseits setzt du den Owner des Labels bereits auf das Formular, und daher ist selbiges dafür zuständig, es wieder zu wegzuräumen, wenn das Formular zerstört wird.

Grüße
Dalai
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
1.453 Beiträge
 
#3

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 17. Apr 2019, 22:14
Notfalls in eine Liste speichern und diese im FormClose durchgehen und alle Labels entfernen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.603 Beiträge
 
Delphi XE4 Professional
 
#4

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 18. Apr 2019, 07:04
Hallo,
Zitat:
dass die Label gelöscht werden, sobald Form2 geschlossen wird
Da du als Owner das Form angegeben hast (Lab := TLabel.Create(Form)),
passiert das bereits im Destruktor des Forms.

siehe Dalai


Und zum Anlegen ist bereits alles gesagt.
Heiko
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
372 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 18. Apr 2019, 12:41
Guten Tag,

ich erstelle während der Laufzeit Labels, der Code ist hierfür:
Delphi-Quellcode:
  procedure CreateLabel (Form:TForm; Text:string; X,Y:Integer);
  var
    Lab : TLabel;
  begin
    Lab := TLabel.Create(Form);
    Lab.Parent := Form;
    Lab.Caption := Text;
    Lab.Left := X;
    Lab.Top := Y;
  end;
Die Labels werden auf einem 2. Form erstellt.
Wie kann ich es am geschicktesten anstellen, dass die Label gelöscht werden, sobald Form2 geschlossen wird und neu erstellt werden, sobald Form2 wieder aufgerufen wird?
Die Frage macht nur Sinn, wenn Du ein autocreated Form verwendest, das nach Benutzung nicht zerstört sondern nur versteckt wird (voreingestelltes Verhalten von TForm). Eigentlich sollte man nur das Mainform in der autocreate-Liste belassen und alle anderen Forms nach Bedarf erzeugen und auch konsequent wieder zerstören, wenn der Benutzer sie schließt. Naja, jedem Tierchen sein Pläsierchen

Deine Labels haben alle keine Namen, dadurch sind sie leicht zu identifizieren und von Labels zu unterscheiden, die im Designer erzeugt wurden. Du könntest Dir also eine weitere Hilfsfunktion schreiben, wie

Delphi-Quellcode:
  procedure ClearLabels (Form:TForm);
  var
    LComp: TComponent;
    I : integer;
  begin
    for I:= Form.ComponentCount -1 downto 0 do begin
      LComp := Form.Components[I];
      if (LComp is TLabel) and (LComp.Name = '') then
        LComp.Free;
    end;
  end;
Peter Below
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
7.603 Beiträge
 
Delphi XE4 Professional
 
#6

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 18. Apr 2019, 15:48
Hallo,
Zitat:
Deine Labels haben alle keine Namen
Das hakte ich für ein Gerücht:
Delphi selbst vergibt einen Namen, wenn keiner angegeben wird.
Heiko
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#7

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 18. Apr 2019, 22:11
Delphi-Quellcode:
  procedure ClearLabels (Form:TForm);
  var
    LComp: TComponent;
    I : integer;
  begin
    for I:= Form.ComponentCount -1 downto 0 do begin
      LComp := Form.Components[I];
      if (LComp is TLabel) and (LComp.Name = '') then
        LComp.Free;
    end;
  end;
So ähnlich habe ich es auch gelöst, werde aber morgen mal deinen Ansatz probieren, da mir dieser besser erscheint


Das Problem ist also, soweit gelöst, allerdings habe ich eine weitere Frage:
Ich arbeite mit der Funktion Canvas und den Labels.
Das Zeichnen lasse ich in OnPaint (+ Canvas.Refresh) und OnResize stattfinden (sofern es eine bessere Möglichkeit gibt, bin ich gerne offen für Vorschläge).
Scheinbar werden nun aber andauernd die Labels erstellt (sie flackern) und teilweise, sind die Labels an Positionen wo sie nicht sein sollten.
Gibt es eine effektive Methode um zu verhindern, dass ganz viele Labels übereinander, an der gleichen Position erstellt werden?


Delphi-Quellcode:
procedure TForm2.FormPaint(Sender: TObject);
begin
  zeichnen(self, 1);
  Canvas.Refresh;
end;

procedure TForm2.FormResize(Sender: TObject);
begin
  DestroyLabel;
  Button1.Left := Round(ClientWidth * 0.0482954545454545);
  Button1.Top := Round(ClientHeight * 0.8140589569160998);
  Button1.Width := Round(ClientWidth * 0.9034090909090909);

  Canvas.Brush.Color := clMenu;
  Canvas.FillRect(Rect(0,0, Width, Height));
  zeichnen(self, 1);
end;
Stehe momentan ziemlich auf dem Schlauch
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
372 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 19. Apr 2019, 09:39
Hallo,
Zitat:
Deine Labels haben alle keine Namen
Das hakte ich für ein Gerücht:
Delphi selbst vergibt einen Namen, wenn keiner angegeben wird.
Nicht bei Komponenten, die man im Kode erzeugt. Es ist der Designer, der Namen erzeugt, nicht der Compiler.
Peter Below
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
372 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 19. Apr 2019, 09:49
[QUOTE=Pytroxis;1430599]
[DELPHI]
Ich arbeite mit der Funktion Canvas und den Labels.

Delphi-Quellcode:
procedure TForm2.FormPaint(Sender: TObject);
begin
  zeichnen(self, 1);
  Canvas.Refresh;
end;

procedure TForm2.FormResize(Sender: TObject);
begin
  DestroyLabel;
  Button1.Left := Round(ClientWidth * 0.0482954545454545);
  Button1.Top := Round(ClientHeight * 0.8140589569160998);
  Button1.Width := Round(ClientWidth * 0.9034090909090909);

  Canvas.Brush.Color := clMenu;
  Canvas.FillRect(Rect(0,0, Width, Height));
  zeichnen(self, 1);
end;
Stehe momentan ziemlich auf dem Schlauch
Du machst das irgendwie völlig falsch. Wenn Du variablen Text auf ein Form schreiben willst, mach das mit Canvas.TextOut oder Canvas.TextRect, nicht, indem Du TLabels auf das Form legst. Beides zu mischen macht keinen Sinn, denn TLabels sind persistent, wenn man sie einmal angelegt hat zeichnen sie sich selbst neu, wenn das notwendig ist. Wenn sich der Text ändert, den sie anzeigen sollen, ändert man die Caption-Eigenschaft des Labels und zerstört nicht das Label und erzeugt es neu.
Peter Below
  Mit Zitat antworten Zitat
Pytroxis

Registriert seit: 12. Apr 2019
46 Beiträge
 
#10

AW: Komponenten während der Laufzeit erstellen und löschen

  Alt 19. Apr 2019, 16:16
Du machst das irgendwie völlig falsch. Wenn Du variablen Text auf ein Form schreiben willst, mach das mit Canvas.TextOut oder Canvas.TextRect, nicht, indem Du TLabels auf das Form legst. Beides zu mischen macht keinen Sinn, denn TLabels sind persistent, wenn man sie einmal angelegt hat zeichnen sie sich selbst neu, wenn das notwendig ist. Wenn sich der Text ändert, den sie anzeigen sollen, ändert man die Caption-Eigenschaft des Labels und zerstört nicht das Label und erzeugt es neu.
Die Labels werden auch nur gelöscht/erstellt sofern die Form geschlossen/geöffnet wird, dies sollte auch so sein, da sich jedesmal der Inhalt, die Position und die Anzahl der Labels ändert.
Deine Idee mit dem Draw Text erscheint, mir allerdings wirklich als eine bessere alternative, so erspare ich mir einiges an schreib arbeit und außerdem scheint es mir damit einfacher zu sein ein dynamisches System zu erschaffen!

Edit: Durch den Vorschlag von Peterbelow konnte ich das gesamte System nun besser umsetzen, daher besteht das oben genannte Problem auch nicht mehr.
Nun hatte ich eine neue Idee, wobei ich wieder einige Probleme beim realisieren habe:
Beim zeichnen wird nicht nur ein Objekt sondern dynamisch viele (je nach Eingabe des Benutzers) erstellt (-> Kein Problem).
Natürlich werden ab einer bestimmten Anzahl, die Objekte außerhalb des Programmes gezeichnet.
Gibt es eine gute Möglichkeit zu scrollen?
Habe Online die Idee gesehen, dass man jedesmal die Objekte neuzeichnet und verschiebt je nach Stellung der Scrollbar aber um ehrlich zu sein habe ich keine Ahnung wie ich das am geschicktesten umsetzen soll, bzw. gibt es womöglich eine schönere/bessere alternative?

Geändert von Pytroxis (19. Apr 2019 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:01 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf