Autor Beitrag
Mark
Hält's aus hier
Beiträge: 14

WIN 2000, WIN XP
D7 Architect
BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Veteran
Beiträge: 9839
Erhaltene Danke: 45

Windows 8.1
Delphi XE4
BeitragVerfasst: Di 02.11.04 10:12 
Hallo!

Assigned ist genau das was du suchst:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Di 02.11.04 10:15 
Hoffe ich breche jetzt hier keine Diskussion vom zaun.
Normalerweise sollte folgendes funktionieren:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14

WIN 2000, WIN XP
D7 Architect
BeitragVerfasst: Di 02.11.04 10:19 
danke! das war genau das was ich gesucht habe :D
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Di 02.11.04 10:22 
hätte es nicht auch
ausblenden Delphi-Quelltext
1:
if not memoStrList=nil then					

getan? :lol:

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 02.11.04 10:50 
patrick hat folgendes geschrieben:
hätte es nicht auch
ausblenden Delphi-Quelltext
1:
if not memoStrList=nil then					

getan? :lol:


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

ausblenden Delphi-Quelltext
1:
if not (memoStrList=nilthen					


Cu,
Udontknow
Mark Threadstarter
Hält's aus hier
Beiträge: 14

WIN 2000, WIN XP
D7 Architect
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14

WIN 2000, WIN XP
D7 Architect
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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.