[ FranjoZG @ 25.11.2021. 13:28 ] @
Pokušavam i ne uspjevam....

DLL kreiram u Delphi XE 10.1
u njemu je dodan TDataUnit na kom su kontrole za konekciju na MySQL i qry za dohvat podataka
Pozivom proc. "Connect" otvaram konekciju i qry

Main program u Delphi 2007
trebao bi doći do DataSourc-a iz DLL-a kako bih ga konektirao na DBGrid.

Da li to uopće moguće?
[ Rapaic Rajko @ 26.11.2021. 10:16 ] @
Nije najjasnije iz posta kako si zamislio sve.
Namece se pitanje zasto nisi koristio package, ali verovatno ima razlog (kompatibilnost)?

Pitanja:
1. U TDataUnit-u se nalazi i trazeni DataSource, tacno?
2. Connect je samo procedura, bez parametara?
3. Kako si postavio deklaraciju procedure Connect: std, cdecl ili pascal?

Krenemo od ovoga, pa ce se videti kako dalje.
[ FranjoZG @ 27.11.2021. 23:08 ] @
Odustao sam od te varijante, nisam uspio naći rješenje. Riješio sam problem tako da sam sav posao koji treba odraditi prebacio u DLL. Kreirao sam forme i data unit unutar DLL-a.

Program je u D2007
DLL je u D XE 10.1

Sada se pojavljuje problem sa resizanjem forme koja je kreirana u DLL-u. Želim da bude maksimizirana na svom parentu.
Parent forme je TTabSheet.
Forma se pokreće maksimiziran na trenutnoj veličini parenta, ali se kod resizanja parenta ne resize forma.

Pokušao sam mjenjati parametre forme:
- Anchors (isto je ako stavim sve na true ili sve na false)
- Position (nema efekta)
- WinodwState = wsMaximized

Pokušao sam u Form1.FormShow staviti self.WindowState := wsMaximized

Forma nema border, tj. BorderStyle = bsNone jer se treba prikazati kao dio D2007 programa.

Iskušao sam DLL u test programu, sve radi uredno osim samog prikaza forme.

Ideje? Savjeti?


[ savkic @ 29.11.2021. 09:53 ] @
Nema sanse da koristis TDataset iz dlla u glavnom programu ako su razlicite verzije Delphija.
Nisam siguran ni za iste verzije, moze preko paketa (sto je zapravo dll uz neki dodatak).

Zelis da napravis formu u dllu a da ga koristis u glavnom programu? Razlicite verzije Delphija?
[ FranjoZG @ 29.11.2021. 10:20 ] @
Da, različite verzije programa. Glavni program je u D2007, a DLL u Delphi XE 10.1
Zašto? Moram koristiti podatke s Web-a (MySQL) i tu imam problema. Korisitio sam ZEOS, ali mi je počeo javljati greške (internal error...), a ne isplati se kupovati nešto ozbiljnije jer je za samo jedan projekt. Ne mogu prepisati program u XE jer neće platiti i tako... krpam...

Napravio sam DLL koji u sebi ima sve: formu koju prikazuje, konekciju na bazu, dataset... radi dobro. Popravljam još neke greške, ali je OK.
[ tkaranovic @ 29.11.2021. 12:22 ] @
Neki tamo Delphi 1 u demos je imao primer kako se kreira forma.
Ne mogu da nadjem taj primer a posto je bilo pre puno godina ne secam se ali mi se cini da se formirala odvojeno od main forme.
Ima novijih promera ali svi rade odvojeno od main forme.
Nisam pravio tako nesto tako ne znam sta bi falilo za resize.

Rekao bi da se odvojeno promaju WM_ poruke i fali nesto sto bi povezalo potpuno.

Recimo, u tom cluacju mozda moze da pomogne nesto kao:

application.handle:=GetExeHandle; // GetExeHandle - How to learn?

Taj primer sam izguglao trzaci application.handle a na tom linku pise:

The only time your DLL shows a dialog box is when the host application calls a function from your DLL.
Include the parent window handle as one of the function's input parameters so that the EXE can
tell you which handle to use. Do not attempt to discover the handle yourself. As a library developer,
you cannot guess what the host application is doing.

If you don't want to include the handle on every function call, then add an initialization function
that users of the DLL need to call before any other functions. Pass the handle in the initialization
and then store it in a variable in your DLL so that other functions can use the value when they need it.

To sam guglao jer pretpostavljam da tako nesto fali ali koliko moze da pomogne za recimo resize nemam pojma.
[ savkic @ 29.11.2021. 13:19 ] @
OK, to je moguce i koristio sam ali u istoj verziji Delphija. Da li ce raditi iz razlicitih nisam siguran (ako ne radi, napravi standalone pomocni program ciji ces prozor udenuti u glavni program).

