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
Tino: 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=nil) then |
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)=0) then 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!