Kann man feststellen, ob eine TList schon erstellt wurde?

Rund um die LCL und andere Komponenten
Antworten
Benutzeravatar
photor
Beiträge: 512
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Kann man feststellen, ob eine TList schon erstellt wurde?

Beitrag von photor »

Hallo Forum,

Ich warte ein Programm[1], dass eine ganze Reihe von gleichartigen Dateien nacheinander verarbeitet. Nun will ich diese analysieren und bestimmte Infos in einer TList zur Wietergabe in's Ergebnis speichern. Das funktioniert für die erste Datei auch soweit - und es macht eigentlich keinen Sinn, für die weiteren Dateien diese Liste jedesmal neu zu erstellen (die betrachtete Info ist in jeder Datei enthalten aber immer gleich).

Es wäre also schön, wenn man einfach feststellen könnte, die TList existiert schon und ist gefüllt. Mir fällt momentan nichts anderes ein, als eine globale Variable (außerhalb der Liste) zu definieren, die beim ersten Durchlauf gesetzt wird und dann anzeigt: "Liste schon gefüllt! Infos gültig.". Das finde ich aber eher unelegant.

Gibt es eine andere Möglichkeit?

Dankbar für jeden Schupser,

Photor


[1] über lange Zeit "gewachsen" d.h. die Struktur ist so leicht nicht zu ändern :(

Mathias
Beiträge: 6912
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von Mathias »

So kannst es einfach überprüfen.
Das nil ist recht wichtig.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TList = nil;
begin
  List := TList.Create;
  //      FreeAndNil(List);
  if List <> nil then begin
    ShowMessage('Liste erstellt');
  end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
photor
Beiträge: 512
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von photor »

Mathias hat geschrieben:So kannst es einfach überprüfen.
Das nil ist recht wichtig.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  List: TList = nil;
begin
  List := TList.Create;
  //      FreeAndNil(List);
  if List <> nil then begin
    ShowMessage('Liste erstellt');
  end;
end;
Hm. Das heißt, beim erstenmal sollte hierbei die TList erzeugt werden und somit List <> nil und ich kann die mit List.Add() füllen. Gut.

Aber jetzt komme ich zum 2. mal an diese Stelle und es wird versucht, List ein weiteres mal zu erzeugen -> die existiert schon -> TList.Create schlägt fehl und liefert nil zurück - richtig? Aber dann hat List jetzt den Wert nil und ich komme nicht mehr an meine Liste, denke ich. Das hilft mir nicht oder übersehe ich was?

Ciao,

Photor

Mathias
Beiträge: 6912
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von Mathias »

Verstehe ich dich richtig, du willst mehrere Listen ?

Oder du hat mein Beispiel falsch verstanden.


Oder hast du so etwas gemeint ?

Code: Alles auswählen

var
  List: TList = nil;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if List = nil then begin
    List := TList.Create;
  end else begin
    ShowMessage('Liste schon erzeugt');
  end;
end;
 
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  if List <> nil then begin
    FreeAndNil(List);
  end;
end;  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
photor
Beiträge: 512
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von photor »

Moin,

das soll so laufen:
  • bearbeite die erste Datei
  • keine Liste vorhanden
  • also wird sie erzeugt und gefüllt
  • erste Datei wird geschlossen
  • wilde Berechnungen
  • Ergebnis wird (angereichert mit Infos aus Liste) gespeichert ->Liste bleibt bestehen (weil die Infos weiter gebraucht werden)
  • bearbeite die zweite Datei
  • Liste is schon da (und mit den Infos gefüllt) -> der nächste Schritt von oben kann übersprungen werden
  • zweite Datei wird geschlossen
  • wilde Berechnung
  • Ergebnis wird (angereichert mit Infos aus Liste) gespeichert ->Liste bleibt bestehen (weil die Infos weiter gebraucht werden)
  • .... weiter so mit ca. 150 Dateien
Der Ablauf - bis auf das Erzeugen (2.) und Füllen (3.) der Liste - ist bereits vorhanden (die Infos werden bisher jedesmal neu aus der Datei gelesen und in's Ergebnisfile kopiert). Ich will jetzt die Infos in der Liste speichern, um sie nicht jedesmal neu zusammensuchen zu müssen. daher meine Frage, wie ich am einfachsten/elegantesten testen kann, ob die Liste bereits vorhanden ist.

Ich hoffe, es ist jetzt etwas klarer, was ich vorhabe.

Ciao,

Photor

PS: wenn ich Dein 2. Beispiel richtig verstehe(!) dann wird List tatsächlich nur dann erzeugt, wenn List = nil ist - was dann aber explizit vorher so gesetzt sein muss (z.B. in Form.Create). DAS könnte tatsächlich funktionieren - wird nach dem WE probiert.
Sorry, da musste ich erst ein zweites mal drüber nachdenken. :?

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von pluto »

Du könntest mit TListe.Count Arbeiten

if TListe.Count > 0 then .... // mache irgendwas, falls die Liste vorher nicht Erzeugt wurde, noch prüfen und erzeugen.
MFG
Michael Springwald

Benutzeravatar
photor
Beiträge: 512
Registriert: Mo 24. Jan 2011, 21:38
OS, Lazarus, FPC: Arch Linux: L 3.2 (Gtk2) FPC 3.2.2
CPU-Target: 64Bit

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von photor »

pluto hat geschrieben:Du könntest mit TListe.Count Arbeiten

if TListe.Count > 0 then .... // mache irgendwas, falls die Liste vorher nicht Erzeugt wurde, noch prüfen und erzeugen.
Hm. Aber ist List.Count tatsächlich abrufbar, wenn List noch gar nicht Createt wurde? Wenn das so ist: Ich lerne! Danke

Ciao,

Photor

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von Michl »

photor hat geschrieben:Aber ist List.Count tatsächlich abrufbar, wenn List noch gar nicht Createt wurde?
Nein, dann bekommst du einen schönen SIGSEGV.

PS: statt:

Code: Alles auswählen

if List = nil then
kannst du auch schreiben

Code: Alles auswählen

if Assigned(List) then
Ist eine Frage des Geschmacks (ich mag es), macht aber prinzipiell das Gleiche, siehe http://www.freepascal.org/docs-html/rtl ... igned.html

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Warf
Beiträge: 2118
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Kann man feststellen, ob eine TList schon erstellt wurde

Beitrag von Warf »

Michl hat geschrieben:
photor hat geschrieben:Aber ist List.Count tatsächlich abrufbar, wenn List noch gar nicht Createt wurde?
Nein, dann bekommst du einen schönen SIGSEGV.
Aber nur wenn man Glück hat oder die Variable genil'd wurde, es kann auch was ganz abenteuerliches rauskommen, wenn man sich einfach so drauf verlässt
Aber ist List.Count tatsächlich abrufbar, wenn List noch gar nicht Createt wurde? Wenn das so ist: Ich lerne! Danke
Nun die Idee ist dabei die Liste nur einmal zu createn und dann statt immer neu zu erstellen Sie einfach mit clear zu leeren.
Das ist sowieso die bessere Möglichkeit, da eine List ohne Elemente nur sehr wenig Speicher beansprucht, und es so auch deutlich weniger fehleranfällig ist

Antworten