| Autor |
Beitrag |
Mark
Hält's aus hier
Beiträge: 14
WIN 2000, WIN XP
D7 Architect
|
Verfasst: Di 02.11.04 10:03
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
      

Beiträge: 9839
Erhaltene Danke: 45
Windows 8.1
Delphi XE4
|
Verfasst: Di 02.11.04 10:12
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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
WIN 2000, WIN XP
D7 Architect
|
Verfasst: Di 02.11.04 10:19
danke! das war genau das was ich gesucht habe 
|
|
patrick
      
Beiträge: 1481
WIN2k, WIN XP
D6 Personal, D2005 PE
|
Verfasst: Di 02.11.04 10:22
hätte es nicht auch
Delphi-Quelltext 1:
| if not memoStrList=nil then |
getan? 
_________________ Patrick
im zweifelsfall immer das richtige tun!!!
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Di 02.11.04 10:44
Wird zwar intern vom Compiler gleich übersetzt, If not Assigned() Then ist aber gebräuchlicher IMHO.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 02.11.04 10:50
|
|
Mark 
Hält's aus hier
Beiträge: 14
WIN 2000, WIN XP
D7 Architect
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
Hält's aus hier
Beiträge: 14
WIN 2000, WIN XP
D7 Architect
|
Verfasst: Di 02.11.04 11:52
danke für den tip... an eine übergabe von ner variable hab ich mal wieder nich gedacht  ... 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.
@ 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 
|
|
jasocul
      
Beiträge: 6395
Erhaltene Danke: 149
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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.
|
|