AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Auf Elemente der übergeordneten Klasse zugreifen

Auf Elemente der übergeordneten Klasse zugreifen

Ein Thema von silver-moon-2000 · begonnen am 8. Mai 2008 · letzter Beitrag vom 8. Mai 2008
Antwort Antwort
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#1

Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 17:47
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"

Sorry, der Thread wird etwas länger...

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:
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.GetFiles schreibt die DateiNamen und Sonstige Informationen in die gecastete ObjectList fOL.
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.

Problem: Wie kann ich im Thread auf die Elemente meiner ObjectListe der Klasse TCRCList zugreifen?

Zweites Problem: Wie kann ich im thread, wenn er einen for-Durchgang beendet hat, die Methode DisplayCRC der Klasse TCRClist aufrufen?

Delphi-Quellcode:
procedure TCRCThread.Execute;
var i : integer;
begin
  for i := 0 to fOL.Count-1 do <-- ?
  begin
    //ComputeChecksum
    //Display CheckSum in Memo <-- ?
  end;
end;
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.

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:
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;
Ich hoffe, ich konnte mein Problem halbwegs verständlich machen
Gibt es eine Möglichkeit, vom Thread fThread aus auf die ObjectList fOL der Klasse TCRCList zuzugreifen?
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 17:49
Der Thread braucht ein Feld, in dem die CRCList gespeichert wird.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#3

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 19:37
Zitat von Apollonius:
Der Thread braucht ein Feld, in dem die CRCList gespeichert wird.
Erstmal danke für die Antwort.
Wenn ich Dich recht verstehe, meinst Du etwa folgendes?

Delphi-Quellcode:
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;
So hatte ich es auch mal, aber es erschien mir zu "umständlich", um richtig zu sein

Allerdings tut sich ein kleine Problem auf:
[Pascal Error] uType.pas(112): E2003 Undeclared identifier: 'TCRCList'

Delphi-Quellcode:
type TCRCThread = class(TObject)
  private
    fList : TCRCList; // <--
  protected
[...]
end;

type TCRCList = class(TObject)
  private
    fThread : TCRCThread; // <--
  protected
[...]
end;
Wenn Du Deine Augenbrauen zusammenziehst, bitte ich um besondere Beachtung meiner Signatur, hehe
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 19:42
Delphi-Quellcode:
type TCRCList = class; // <--

type TCRCThread = class(TObject)
  private
    fList : TCRCList; // <--
  protected
[...]
end;

type TCRCList = class(TObject)
  private
    fThread : TCRCThread; // <--
  protected
[...]
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 19:44
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!).
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 19:53
Zitat von Apollonius:
"forward-declaren" (Was ist das korrekte Verb dazu?).
Vorwärts deklarieren?
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#7

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 20:17
Zitat von Apollonius:
Du denkst deutlich zu kompliziert.
DAS hat bisher noch keiner zu mir gesagt, eher das genaue Gegenteil

Zitat von Apollonius:
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.
Aber Du hast mit dem kompliziert Denken eindeutig recht.
Meine Standard-Anwort : Warum hab' ich nicht dran gedacht....


Zitat von Apollonius:
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!).

Zitat von DeddyH:
Delphi-Quellcode:
type TCRCList = class; // <--

type TCRCThread = class(TObject)
  private
    fList : TCRCList; // &lt;--
[...]
end;

type TCRCList = class(TObject)
  private
    fThread : TCRCThread; // &lt;--
[...]
end;
Kann mir jemand bitte erklären, warum der Quelltext von DeddyH bei mir den Fehler
[Pascal Error] uType.pas(108): E2086 Type 'TCRCList' is not yet completely defined
bringt, aber folgendes (nur ein type am Anfang) funktioniert

Delphi-Quellcode:
type
TCRCList = class; // <--

TCRCThread = class(TObject)
  private
    fList : TCRCList; // &lt;--
[...]
end;

TCRCList = class(TObject)
  private
    fThread : TCRCThread; // &lt;--
[...]
end;
Achja, beinahe hätt' ich's vergessen: Danke an alle und wieder mal
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 20:26
Zitat von Die Delphi-Hilfe:
If the declaration of a class type ends with the word class and a semicolon - that is, if it has the form

type className = class;

with no ancestor or class members listed after the word class, then it is a forward declaration. A forward declaration must be resolved by a defining declaration of the same class within the same type declaration section. In other words, between a forward declaration and its defining declaration, nothing can occur except other type declarations.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
silver-moon-2000

Registriert seit: 18. Feb 2007
Ort: Schweinfurt
170 Beiträge
 
Delphi XE Professional
 
#9

Re: Auf Elemente der übergeordneten Klasse zugreifen

  Alt 8. Mai 2008, 20:32
Zitat von Apollonius:
Zitat von Die Delphi-Hilfe:
If the declaration of a class type ends with the word class and a semicolon - that is, if it has the form

type className = class;

with no ancestor or class members listed after the word class, then it is a forward declaration. A forward declaration must be resolved by a defining declaration of the same class within the same type declaration section. In other words, between a forward declaration and its defining declaration, nothing can occur except other type declarations.
Danke für die Geduld.
Hmpf, in meiner Delphi-Hilfe habe ich dieses Thema nicht gefunden, aber ich stehe sowieso mit meiner Hilfe auf Kriegsfuß.
Tobias
Bitte nicht hauen , ich weiß es nicht besser
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz