Autor Beitrag
Böser Wolf
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mi 30.04.08 21:03 
Hallo miteinander,

ich habe hier ein Problem das mich jetzt doch schon längere Zeit beschäftigt.

Ich versuche über die ZeosLib, die ich als Package im Verzeichnis meiner Anwendung liegen habe, eine Connection zu einer Firebird Datenbank aufzubauen. Doch so weit kommt es immer nicht. Deshalb habe ich das Thema hier rein gepackt und nich zu den Datenbanken.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm2.lesen();
var
  Path: String;
  Connection: TComponent;

begin
  getDir(0,Path);
  PackageModule := LoadPackage(''+Path+'\ZComponent110.bpl');
  
  if PackageModule = 0 then
  raise Exception.Create('Das laden von ZComponent.bpl hat nicht geklappt!');
  begin
    AClass := GetClass('TZConnection');
    if AClass = nil then
    raise Exception.Create('Das laden von ZConnection hat nicht geklappt!');
        
        Connection := TComponentClass(AClass).Create(Application);
        Connection.Database:='Database.FDB'
    end

end;


Das ist meine Procedure, die ich geschrieben habe, ansich ja nichts kompliziertes.

Und jetzt mal dazu was alles passiert und vorallem was nicht!

- Er läd das Package und die Klasse TZConnection scheint er auch zu finden.
- Er meckert auch nicht beim erzeugen, also bei ->
"Connection :=  ZComponentClass(AClass).Create(Application);".
- Aber wenn ich die Property "Database" (oben rot) versuche zu setzen, kann er sie
nicht erkennen.

Jetzt zu den Rahmenbedingungen meine Programms.
Im Package der Zeoslib ist bei TZConnection die"initialize"-Procedure wie folgt geschrieben

ausblenden Delphi-Quelltext
1:
2:
initialization
RegisterClass(TZConnection);


In meiner eigenen Unit sind die Variablen:

ausblenden Delphi-Quelltext
1:
2:
PackageModule: HModule;
AClass: TPersistentClass
;

weiter oben schon deklariert worden, stehen der procedure also uneingeschränkt zur Verfügung!

Außerdem sind die Properties von ZConnection der ZeosLib alle Public, also müsste das auch kein Problem darstellen.

Im Ereignisprotokolls des Compilers kann ich sehen das die Packages geladen werden,
und AClass hat auch den Wert bzw die Klasse ZConnection.
Ich hatte das auch durch verschiedene Messages, die ich mir anzeigen lassen hab versucht nachzuprüfen und das sah alles eigenlich recht ordentlich aus.

So, ich denke das reicht erst mal, sonst habt ihr ja nichts mehr zu schreiben ;)

Würde mich über eine Anwort mit guten Tips freuen.

Danke schon ma im Voraus, bis dann
Tschö

Moderiert von user profile iconmatze: Delphi-Tags hinzugefügt
Hirschi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win XP, Vista, 7
Delphi 2009 Ent., C# (VS 2010 Ent.), C++ (VS 2010 Ent.), Java (Eclipse)
BeitragVerfasst: Mi 23.06.10 10:12 
Ich habe ein ganz ähnliches Problem, nur ist es keine Property die ich setzten will, sondern eine Methode die ich aufrufen möchte. Diese Methode gehört zu einer Klasse und eine Instanz davon befindet sich in der BPL, die erfolgreich geladen und angezeigt wird.

Bisher bin ich darauf gestoßen, dass man das wohl irgendwie über RTTI-Methoden macht, denn wie man im Beispiel sehen kann weiß das ladende Programm nicht, was für Methoden und Properties es gibt, weil der Typ bzw. die Klasse erst zur Laufzeit geladen wird. Es muss also sowas geben wie:

callMethodfromBPL(Instanz, <Typ>, '<Methodenname>');

MfG
Hirschi
Hirschi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win XP, Vista, 7
Delphi 2009 Ent., C# (VS 2010 Ent.), C++ (VS 2010 Ent.), Java (Eclipse)
BeitragVerfasst: Di 06.07.10 15:06 
Ich habe es hinbekommen eine Methode eines Objekts in einer BPL aufzurufen, mit:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type Txyz = procedure of Object;
...
Method :TMethod;
xyz    :Txyz;
...
AClass := GetClass('TFrameSomething');
Method.Code:=AClass.MethodAddress('getString');
Method.Data:=self;
xyz:=Txyz(Method);
xyz;

Die Funktion hat aber einen Rückgabewert, wisst ihr, wie ich an den herankomme? Eigentlich müsste ich xyz irgendwie in einen String reinbekommen, weil xyz doch auf den Rückgabewert (in dem Fall ein String) zeigt, oder?

MfG
Hirschi

EDIT: Gelöst, ich muss in der Type-Definition auch "function : string of object" verwenden! :)
Hirschi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22

Win XP, Vista, 7
Delphi 2009 Ent., C# (VS 2010 Ent.), C++ (VS 2010 Ent.), Java (Eclipse)
BeitragVerfasst: Di 06.07.10 17:51 
Mist, nun bekomme ich Zugriffsverletzungen, sobald ich auf irgendwas im Objekt zugreifen will. Also wenn der String nicht in der Methode getString erzeugt wird, sondern wenn ich ihn mir aus TFrameSomething.someString hole....wie kann das denn sein?!

Wenn die BPL geladen wird, habe ich ja bereits ein Objekt der Klasse TFrameSomething, was die Methode getString und someString enthält. In meiner Anwendung rufe ich die Methode auf wie oben beschrieben, bekomme aber eine Zugriffsverletzung.