Bitna stvar je da oba koriste isti MM, moras u dllu imati ovako nesto:

Code:


procedure Init(const MemMgr: TMemoryManager);
begin
  SetMemoryManager(MemMgr);
end;

exports Init;

U glavnom programu, 
var
  MemMgr: TMemoryManager;
begin
  GetMemoryManager(MemMgr);
  Init(MemMgr);

  // Dalje pozivas dll metodu koja prikazuje formu i radi sta treba
end;



[ _deran_ @ 30.11.2021. 08:04 ] @
BPL mora biti kompajliran u istoj verziji delphi-a koji ga koristi. To mu je mana u odnosu na DLL.
[ FranjoZG @ 30.11.2021. 09:54 ] @
Napravio sam i dobro funkcionira. Predao sam izmjene programa stranic i (bar za sada) se nisu javili da nešto ne štima.

U XE Dll-u ima export procedure:
Code:

  procedure SynApp(App: THandle; Parent: HWND); stdcall;
  begin
    Application.Handle := App;
    if not Assigned(Form1) then begin
       Form1 := TForm1.CreateParented(Parent);
    end;
    Form1.Show;
  end;

  procedure Disconnect; stdcall;
  begin
    Form1.Close;
    FreeAndNil(Form1);
  end;                     


"Parent" je ttabsheet na kom se prikazuje forma "Form1" koja je maximizirana. Bodući da je main program uvijek maximiziran nemam problema s maksimiziranjem Form1. Problem je ako main program nije maximizira je se kanije Form1 ne može maksimizirati (nema border niti gumbe za max.)

U Form1.OnClose radim free objekata, data modula i svega ostaloga...

U Main programu pozivam proceduru:
deklarirane public varijable:
Code:

     var
       MySqlDisconect: tMyDisconect;
       MySqlSynApp: tSynApp;
       MySqlHandle: THandle;


Procedura:
Code:

    ...
     Screen.Cursor := crHourGlass;
     try
        if MySqlHandle = 0 then MySqlHandle := loadLibrary('MySQLConnection.dll');
        if MySqlHandle <> 0 then begin
           @MySqlSynApp := GetProcAddress(MySqlHandle, 'SynApp');
           @MySqlDisconect := GetProcAddress(MySqlHandle, 'Disconnect');
           MySqlSynApp(MainFrm.Handle, tsWeb2.Handle);
        end else   
           showMessage ( 'DLL MySQLConnection nije pronađen...' );
     except
     end;
     Screen.Cursor := crDefault;


I konačno, da ne bi program javljao errore kod Form.Close
Code:

TMainFrm.FormClose(Sender: TObject; var Action: TCloseAction);
...
  if MainPageControl.ActivePage = tsWeb2 then MySqlDisconect;
  if MySqlHandle <> 0 then FreeLibrary(MySqlHandle);

[ FranjoZG @ 01.12.2021. 13:39 ] @
Da ne otvaram novu temu...

Na formi koju kreiram u DLL-u dinamički kreiram TEdit-e. Na njima ne rade strelice lijevo-desno! Riješio sam tako da sam na OnKeyUp napravio preko selstart, ali mi nije jasno o čemu se radi budući da se uredno može upisivati u Edit-e.
[ savkic @ 01.12.2021. 14:28 ] @
VCL ima neke svoje obrade za brdo tastera i kombinacija, mozda to salje drugoj aplikaciji ili formi (glavnoj) ili se negde zagubi u tom procesu.
Jedino da pustis kroz debugger dok ne vidis gde zavrsi.
[ FranjoZG @ 01.12.2021. 14:36 ] @
U test programu, koji ne koristi DLL već se taj dio koda uzme kao obična forma, radi sve OK. U programu gdje ga koristim kao DLL, ne mogu debagirati. Nadao sam se da je netko već imao takovih problema...
[ savkic @ 02.12.2021. 06:37 ] @
Debagujes formu u dllu, ne u glavnom programu.
[ tkaranovic @ 02.12.2021. 10:53 ] @
Moze ovako da se provri:

Code (delphi):


    FOnAppMessage := Application.OnMessage;
    Application.OnMessage := AppMessage;


procedure TMainForm,AppMessage(var Msg: TMsg; var Handled: Boolean);

    if (Msg.message >= WM_KEYFIRST) and (Msg.message <= WM_KEYLAST) then
    begin
    end;

    if assigned(FOnAppMessage) then
      FOnAppMessage(Msg, Handled);