Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponenten-Array zur Laufzeit erstellen (https://www.delphipraxis.net/138433-komponenten-array-zur-laufzeit-erstellen.html)

Schwedenbitter 10. Aug 2009 11:30


Komponenten-Array zur Laufzeit erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe mich mit dem Thema schon beschäftigt und es ist für mich auch kein Problem, zur Laufzeit eine oder mehrere Komponenten auf einem Formular zu erstellen. Nur nützt mir das für mein geplantes Projekt nichts.

Ich habe das Problem, dass ich nicht nur eine, sonder im Grunde unendlich viele - so es der Nutzer wünscht und es der Speicher zulässt - Komponenten erstellen lassen möchte. Deshalb versuche ich es mit einem offenen Array. Verschlimmert wird das ganze dadurch, dass es jeweils Gruppen aus 4 TLabel und 1 TProgressBar sein sollen. Um das zu vereinfachen und nicht jedes TLabel einzeln anlegen zu müssen, versuchte ich das ganze zu kapseln.

Jetzt bekomme ich immer Zugriffsfehler. Bis hin dazu, dass sich das Programm ohne den Taskmanager nicht mehr beenden lässt.

Kann mir mal bitte jemand auf die Sprünge helfen, was ich falsche mache? Der Quellcode liegt bei.

Gruß, Alex

Uwe Raabe 10. Aug 2009 13:31

Re: Komponenten-Array zur Laufzeit erstellen
 
Der Fehler liegt hier:

Delphi-Quellcode:
   
SetLength(Zeile,Anzahl);
Zeile[Anzahl]:=TZeile.Create(Form1);
besser so:

Delphi-Quellcode:
   
SetLength(Zeile,Anzahl);
Zeile[Anzahl-1]:=TZeile.Create(Form1);

Desgleichen hier:

Delphi-Quellcode:
      
Zeile[Anzahl-1].Free;
Dec(Anzahl);

Schwedenbitter 10. Aug 2009 14:28

Re: Komponenten-Array zur Laufzeit erstellen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke!
Habe es kapiert. Das offene Array beginnt seine Zählung bei Null. Steht bestimmt auch in der Hilfe :wall:

Ich habe aber dennoch 2 Fragen:
  • Warum bekomme ich eine Fehlermeldung, wenn ich mein Form (Programm) einfach schließe, wenn noch Zeilen da sind? Erst wenn ich vor dem Beenden die ganze Liste durchgehe und alles explizit aufräume, klappt es. Das an sich stört mich noch nicht. Aber:
  • Warum werden die Elemente nicht sichtbar? Ich habe doch - wenn auch etwas kompliziert - Form1 als Parent übergeben.

Gruß und Dank, Alex

Uwe Raabe 10. Aug 2009 14:54

Re: Komponenten-Array zur Laufzeit erstellen
 
Zitat:

Zitat von Schwedenbitter
Warum werden die Elemente nicht sichtbar? Ich habe doch - wenn auch etwas kompliziert - Form1 als Parent übergeben.

In TZeile.Create erzeugst du die Labels und weist deren Parent den aktuellen Inhalt von FZeichner zu - dieser ist aber zu diesem Zeitpunkt noch nil! Er wird erst nach dem TZeile.Create gesetzt. Folgende Änderung sollte helfen:

Delphi-Quellcode:
Procedure TZeile.SetZeichner(IsZeichner: TWinControl);
Begin
  FZeichner:=IsZeichner;
  ZUser.Parent := FZeichner;
  ZAnteil.Parent := FZeichner;
  ZProzent.Parent := FZeichner;
  ZDauer.Parent := FZeichner;
  ZAnzahl.Parent := FZeichner;
End;

Schwedenbitter 10. Aug 2009 15:53

Re: Komponenten-Array zur Laufzeit erstellen
 
Zitat:

Zitat von Uwe Raabe
In TZeile.Create erzeugst du die Labels und weist deren Parent den aktuellen Inhalt von FZeichner zu - dieser ist aber zu diesem Zeitpunkt noch nil!

Ist auch wieder logisch.

Zitat:

Zitat von Uwe Raabe
Delphi-Quellcode:
Procedure TZeile.SetZeichner(IsZeichner: TWinControl);
Begin
  FZeichner:=IsZeichner;
  ZUser.Parent := FZeichner;
  ZAnteil.Parent := FZeichner;
  ZProzent.Parent := FZeichner;
  ZDauer.Parent := FZeichner;
  ZAnzahl.Parent := FZeichner;
End;

Ich habe es probiert. Aber leider klappt es nicht. Ich habe es sogar in TurboDelphi und Delphi6 probiert. Bei letzterem wurden wenigstens Scrollbalken im compilierten Programm angezeigt, wenn man eine Gruppe angelegt hat. Löschte man sie wieder, war auch der Balken weg. Da weiß man dann wenigstens, dass dort etwas ist. Bei TurboDelphi nicht einmal das.

Gruß, Alex <- der ratlos ist

DeddyH 10. Aug 2009 16:04

Re: Komponenten-Array zur Laufzeit erstellen
 
Vielleicht hilft Dir das Video zu Composite Controls weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 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