![]() |
Re: Pointer auf Oberklassen
Und warum sind die nicht kompatibel? TIBQuery ist doch ein Nachfahre von TQuery, oder? Ich kann mich halt nicht entscheiden, weil ich nachher eine DLL für Interbase und eine für MySQL benutzten will. Mein Hauptprogramm soll es ganz egal sein, was für eine Datenbank die DLL nutzt.
[edit] OK, simmt, sorry, du hast recht, TIBQuery ist ein Nachfahre von Tdataset nicht aber von TQuery![/edit] ich habe das mal auf total simplen Code verringert:
Delphi-Quellcode:
Und genau das schlägt auch schon fehl. Es liegt also nicht an der DLL sondern an der Funktion an sich!
var
qrmain: TIBQuery; p:pointer; procedure TForm1.Button1Click(Sender: TObject); begin qrmain := TIBQuery.Create(nil); p := @qrmain; end; procedure TForm1.Button2Click(Sender: TObject); var tempqr:TQuery; begin tempqr := TQuery(p^); tempqr.Sql.Text := 'SELECT * FROM tabelle'; tempqr.ExecSQL; end; |
Re: Pointer auf Oberklassen
Alternativ, wenn Dir das Hilft, kannst Du ein TDataSet übergeben. Das ist die Basisklasse, aus der TIBDataSet -> TIBQuery und TBDEDataSet -> TQuery abgeleitet sind.
|
Re: Pointer auf Oberklassen
Zitat:
Hierarchie von TIBQuery: TObject -> TPersistent -> TComponent -> TDataSet -> TIBCustomDataSet -> TIBQuery Hierarchie von TQuery: TObject -> TPersistent -> TComponent -> TDataSet -> TBDEDataSet -> TDBDataSet -> TQuery Wie man sieht sind die Dinger nur bis TDataSet miteinander kompatible Typen. |
Re: Pointer auf Oberklassen
An der Stelle wird Dir nichts anderes übrig bleiben, als eine Wrapper-Klasse zu schreiben, die eine TQuery und eine TIBQuery als Member-Variablen hat.
Du übergibst einen TDataSet-Pointer. Je nach dem, was übergeben wird (If myDataSet is TIBQuery oder eben If myDataSet is TQuery..) musst Du die jeweilige interne Variable belegen und alle Aufrufe inten auf das entsprechende Objekt umleiten. Das ist so die einfachste Möglichkeit die ich sehe. |
Re: Pointer auf Oberklassen
Zitat:
Klassen können nicht aus DLL's übergreifend benutzt werden !! Nur wenn die EXE und die DLL die Packages VCL??.bpl und VCLDB??.bpl verwenden können Klassen die in diesen Packages deklariert wurden übergreifend benutzt werden. Wird das nicht so gemacht dann linkt der Compiler für die EXE und die DLL jeweils separat die komplette VCL ein. Somit ist die Klasse TQuery in der EXE nicht mehr identisch mit der Klasse TQuery in der DLL. Sie sind zwar Speicherkompatibel, also der Klassenrecord in den Codesegemnten der EXE und DLL sind identisch aufgebaut aber es sind NICHT der gleiche Record, eg. Speicherbereich. Da z.B. der IS und AS Operator aber auf der Speicheradresse der Klassendefinition aufbaut funktionieren diese Operatoren nicht mehr. D.h. eine TQuery erzeugt in der DLL würde bei der Abfrage if (DLLQuery is TQuery) then ; in der EXE immer FALSE liefern. Es ist also falsch DLL's zu bauen die mit Klassen arbeiten auf die die EXE zugreifen will. Es sei denn man benutzt Packages. Gruß Hagen |
Re: Pointer auf Oberklassen
Ouch. Man lernt nie aus...
Das dürfte sich also generell schwierig gestalten... |
Re: Pointer auf Oberklassen
So eine Kacke, ihr habt recht:
jetzt läuft es ohne jegliche Schutzverletzungen, nur mein Dataset hat nie ein Ergebniss. Fällt jemanden von euch was anderes ein? Ist das mit dem package schwierig? Ein konzept sehe so aus:
Code:
jetzt soll jeder Zugriff auf die qrmain, automatisch an die jeweilge DLL weitergeleitet werden, in das jeweilige Objekt!
Hauptanwendung: DLL1: DLL2:
qrmain:TDataSet qrmain:TIBQuery qrmain:TZeosQuery |
Re: Pointer auf Oberklassen
Zitat:
Ohne Packages werden alle benötigten Parts der VCL in das Modul eingelinkt. Wir wissen das eine einfache EXE dann sofort 400Kb groß wird. Dies trifft auf DLL's genauso zu. Also: 251 * 400Kb = 100Mb, schon 4 mal soviel wie mit Packages. Grundsätzlich kann man die VCL+Klassen nicht in einfache DLL's global benutzen. Ich weis es gibt im WEB viele Anleitungen wie man zB. Formulare in DLL's benutzen kann, aber im Grunde sind diese alle falsch. Gruß Hagen |
Re: Pointer auf Oberklassen
Zitat:
Übrigens Delphis IDE arbeitet genau nach diesem Prinzip. Erzeuge mal ein Package mit folgender Register procedure und installieren es mal in der Delphi IDE.
Delphi-Quellcode:
Gruß Hagen
procedure Register;
begin Application.Title := 'Meine Delphi IDE'; end; |
Re: Pointer auf Oberklassen
Ist das klasse...
Da bricht ja ein ganz neues Zeitalter in der Anpassung der IDE an :D |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz