![]() |
Auf Elemente der übergeordneten Klasse zugreifen
Hallo zusammen,
sorry, dass ich schon wieder nerve, und mir auch kein SO aussagekräftiger Name eingefallen ist. Am liebsten hätte ich schreiben wollen: "Bin verwirrt, helft mir" :mrgreen: Sorry, der Thread wird etwas länger... :roll: Ich will ein kleines Progtramm schreiben, das mir die CRC32 Checksummen von Dateien berechnet. Das Berechnen ist nicht das Problem. Ich will das Berechnen in einen Thread auslagern, folgender Code:
Delphi-Quellcode:
TCRCList.GetFiles schreibt die DateiNamen und Sonstige Informationen in die gecastete ObjectList fOL.
type TCRCThread = class(TThread)
protected procedure Execute; override; public constructor Create; end; type TCRCList = class(TObject) private fOL : TCRCObjectList; fThread : TCRCThread; fInList : TListBox; fOutList : TMemo; public constructor Create; destructor Destroy; override; procedure getFiles; procedure StartCRC; procedure StopCRC; procedure DisplayCRC; property InList : TListBox read fInList write fInList; property OutList : TMemo read fOutList write fOutList; end; TCRCList.StartCRC erzeugt und startet den Thread namens fThread. TCRCList.DisplayCRC soll unter anderem die berechneten Checksummen in das Memo fOutList schreiben. TCRCThread.Execute soll der Reihe nach die CRC32 aller in der ObjectList vorhandenen Dateien berechnen und diese im Memo fOutList ausgeben. :arrow: Problem: Wie kann ich im Thread auf die Elemente meiner ObjectListe der Klasse TCRCList zugreifen? :arrow: Zweites Problem: Wie kann ich im thread, wenn er einen for-Durchgang beendet hat, die Methode DisplayCRC der Klasse TCRClist aufrufen?
Delphi-Quellcode:
Das blöde ist, ich brauche Methode und ObjectList auch, bevor ich den Thread createt und nachdem ich ihn zerstört habe. Sonst hätte ich ja einfach dem Thread die Methode und die ObjectList geben können.
procedure TCRCThread.Execute;
var i : integer; begin for i := 0 to fOL.Count-1 do <-- ? begin //ComputeChecksum //Display CheckSum in Memo <-- ? end; end; Meine einzige Idee ist es, dem Thread eine eigene ObjectList und eigene Display-Methode zu spendieren und dann die ObjectList einfach zu kopieren...
Delphi-Quellcode:
Ich hoffe, ich konnte mein Problem halbwegs verständlich machen
type TCRCThread = class(TThread)
private fOL : TCRCObjectList; procedure DisplayCRC; protected procedure Execute; override; public constructor Create; end; procedure TCRCList.StartCRC; begin fThread := TCRCThread.create; fThread.fOL := fOL; [...] end; :arrow: Gibt es eine Möglichkeit, vom Thread fThread aus auf die ObjectList fOL der Klasse TCRCList zuzugreifen? |
Re: Auf Elemente der übergeordneten Klasse zugreifen
Der Thread braucht ein Feld, in dem die CRCList gespeichert wird.
|
Re: Auf Elemente der übergeordneten Klasse zugreifen
Zitat:
Wenn ich Dich recht verstehe, meinst Du etwa folgendes?
Delphi-Quellcode:
So hatte ich es auch mal, aber es erschien mir zu "umständlich", um richtig zu sein :gruebel: :oops:
type TCRCThread = class(TObject)
private fList : TCRCList; // <-- protected [...] end; procedure TCRCThread.Create; begin fList := TCRCList.Create; end; procedure TCRCList.StartCRC; begin fThread := TCRCThread.Create; fThread.fList.fOL := fOL; fThread.fList.fInList := fInList; fThread.fList.fOutList := fOutList; fThread.Resume; end; Allerdings tut sich ein kleine Problem auf: [Pascal Error] uType.pas(112): E2003 Undeclared identifier: 'TCRCList'
Delphi-Quellcode:
Wenn Du Deine Augenbrauen zusammenziehst, bitte ich um besondere Beachtung meiner Signatur, hehe
type TCRCThread = class(TObject)
private fList : TCRCList; // <-- protected [...] end; type TCRCList = class(TObject) private fThread : TCRCThread; // <-- protected [...] end; |
Re: Auf Elemente der übergeordneten Klasse zugreifen
Delphi-Quellcode:
type TCRCList = class; // <--
type TCRCThread = class(TObject) private fList : TCRCList; // <-- protected [...] end; type TCRCList = class(TObject) private fThread : TCRCThread; // <-- protected [...] end; |
Re: Auf Elemente der übergeordneten Klasse zugreifen
Du denkst deutlich zu kompliziert. Erzeuge fList nicht im Konstruktor von TCRCThread, sondern setze in TCRCList.StartCRC einfach fThread.fList auf Self. Das geht allerdings nur, wenn bei der Zerstörung der CRCList auch der Thread beendet wird, was nach deiner Beschreibung aber vermutlich der Fall ist.
Um das Problem mit dem nicht deklarierten Bezeichner zu lösen, musst du TCRCList "forward-declaren" (Was ist das korrekte Verb dazu?). Dazu fügst du einfach vor die Deklaration von TCRCThread noch TCRCList = class; ein (ohne Vorfahrenliste!). |
Re: Auf Elemente der übergeordneten Klasse zugreifen
Zitat:
|
Re: Auf Elemente der übergeordneten Klasse zugreifen
Zitat:
Zitat:
Meine Standard-Anwort : Warum hab' ich nicht dran gedacht.... Zitat:
Zitat:
[Pascal Error] uType.pas(108): E2086 Type 'TCRCList' is not yet completely defined bringt, aber folgendes (nur ein type am Anfang) funktioniert
Delphi-Quellcode:
Achja, beinahe hätt' ich's vergessen: Danke an alle und :dp: wieder mal
type
TCRCList = class; // <-- TCRCThread = class(TObject) private fList : TCRCList; // <-- [...] end; TCRCList = class(TObject) private fThread : TCRCThread; // <-- [...] end; |
Re: Auf Elemente der übergeordneten Klasse zugreifen
Zitat:
|
Re: Auf Elemente der übergeordneten Klasse zugreifen
Zitat:
Hmpf, in meiner Delphi-Hilfe habe ich dieses Thema nicht gefunden, aber ich stehe sowieso mit meiner Hilfe auf Kriegsfuß. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz