Hallo.
Ich habe eine Application, die zur Laufzeit eine
DLL mit Forms lädt.
In der Application sind
mysql Query Funktionen definiert, die aus der
DLL aufgerufen werden (funktioniert)
connection und datasources sind auch in der application definiert.
die datasources werden beim instanziieren der
dll als pointer in die
dll übergeben.
wenn ich ein
query ausführe und dann in der
dll auf das Datasource zugreife (direkt per code) oder per DBNavigator, dann tut das.
Problem:
Wenn ich aber ein Dbgrid zur Laufzeit mit dem Datasource verbinde, zeigt es beim
query'en nur an, wie es wohl mit Records gefüllt wird ( der vertikale Scrollbalken wird immer kleiner ) aber dann kommt es zu willkürlichen Schreib-Exceptions die mir anschliessend auch CPU Debugfenster bringen.
das gleiche ausserhalb der
DLL funktioniert aber.
wo kann hier das Problem liegen?
hier mal ein paar codeauszüge
Hauptapplikation-Funktionen:
Delphi-Quellcode:
function mySQL_query(
var query:Tadquery;
sql:
string): boolean;
begin
result := false;
try
query.Active := false;
query.SQL.Clear;
query.SQL.Add(
sql);
query.Active := true;
result :=
query.Active;
except on e:
exception do begin
showmessage('
Exception mySQL_query: '+e.
message+'
SQL:'+
sql);
end;
end;
end;
function mySQL_query1(
sql:pchar): boolean;
begin
result := mysql_query(form1.adquery1,
sql);
end;
Hauptapplikation-Übergabe von Adressen und Pointer an
DLL:
Delphi-Quellcode:
@fetch_pointer := GetProcAddress(pluginhandle,'
fetch_query1');
fetch_pointer(@mysql_query1);
//query funktion
@fetch_pointer := GetProcAddress(pluginhandle,'
fetch_ds1');
fetch_pointer(ds1);
//datasource
DLL-Variablen (global):
Delphi-Quellcode:
mysql_query1,mysql_query2,mysql_query3 :
function(
sql:pchar): boolean;
adcommand:
function(
sql:pchar): boolean;
ds1,ds2,ds3:Tdatasource;
DLL-
Query auslöser:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
q:string;
begin
form3.show;
q := 'SELECT name FROM `sys_kwtypen`';
mysql_query2(pchar(q));
//dbgrid1.DataSource := ds2; //error
dbnavigator1.DataSource := ds2;
//QueryToDBgridA('SELECT name FROM `sys_kwtypen`',form3.dbgrid1);
//QueryToDBgridB('SELECT name FROM `sys_kwtypen`',form3.dbgrid1);
end;
DLL-Funktionen:
Delphi-Quellcode:
procedure fetch_query1(p:pointer);
begin
@mysql_query1 := p;
end;
procedure fetch_ds1(p:pointer);
begin
ds1 := Tdatasource(p);
end;
exports
dllinit,dllfree,fetch_query1,fetch_query2,fetch_query3,fetch_command,fetch_ds1,fetch_ds2,fetch_ds3,init2;
hab halt noch einige sachen rausgelassen die den bock wohl nicht dünn machen
Also ich würde ja gerne direkt ein Tdbgrid an das Datasource auf der Oberfläche die die
DLL verwaltet hänten und ein
query ausführen können. Aber wenn das wohl nicht tut, müsste ich mir mein eigenes grid bauen und das dann "zu fuß" mit schleifen füllen o_O sowas ist unsauber
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!