Wie kann man Klassen über Kreuz benutzen?

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Wie kann man Klassen über Kreuz benutzen?

Beitrag von RSE »

Hallo!

Ich möchte folgendes realisieren:

Code: Alles auswählen

Type
  TMyClass = class(TObject)
  private
    Thread: TMyThread;
  end;
 
  TMyThread = class(TThread)
  private
    C: TMyClass;
  public
    constructor Create(CreateSuspended: Boolean; AC: TMyClass);
  end;


Leider finde ich keinen Weg es dem Compiler beizubringen. Das muss doch irgendwie möglich sein, mit irgend einer Form von Forward-Deklaration. Momentan habe ich nur den Workaround mit dynamischen Typecasts gefunden:

Code: Alles auswählen

Type
  TMyThread = class(TThread)
  private
    C: TObject;
  public
    constructor Create(CreateSuspended: Boolean; AC: TObject);
  end;
 
  TMyClass = class(TObject)
  private
    Thread: TMyThread;
  end;
 
implementation
 
constructor TMyThread.Create(CreateSuspended: Boolean; AC: TObject);
begin
  C := AC;
  TMyClass(C).irgendwas;
  ...
end;


Das kann ja eigentlich nicht die einzig machbare Lösung sein.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Du könntest auch noch eine Vorward Defination machen: Einfach die Klasse die du später nutzen möchtest Oben Definieren:
type
TMyClass=class;
so in etwa...
MFG
Michael Springwald

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Beitrag von RSE »

Danke!

Ich wusste, dass das irgendwie gehen muss, aber ich wusste nicht wie die Syntax ist ;-)
Klappt einwandfrei!
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Die sach hat leider nur einen Hacken, über verschiedene Units geht das so nicht. Alle Klassen müssen also in einer Unit rein...
MFG
Michael Springwald

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Beitrag von RSE »

Das ist ja kein größeres Problem. Höchstens eins der Übersichtlichkeit, aber das ist verschmerzbar. Aber immerhin besser als mit Typecast ;-)
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Das stimmt auch wieder. Zu not könnte man auch noch inc Dateien benutzen.
MFG
Michael Springwald

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Beitrag von RSE »

Hm, das ist eigentlich eine gute Idee. Die Unit umfasst immerhin inzwischen über 880 Zeilen. Danke für den Tipp!
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Bitte !
Ich bin auch erst vor kurtzen darüber gestolpert*G*
Bei meinen Aktuellen Projekt mache ich das im Moment auch so.

Ich glaube das ist vergleichbar mit dem C/C++ Header Dateien....
MFG
Michael Springwald

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Wie kann man Klassen über Kreuz benutzen?

Beitrag von mintpc »

Danke auch von mir.

Hatte grad dasselbe Problem und wieder mal hier gefunden!
Perfekt!

mintpc

Antworten