Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Auf verschiedene Instanzen eines Formulars zugreifen (https://www.delphipraxis.net/175256-auf-verschiedene-instanzen-eines-formulars-zugreifen.html)

Pandax3 9. Jun 2013 19:53

Auf verschiedene Instanzen eines Formulars zugreifen
 
Hallo,
zu meinem Problem habe ich irgendwie nirgends etwas gefunden. Ich erstelle mehrer Instanzen eines Formulars mit
Delphi-Quellcode:
Form := TForm.Create(self);
Form.show
Wenn ich jetzt jedoch später auf die Labels/Edit Fenster der Formulare zugreifen möchte, kann ich immer nur die letzte Instanz ansprechen -
Kann mir jemand weiterhelfen und mir einen Tipp geben, wie ich das Problem beheben kann?

Danke schon mal ;D

stahli 9. Jun 2013 19:59

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Du bauchst mehrere Variablen, wenn Du die Instanzen gezielt ansprechen willst (oder must diese in einer Liste/Array verwalten):

Delphi-Quellcode:
Form1 := TForm.Create(self);
Form1.show;
Form2 := TForm.Create(self);
Form2.show;
Form3 := TForm.Create(self);
Form3.show;

DeddyH 9. Jun 2013 21:01

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Oder über die bereits vorhandene Forms-Liste von TScreen darauf zugreifen. Allerdings fände ich eine selbst verwaltete Liste auch eleganter.

Pandax3 9. Jun 2013 21:10

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Wie gehe ich so eine selbst verwaltete Liste am besten an? Ich weiß nicht genau was ich jetzt in dem Array speichern muss :?:
Zur Zeit speichere ich nur das Handle, aber dann kann ich immer noch nicht z.B. auf die Labels einer Instanz zugreifen...

stahli 9. Jun 2013 21:18

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Ich würde die Liste einem Array vorziehen. Von der Verwaltung her ist das etwas einfacher.

Belies Dich einfach mal zum Thema TList und TObjectList.
Wenn Du das soweit im Griff hast, dann wäre die Beschäftigung mit Generischen Listen sinnvoll (ist nicht so schlimm wie es sich anhört ;-))

DeddyH 10. Jun 2013 07:09

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Da ein Formular ja von TComponent abstammt, böte sich eine TComponentList an.

Pandax3 10. Jun 2013 11:35

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Also hab mir das mit den Listen mal angeguckt und habe noch nen paar Fragen. Wo ist der Vorteil einer generischen Liste gegenüber einer TObjectList und was unterscheidet die TObjectList von der TComponentList?

Und wenn ich meine Form speichern möchte, mache ich das dann so richtig?
(verwende jetzt TObjectList)

Delphi-Quellcode:
Form := TForm.Create(self);
Form.label1.caption := 'test';
List.Add(Form);
Wenn ich dann schließlich die Liste mit einer Schleife durchgehe, wie kann ich dann wieder auf das Label zugreifen?

Danke schonmal ;D

bcvs 10. Jun 2013 11:50

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Zitat:

Zitat von Pandax3 (Beitrag 1218018)
Und wenn ich meine Form speichern möchte, mache ich das dann so richtig?
(verwende jetzt TObjectList)

Im Prinzip ja. Du musst nur aufpassen, wann und von wem die Form wieder freigegeben wird. Die ObjectList gibt die enthaltenen Objekte standardmäßg selbst wieder frei (schau mal bei OwnsObjects). Wenn du in deinem TForm.Create noch ein self als Owner angibst, versucht dieser Owner evtl. die Form freizugeben, wenn sie bereits durch die ObjectList freigegeben wurde.

Ich würde daher sowas machen:

Delphi-Quellcode:
Form := TForm.Create(nil);
Form.label1.caption := 'test';
List.Add(Form);
...

List.Free // hier werden auch die Forms freigegeben.
Zitat:

Zitat von Pandax3 (Beitrag 1218018)
Wenn ich dann schließlich die Liste mit einer Schleife durchgehe, wie kann ich dann wieder auf das Label zugreifen?

Delphi-Quellcode:
for i:=0 to List.count - 1 do
  TMyForm(List[i]).label1.Caption := 'Form '+IntToStr(i);

DeddyH 10. Jun 2013 12:29

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Der Hauptunterschied zwischen TObjectList und TComponentList:
Zitat:

Das TComponentList-Objekt aktualisiert sich automatisch selbst, wenn eine Komponente freigegeben wird. Dazu wird der Verweis auf die betreffende Komponente gelöscht und die Liste gepackt.
P.S.: Der Link oben war defekt, ich habe ihn korrigiert.

stahli 10. Jun 2013 12:38

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
... und noch zur generischen Liste:

