Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DBgrid in DLL Problem (https://www.delphipraxis.net/57218-dbgrid-dll-problem.html)

supermuckl 17. Nov 2005 12:38


DBgrid in DLL Problem
 
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 :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz