Srodne teme
14.03.2002. Problem sa dll-ovima
18.04.2002. dll
01.08.2002. DLL
17.02.2003. ShowModal bez ShowModal
24.06.2003. dll missing
13.01.2004. JFrame showModal & Password storing
19.02.2011. pisanje .dll u VB-u?
12.07.2004. DLL-ovi u Delphiju?
18.07.2004. fale bridge.dll i resource.dll
20.03.2005. Ucitavanje DLL-a
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ShowModal u DLL-u, na TabSheet-u

[es] :: Pascal / Delphi / Kylix :: ShowModal u DLL-u, na TabSheet-u

Strane: 1 2

[ Pregleda: 3207 | Odgovora: 35 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon ShowModal u DLL-u, na TabSheet-u28.06.2022. u 09:29 - pre 21 meseci
Delphi XE 10.1

U Dll-u sam kreirao formu i data modl. Testirano, radi ok.

U OnShow event-u forme (u Dll-u) otvaraka konekcije na bazu, postavlja neke parametre...

Prebacio sam prikaz forme u TabSheet-u, sada zablokira program. Forma se prikaže ok, ali je nedostupna, ne može se pristupiti niti jednoj edit kontroli na njoj. Još jednom: kada nisam postavljao formu na TabSheet, kada joj nisam odredio parent, sve je radilo OK.
Probao sam kreirati formu u glavnog programu, ne pozivati ovu iz Dll-a, na isti način je prikati na TabSheet-u, tada radi.
Debugirao sam Dll, OnShow prođe cijeli, nigdje ne blokira.

Iz osnovne forme:
Code:

  function IzOnlineUAdresar(ID: integer; ParentControl: HWND): integer; stdcall; external 'C:\projekti\Xe\MySQLConnection\Win32\Debug\MySQLConnection.dll';
...
   i := IzOnlineUAdresar(i, TabSheet2.Handle);
   if i > 0 then ShowMessage('New IO:' + i.ToString);


Funkcija u Dll-u:
Code:

  function IzOnlineUAdresar(id: integer; ParentControl: HWND): integer; stdcall;
  begin
          frmUpisUAdresar := TfrmUpisUAdresar.CreateParented(ParentControl);
    // ovo sam dodao, mada ne treba...
          frmUpisUAdresar.ParentWindow := ParentControl;
   // Ovako je radilo:
   //    frmUpisUAdresar := TfrmUpisUAdresar.Create(nil);
        result := frmUpisUAdresar.ShowModal;
  end;


Ima li tko pojma o čemu se radi? Forma mora biti u TabSheet-u. Sada sve testiram u XE 10.1, a kasnije će program koji poziva funkciju iz Dll-a biti u D2007.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.107.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 13:29 - pre 21 meseci
Kao je to zamišljeno da radi, forma u TabSheet-u a poziva se sa ShowModal?
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 13:50 - pre 21 meseci
Mora se blokirati ostatak programa dok se ne završi obrada na formi iz Dll-a. Obrada vrati ID koji mi je kasnije protreban i kad njega obradim, može se koristiti ostatak programa.
Može bilo koje drugo rješenje, ovo mi je prvo palo na pamet...
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.107.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 14:06 - pre 21 meseci
Zašto mora biti u TabSheet-u?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 14:15 - pre 21 meseci
Forma je u dllu a glavna aplikacija u nezavisnom programu?

Ne moze to tek tako, VCL zavisi od TApplication i mnogih stvari a tu se desava da dll nema veze sa VCL/TApplication u glavnom programu.

Moras da radis kao da su to programi radjeni u Delphiju i C++, cist WinApi i Handle (HWND).

Probaj da formu u dllu napravis sa CreateParented i prosledis HWND parenta iz glavnog programa, sto je verovatno TabPage. Eventualno da napravis formu pa da onda setujes ParentWindow.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 16:19 - pre 21 meseci
Forma je u dll-u, a gnalvna app je u programu koji poziva taj dll.
Probao sam i sve radi ako radim show forme, ako radim showmodal tada blokira.
Probao sam sa CreateParented, provjerio sam HWND koji dođe u dll - ispravan je, ista priča - blokira. Isto je kao ako napravim Create, a kasnije dodijelim parent.
Provjeravao sam OnShow forme jer se tamo sve događa (učitavnja podataka iz baze, append u tablicu...). Prođu sve naredbe i nakon toga blokira.

Forma mora biti na tab-u jer je takav program, mora izgledati kao da je sastavni dio glavnog programa. Zbog nekih stvari koje ima u Xe, a nema u D2007 sam tako krenuo. Mogao sam zaobići, a sada mi se ne da raditi sve ispočetka, a i volio bih shatiti kako to napraviti.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
*.PPPoE-2106.sa.bih.net.ba.



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 17:41 - pre 21 meseci
Radi se o tome da ne možeš raditi ShowModal formi koja je u TabSheet-u, taman i da je forma u istoj aplikaciji. Moraš promijeniti logiku. Nije jasno šta tačno želiš postići sa ShowModal.
 
Odgovor na temu

bokinet

Član broj: 29844
Poruke: 574



+50 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u28.06.2022. u 22:42 - pre 21 meseci
Postoji osnovna razlika izmedju Show i ShowModal oko formi koja je da ovaj drugi nacin prikaza forme prikazuje formu po sistemu pitstop-a i privremenog zaustavljanja izvrsavanja koda dok se forma ne zatvori tj. ne izvrsi neka operacija/vrati neka povratna vrednost.

Prost primer MessageBox.
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.cpe.sn.co.rs.



+31 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 04:55 - pre 21 meseci
Probaj da blokiraš rad programa na neki drugi način i da izbegneš ShowModal.
Možda je duži put, ali rešićeš se frusrtacije u konačnom, pa kasnije probaj da nađeš rešenje.
Recimo da ISključiš glavnu formu pri pokretanju forme iz dll, a da je ponovno uključiš kod zatvaranja pomoćne forme
Code:

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
   if Form2 = nil then  Form2:= TForm2.Create(self);
    Form2.Visible:=true;
    Form1.Enabled:=false;
end;

.....

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:=caFree;
  Form1.Enabled:=true;
 Form2:=nil;
end;





[Ovu poruku je menjao Milan Milosevic dana 29.06.2022. u 06:17 GMT+1]
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.38.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 06:09 - pre 21 meseci
Problem je sto njemu iz nekog razloga forma treba u TabSheet-u i vjerovatno treba onemogućiti sve akcije na toj formi gdje je TabSheet.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 08:30 - pre 21 meseci
Eto, jedan dan popodne da ne palim komp....

Ta forma iz dll-a mora biti u tabshet-u jer je osnovni program tako koncipiran, ne mogu to mijenjati. Možda da na tabsheet postavim panel pa na njega novu formu. Bi li to što promjenilo?

Onako kako je napisao Milosevice sam probao napraviti, radi, ali je sada drugi problem: kako da znam da je ta forma iz dll-a zatvorena? Na njoj imam dva gumba: "Upiši" i "Odustani". Oni ili upišu podatke ili zaborave promjene i zatvore formu. Nakon toga se kontrola predaje osnovnom programu.
Ono što se radi na toj formi je dosta osjetljivo i ne želim ostaviti mogućnost da bilo što stranka promjeni na podacima dok se ne završi upis, a ako ostavim mogućnost, kladim se da hoće bez obzira što im kažem...

Sada mi je palo na pamet, idem probati: PageControl je na formi u osnovnom programu, preko cijele forme. Probat ću formu iz dll-a kreirati na toj formi i sakriti cijeli pagecontrol dok se ne završi posao na novoj formi...

U neke klase koje sam kreirao sam prosljeđivao procedure iz osnovne forme koje su se izvršavale u određenim uvjetima, a pozivale su se unutar klase. Može li tako i sa formom koja je u dll-u? Ako može, rješio sam problem: show forme, proslijedim joj proceduru iz osnovne forme koja se izvrši na gumb...
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 10:14 - pre 21 meseci
ShowModal definitinvno ne prolazi...
Rješio sam tako da kreiram u osnovnom programu proceduru koja odradi što treba nakon zatvaranja forme iz dll-a.
Sada se pojavio drugi problem:

Testirao sam tako što sam kreirao formu u test programu, van dll-a i napravio s njom što treba - radi OK. Kada sam to napravio s formom u dll-u javlja mi: "Control frmUpisUAdresar' has no parent window"
Potpuno jednako sam napravio kao s formom koja radi.
u osnovnom programu:
Code:

   DBGrid1.Visible := false;
   frmProbaUpisa := tfrmProbaUpisa.Create(nil);
   frmProbaUpisa.Parent := TabSheet1;
   frmProbaUpisa.ProcGotovo := Gotovo;
   frmProbaUpisa.Show;


Za formu u dll-u:
U osn. programu:
Code:

   i := qWebID.AsInteger;
   DBGrid1.Visible := false;
   i := IzOnlineUAdresar(i, Application, TabSheet1, Gotovo);
   if i > 0 then ShowMessage('New IO:' + i.ToString);

u dll-u:
Code:

function IzOnlineUAdresar(id: integer; Owner: TApplication; ParentControl: TWinControl; ProcKraj: tGotovo): integer; stdcall;
begin
        frmUpisUAdresar := TfrmUpisUAdresar.Create(nil);
        frmUpisUAdresar.Parent := ParentControl; // ova linija javlja grešku
        frmUpisUAdresar.ProcKraj := ProcKraj;
        frmUpisUAdresar.Show;
end;

 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.cpe.sn.co.rs.



+31 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 11:46 - pre 21 meseci
Jedostavno disable sve komponente koje ti netrebaju na formi kad prkažeš formu iz dlla, i ponovno ih uključi kada formu obrišeš.
Nemaš valjad hiljadu edit polja i dugmeta na formi. Ukoliko ih imaš previše možeš da vršiš prebrojavanje svih komponenata na formi i tako da ih isključiš ili uključiš.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 11:49 - pre 21 meseci
Milane, nism shvatio. Diseble komponenti na formi u osnovnom programu ili na formi iz dll-a? Kako će to utjecati na poruku da forma iz dll nema parent window?
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.cpe.sn.co.rs.



+31 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 12:21 - pre 21 meseci
Citat:
FranjoZG: Milane, nism shvatio. Diseble komponenti na formi u osnovnom programu ili na formi iz dll-a? Kako će to utjecati na poruku da forma iz dll nema parent window?

Sad ja tebe nisam razumeo?

Ako sam dobro shvatio ti imaš Formu u bibljoteci koju pozivaš iz svoje aplikacije i lepiš je na TabSheet koji se nalazi na glavnoj formi aplikacije.
Želiš da korisnik ne može da menja ništa drugo dok ne odabere i klikne neko od dva dugmeta u dll formi.
Kad odabere, verovatno se nešto događa i dll forma se gasi, a sve ostale opcije su ponovo dostupne?
Ako na to misliš onda kad aktiviraš dll formu, isključiš sve ostale komponente na glavnoj formi.
Kad ugasiš dll formu onda opet uključiš sve elemente na glavnoj formi.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 12:33 - pre 21 meseci
Milane, to je jasno. Rijšio sam. Sada mi je problem što mi forma iz dll-a javlja da nema parent window u trenutku kada kažem:
frmUpisUAdresar.Parent := ParentControl;
ParentControl je tabsheet kao parametar koji prosljeđujem u dll funkciju gdje se kreira forma.
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 932
*.cpe.sn.co.rs.



+31 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 12:40 - pre 21 meseci
Probaj sa
Code:

Function MilSetParent(hWndChild: THandle; hWndNewParent: THandle): THandle;
  stdcall; external 'user32.dll' name 'SetParent';


da podesiš parent.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.105.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 13:06 - pre 21 meseci
Funkciji u dll proslijedi HWND i kreiraj sa CreateParented.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.xnet.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 13:11 - pre 21 meseci
Almedin: probao, javlja istu grešku...
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.105.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u29.06.2022. u 13:41 - pre 21 meseci
Dll
Code:
library DllForm;

uses
  SysUtils,
  Classes,
  Windows,
  frmDll in 'frmDll.pas' {Form1};

{$R *.res}

procedure Dll_CreateForm(AParent: HWND);
var
  f: TForm1;
begin
  f := TForm1.CreateParented(AParent);
  f.Show;
end;

exports
Dll_CreateForm;

begin

end.


App
Code:
unit frmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

procedure Dll_CreateForm(AParent:HWND); external 'DllForm.dll';

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Dll_CreateForm(Panel1.Handle);
end;

end.


Ovo radi kod mene.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: ShowModal u DLL-u, na TabSheet-u

Strane: 1 2

[ Pregleda: 3207 | Odgovora: 35 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.