Da kannst Du angeben, welche Objekte Du in die Liste schreiben willst und die Einträge dann später direkt verwenden.
Der Compiler kann dann davon ausgehen, dass nur Formulare in der Liste stehen und verhindert auch, dass etwas anderes (z.B. ein Panel) der Liste hinzugefügt wird.
Du kannst somit das "casten" der Einträge vermeiden.

Unter uses musst Du dafür Generics.Collections hinzufügen.
Für den Anfang würde ich es erst mal klassich machen.
Auf Generics umstellen kannst Du dann immer noch.

Delphi-Quellcode:
List: TObjectList<TForm>;
...
List := TObjectList<TForm>.Create;
...
for i:=0 to List.count - 1 do
  List[i].label1.Caption := 'Form '+IntToStr(i);

Pandax3 10. Jun 2013 17:06

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
so danke erstmal,
ich habe mich jetzt fürs erste für die ObjectList entschieden, habe dazu noch folgende Frage -

Wenn ich der Liste eine feste Länge über Count gebe, kann ich dann in meinem Beispiel die Items 0..11 ohne Probleme ansprechen?
Und was passiert wenn ich ein item wieder lösche über delete, muss ich dann das count wieder zurücksetzen? Kann es da irgendwie zu Komplikationen kommen? :D
Delphi-Quellcode:
// als Beispiel
  FormList.Count := 12;
  FormList.Items[nr] := Form;
  FormList.Delete(nr);
  Formlist.count := 12;
Ich habe noch mal kurz drüber nachgedacht, kann man eigentlich nicht auch sowas wie ein
Delphi-Quellcode:
FormList: Array of TObject
definieren und darin seine Forms speichern? Würde in meinem Fall vielleicht mehr Sinn ergeben :?:

stahli 10. Jun 2013 17:15

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Einer Liste kannst Du Count nicht zuweisen. Die Anzahl kannst Du nur durch hinzufügen oder löschen von Einträgen ändern.

Ein Array kannst Du natürlich auch nutzen. Ist letztlich Geschmackssache. Im Handling ist aber eine Liste m.E. etwas einfacher.

DeddyH 10. Jun 2013 17:18

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Welchen Sinn soll das haben? Wenn Du Count setzt, heißt das ja nicht, dass tatsächlich soviele Referenzen in der Liste sind, so dass Du u.U. auf nil-Pointer zugreifst.

DeddyH 10. Jun 2013 17:19

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Zitat:

Zitat von stahli (Beitrag 1218077)
Einer Liste kannst Du Count nicht zuweisen. Die Anzahl kannst Du nur durch hinzufügen oder löschen von Einträgen ändern.

Das hab ich auch erst gedacht, stimmt aber nicht.

Pandax3 11. Jun 2013 16:29

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Okay, danke an alle, eine Frage noch - die Definition habe ich irgenwie immer noch nicht so ganz verstanden

Zitat:

Der Hauptunterschied zwischen TObjectList und TComponentList:
Zitat:
Das TComponentList-Objekt aktualisiert sich automatisch selbst, wenn eine Komponente freigegeben wird. Dazu wird der Verweis auf die betreffende Komponente gelöscht und die Liste gepackt.

Wenn ich in einer TObjectList ein Element freigebe, aktualisiert sich diese doch auch? Oder was muss man machen damit sich diese aktualisiert?

DeddyH 11. Jun 2013 16:51

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Mal ein schnelles Beispiel:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  List: TObjectList;
  Button: TButton;
begin
  List := TObjectList.Create;
  try
    Button := TButton.Create(nil);
    List.Add(Button);
    Button.Free;
    ShowMessage(IntToStr(List.Count)); // = 1
  finally
    List.Free; //Bumm
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  List: TComponentList;
  Button: TButton;
begin
  List := TComponentList.Create;
  try
    Button := TButton.Create(nil);
    List.Add(Button);
    Button.Free;
    ShowMessage(IntToStr(List.Count)); // = 0
  finally
    List.Free; //Alles in Butter
  end;
end;
Eine TComponentList bekommt es mit, wenn ein Element "von außen" freigegeben wird, und aktualisiert sich dann. Bei der TObjectList ist das nicht so, das Ergebnis sind in dem Fall Dangling Pointer ("wilde Zeiger").

Pandax3 11. Jun 2013 17:08

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
aso, danke, dann ist eine TComponentList wohl eher für das Speichern von Komponenten zu empfehlen ;D
Wenn ich aber sowieso nur
Delphi-Quellcode:
List.Delete(1)
verwende, sollte es doch eigentlich egal sein welche ListenTyp ich nehme,
aber es schadet ja nicht die TComponentList zu bevorzugen ;D

DeddyH 11. Jun 2013 17:16

AW: Auf verschiedene Instanzen eines Formulars zugreifen
 
Wenn Du die Objekte über die Liste freigibst, tun sich die beiden Typen tatsächlich nichts.


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