Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Existiert eine Stringlist ?!


Mark - Di 02.11.04 10:03
Titel: Existiert eine Stringlist ?!
Ich habe in einer Prozedur eine Stringliste erstellt. Bei dieser Prozedur handelt es sich um eine Suchprozedur die sich rekursiv aufruft. Nun habe ich das Problem das jedesmal wenn sich die Prozedur aufruft die Stringlist neu erstellt wird und alle Einträge in ihr überschrieben werden.
Ich hätte gerne eine Abfrage zu begin die prüfen soll ob diese Stringliste bereits erstellt wurde -> ungefähr so


Delphi-Quelltext
1:
2:
3:
4:
5:
if (memoStrList.Create)=FALSE then
          begin
            memoStrList := TStringList.Create;
            memoStrList.Clear;
          ...


is soetwas überhaupt möglich? kann ich auch mit einer exists Eigenschaft arbeiten?


Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Di 02.11.2004 um 09:12


Tino - Di 02.11.04 10:12
Titel: Re: Existiert eine Stringlist ?!
Hallo!

Assigned ist genau das was du suchst:

Delphi-Quelltext
1:
2:
if not Assigned (memoStrList) then
  memoStrList := TStringList.Create;

Ach ja, und Clear brauchst nach dem erstellen nicht aufrufen.

Gruß
Tino


jasocul - Di 02.11.04 10:15

Hoffe ich breche jetzt hier keine Diskussion vom zaun.
Normalerweise sollte folgendes funktionieren:

Delphi-Quelltext
1:
2:
3:
4:
5:
if not assigned(memoStrList) then  
          begin  
            memoStrList := TStringList.Create;  
            memoStrList.Clear;  
          ...

Wenn du aber memoStrList auch woanders benutzt und wieder frei gibst, kann es passieren, dass assigned nicht funktioniert. Assigned prüft ob das Objekt nil ist.
Solltest du das Objekt also auch woanders benutzen, solltest du nach jeder Freigabe memoStrList auf nil setzen.


Mark - Di 02.11.04 10:19
Titel: Re: Existiert eine Stringlist ?!
danke! das war genau das was ich gesucht habe :D


patrick - Di 02.11.04 10:22

hätte es nicht auch

Delphi-Quelltext
1:
if not memoStrList=nil then                    

getan? :lol:


BenBE - Di 02.11.04 10:44

Wird zwar intern vom Compiler gleich übersetzt, If not Assigned() Then ist aber gebräuchlicher IMHO.


Udontknow - Di 02.11.04 10:50

patrick hat folgendes geschrieben:
hätte es nicht auch

Delphi-Quelltext
1:
if not memoStrList=nil then                    

getan? :lol:


Nein, hätte es nicht. Du hast die Klammern vergessen. :wink:


Delphi-Quelltext
1:
if not (memoStrList=nilthen                    


Cu,
Udontknow


Mark - Di 02.11.04 11:41

das hat alles gut funktioniert, aber jezt hab ich das nächste problem.
ALSO: ich hab einen suchknopf, wenn ich auf den klicke dann sucht prozedur wunderbar nach dateien.
PROBLEM:im ersten durchlauf (1mal clicken auf suchen) zeigt er mir meine dateien wunderbar im memofeld an. beim zweiten klicken (z.b. gleiche suchparameter) knallt er mir den alten inhalt der stringlist + den neuen ins memofeld... das darf natürlich nicht sein.

ich hätte gerne eine abfrage gestalltet die prüft ob die prozedur neu aufgerufen wird (quasi durch meinen klick) und damit die stringlist .clear gemacht wird. bei rekursiven aufruf soll die ganz normal durchlaufen ohne clear, sonst hab ich ja am schluss keine ergebnisse.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if not Assigned (memoStrList) then
        begin
          memoStrList := TStringList.Create;
          memoStrList.Clear;
        end;

        if (FindFirst(ADirectory + '*.*', faAnyFile  , SR)=0then
        begin
          repeat
          ...


ich hätte auch generell ein .clear am anfang der prozedur reingeabaut aber da dies ja eine rekursive prozedur ist würde diese mir meine stringlist bei jedem aufruf clearen.


Udontknow - Di 02.11.04 11:46

Hallo!

Rufe einfach Clear vor dem Aufruf der rekursiven Prozedur auf.

Entweder direkt im OnClick-Ereignis oder (wahrscheinlich die sauberere Variante) eine Wrapper-Prozedur machen.

Cu,
Udontknow


jasocul - Di 02.11.04 11:46

Bastel dir einen Übergabe-Parameter für die Prozedur (z.B.:ErsterDurchlauf:Boolean). Beim ersten Aufruf übergibst True. Beim rekursiven Aufruf False. Dann musst du nur noch richtig reagieren.

btw: Neue Frage, neues Topic. Beim nächsten mal.


Udontknow - Di 02.11.04 11:48

Habe ich früher auch so gemacht, letztendlich ist so ein Übergabeparameter aber ineffektiv. Schliesslich wird der bei jedem rekursiven Aufruf mit übergeben und verlangsamt so den Code. Geschwindigkeitsmäßig wird es wohl nur selten eine Rolle spielen, aber naja. :)

Cu,
Udontknow


Mark - Di 02.11.04 11:52

danke für den tip... an eine übergabe von ner variable hab ich mal wieder nich gedacht :? :lol: ... okay dann poste ich das nächste mal ein neues thema... ich wollte nur nich gleich bei jeder lapalie ein neues thema posten und da dieses ja artverwandt ist hab ich nochmal hier gepostet. 8)

@ Udontknow: ein clear vor der prozedur wäre auch möglich, aber ich woltle gerne alles in der prozedur haben damit meine programmsteuerung möglichst klein wird. trotzdem danke :D


jasocul - Di 02.11.04 11:57

Udontknow hat folgendes geschrieben:
Habe ich früher auch so gemacht, letztendlich ist so ein Übergabeparameter aber ineffektiv. Schliesslich wird der bei jedem rekursiven Aufruf mit übergeben und verlangsamt so den Code. Geschwindigkeitsmäßig wird es wohl nur selten eine Rolle spielen, aber naja. :)

Nicht nur das. Der Stack wird auch noch vollgeschaufelt.
Die beschriebene Problematik von Mark deutete aber einfach diesen Weg an.