Autor Beitrag
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 10.07.03 22:21 
Hallo,

Ich hätte da mal eine Frage zur Deklaration von Klassen.
Und zwar deklariere ich bisher meine Klassen wie folgt:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
interface

type
  { class to directly access the FMod system }
  TEnhFModSys = class
    { ... }
  end;


  TCallbackThread = class(TThread)
    { ... }
  end;

  { class to access FSound streams, such as MP3 or WAV }
  TEnhFSoundStream = class
  private
    FCBThread: TCallbackThread;
    { ... }
  end;

TCallbackThread muss vor TEnhFSoundStream deklariert werden, weil ich ja ein Field habe, daß von diesem Typ ist. Wenn ich diese Unit jetzt irgendwo einbinde, habe ich logischerweise Zugriff auf die Klasse TEnhFModSys und TEnhFSoundStream. Aber ich kann auch auf TCallbackThread zugreifen, was nicht sein sollte.
Kann man eine Deklaration zwar im interface-Teil haben, sie aber trotzdem verstecken, sodaß sie außerhalb dieser Unit nicht sichtbar ist?
Deklariere ich die Klasse erst im implementation-Teil, findet er natürlich den Datentyp für mein Field FCBThread nicht, eine globale Variable, die erst im implementation-Abschnitt deklariert wird, ist wegen der Möglichkeit, TEnhFSoundStream mehrmals zu instanziieren nicht akzeptabel.
In eine seperate Unit sollte TCallbackThread nur ausgelagert werden, wenn es wirklich nicht anders geht.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Do 10.07.03 22:35 
Du könntest die FCBThread als TThread deklarieren und die Klasse TCallbackThread dann im implementation Abschnitt implementieren. Wenn du dann auf Eigenschaften und Methoden von TCallbackThread zugreifen willst, musst du FCBThread eben typecasten.

_________________
Ist Zeit wirklich Geld?
tommie-lie Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Do 10.07.03 22:49 
Stimmt, das wäre eine Möglichkeit (wieso bin ich da nicht selbst drauf gekommen?).

Danke!


Aber wenn jemand noch weiß, wie es einfacher geht, bin ich für weitere Vorschläge offen :-)

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: Fr 11.07.03 09:46 
Weiß jetzt nicht ob das geht (glaub aber fast nicht) daher ist es eher ne Frage als ne Antwort, aber... kann man im interface-Teil die Forward-Deklaration machen und erst im implementations-Teil die Klassen-Deklaration?

_________________
gringo pussy cats - eef i see you i will pull your tail out by eets roots!
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 11.07.03 10:50 
Motzi hat folgendes geschrieben:
Weiß jetzt nicht ob das geht (glaub aber fast nicht) daher ist es eher ne Frage als ne Antwort, aber... kann man im interface-Teil die Forward-Deklaration machen und erst im implementations-Teil die Klassen-Deklaration?


Leider nein :cry: habs gestern glatt mal getestet, weils mich auch interessiert hat...schade eigendlich

_________________
mfg.
mâximôv
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Fr 11.07.03 13:08 
Über den Umweg mit Interfaces lässt sich das schon machen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
ITest = interface
  procedure MyMethod;
end;

implementation

type
  TTest = class(TInterfacedObject, ITest)
    procedure MyMethod;
  end;

procedure TTest.MyMethod;
begin
  ShowMessage('Hier');
end;

_________________
Ist Zeit wirklich Geld?
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Fr 11.07.03 14:49 
Aber ITest bzw. TTest soll ja gerade nicht sichtbar sein, aber trotzdem im interface-teil verfügbar sein :? Wenn man sich das recht überlegt macht das ja auch keinen sinn, weil man ja, beim zugriff, über die andere klasse, die sichtbarkeit braucht...

macht das sinn..?

_________________
mfg.
mâximôv
tommie-lie Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Fr 11.07.03 15:02 
Motzi hat folgendes geschrieben:
Weiß jetzt nicht ob das geht (glaub aber fast nicht) daher ist es eher ne Frage als ne Antwort, aber... kann man im interface-Teil die Forward-Deklaration machen und erst im implementations-Teil die Klassen-Deklaration?

Selbst wenn es gehen würde (forward über implementation-interface-Grenze hinweg), wäre es besser, FCBThread als TThread zu deklarieren und später zu typecasten, weil ich dann die Klasse selbst nicht sehen würde.

Das mit der interface-Deklaration werde ich mir mal genauer anschauen, aus irgendeinem Grund kenne ich das gar nicht (steht das im OPLG :?!?:)...


maximus hat folgendes geschrieben:
Aber ITest bzw. TTest soll ja gerade nicht sichtbar sein, aber trotzdem im interface-teil verfügbar sein :? Wenn man sich das recht überlegt macht das ja auch keinen sinn, weil man ja, beim zugriff, über die andere klasse, die sichtbarkeit braucht...

Jein. Es ist schon ein wenig wiedersinnig, aber ich brauche den Callback-Thread nur innerhalb dieser einen Klasse, er wird also nur in der Unit benutzt. Von außen soll er gar nicht benutzt werden können, TEnhFSoundStream aber schon.
Im Prinzip ist es nur ein Schönheitsfehler, daß man TCallbackThread auch von außen sieht, weil man ihn ja einfach links liegen lassen könnte, aber ich fände es schöner, wenn man ihn gar nicht erst sieht ;-)

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert