Autor Beitrag
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Do 17.08.06 15:25 
Hallo!
Ich beschäftige mich im Moment mit den BPL- Packages, sowie dem dynamischen Einbinden von in BPLs ausgelagerte Klassen.
Dazu habe ich jetzt eine Frage, bei der ich absolut nicht weiterkomme.

Ich habe in meinem Hauptprogramm eine Klasse:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
type
TCustomConnection = class(TComponent)
  private
    Function GetDescription: string;
  public
    Property Description: string read GetDescription;
end;

implementation

{...}

function GetDescription: string;
begin
  Result := 'Das ist die Basisklasse';
end;


So und mein Ziel ist es jetzt, von TCustomConnection abgeleitete Klassen in BPLs zu packen. Dabei führen die abgeleiteten Klassen keine neuen Methoden oder Properties ein, sondern überschreiben nur bereits in der TCustomConnection bekannte Methoden und Properties. Wenn ich jetzt im Hauptprogramm (was selber nur die Klasse TCustomConnection kennt) die entsprechende abgeleitete BPL-Klasse lade, möchte ich die Methoden der Abgeleiteten Klasse ausführen, nicht die von TCustomConnection.

Im Hauptprogramm hole ich mir die Klasse auf folgende Weise, wobei die BPL zu dem Zeitpunkt bereits erfolgreich in den Speicher geladen ist.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Procedure LoadClass(ClassName: string; var Connection: TCustomConnection);
var AClass: TPersistenClass;
begin
  AClass := GetClass(HelpComponent.ConnectionComponentName);
  Connection := TConnectionClass(AClass).Create(self) as TCustomConnection; // TConnectionClass = class of TCustomConnection
end;


Das Problem leigt jetzt ganz einfach darin, dass ich für Connection.Description 'Dies ist die Basisklasse' angezeigt bekomme und nicht den Text, den ich in der Nachfolgeklasse vorgebe.

Auf welchem Weg komme ich aber da hin? Das Problem liegt halt darin, dass das Hauptprogramm selber die abgeleitete Klasse zur Entwurfszeit nicht kennt. Ich kann daher hierarchisch gesehen höchstens bis TCustomConnection gehen, oder?

Vielen Dank und beste Grüße
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
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: Do 17.08.06 15:48 
Istz deine Basisklasse fest in die Anwendung compiliert oder bindest du diese Klasse über ein eigenes Package in die Hauptanwendung.

Du müsstest nämlich jegliche "Plugins" das Package mit der Schnittstellen-Basisklasse laden lassen und von dieser Stelle aus die Anbindung in die Anwendung machen.

_________________
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.
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Do 17.08.06 15:52 
Die Basisklasse ist fest in die Hauptanwendung reinkompiliert. (Das BPL kennt sie auch, da in der ja eine Ableitung stattfindet). Das zweite ist mir noch etwas undurchsichtig. Wie meinst du das genau?

_________________
Programmers never die, they just GOSUB without RETURN
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: Do 17.08.06 16:42 
Wenn Du das ganze als Plugin-Schnittstelle nutzen willst, hast Du grob folgenden Aufbau:

ausblenden Illustration mit Jave 5
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
                    +--------------+
                    |Hauptanwendung|
                    +-------+------+
                            |
                            |
                            |
              +-------------+------------+
              |Basisklasse der Plugins...|
              +-------------+------------+
                            |
       +--------------------+-------------------+
       |                    |                   |
+------+------+      +------+------+     +------+------+
|   Plugin1   |      |   Plugin2   |     |   Plugin3   |
+-------------+      +-------------+     +-------------+


D.h. Du musst jedes Plugin in ein Package nehmen und deine Plugin-Klasse auch ... Jedes Plugin bindet dann die Schnittstellenklasse in der Requires-Klausel einfach als benötigtes Package ein und kann ohne Umwege damit arbeiten.

_________________
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.
alias5000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Do 17.08.06 16:57 
D.h.:
  • Die Hauptanwendung kennt zur Designzeit TCustomConnection nicht.
  • Durch das requires-Einbinden der Schnittstellenklasse kann ich bereits zur Entwurfszeit damit arbeiten
  • In den Plugins leite ich dann von TCustomConnection eine Komponente wie TIRCConnection oder TICQConnection ab (jetzt weißt du auch, was das werden soll ;) )
  • Aber wie arbeitet jetzt die Anwendung damit? Wird das Schnittstellenpackage statisch eingebunden, so dass ich doch wieder Zugriff auf TCustomConnection zur Entwurfszeit hab? Wozu dann die Auslagerung in ein extra Package? Wie arbeite ich dann im Code mit dieser unbekannten abgeleiteten Klasse? (ich ahne wohin das in etwa führt: Klassenreferenzen, stimmts?)



Hintergrund: Ich möchte eine Multiprotokoll-Chat Kompo schreiben, die jedes Protokoll als Package implementiert. Dabei würde ich mit TCustomConnection alle Funktionen als Dummies zur Verfügung stellen. Erst die abgeleiteten Klassen sollen dann die Funktionen je nach Protokoll ausfüllen.

_________________
Programmers never die, they just GOSUB without RETURN