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: 3262 | 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
*.gs1hr.org.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 12:17 - pre 21 meseci
Hvala Almedin, radi. Probao sam to, ali sam očito nešto propustio...

Sada imam novi problem! Testiranje sam radio tako što sam test program i dll radio u Delphi XE 10.1 Sada pokušavam dll ugraditi u program koji je rađen sa Delphi 2007.
Javlja mi greške. Provjerio sam parent koji šaljem u dll na kom se mora prikazati forma iz dll-a. To sam prmjenio, više nije tSheet već je forma iz osnovnog programa. Probano u testu - radi. Kada to napravim sa D2007, javalja greške, a naziv forme (drugačije ne mogu provjeriti što dobije dll) je nečitljiv (kineska slova).

Javlja čudno grešku: "EReadError, Error reading edNeki.Items.Strings: sysem error. Code: 1400. Invalid window handle"
kontrola edNeki je TDBComboBox sa zadanim stavkama.

Šaljem formu, a ne Handle forme jer moram preuzeti OnREsize forme iz glavnog programa da bi mi se forma iz dll-a ispravno prikazala pri promjeni veličine.

Dll učitavam dinamički. Ovo je definicija funkcije:
Code:

  tIzOnlineUAdresar = function(ID: integer; Owner: TApplication; ParentControl: TForm; PorcKraj: tGotovo): integer; stdcall;

ProcKraj je proc. iz osnovnog programa koje se poziva kada se završi rad na formi iz dll-a i kada se ta forma zatvori.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.39.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 12:23 - pre 21 meseci
Nemoj raditi tako. OnResize napravi u dll formi i postavi joj Align na alClient.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.gs1hr.org.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 12:37 - pre 21 meseci
Kako da znam u dll-u da je osnovna forma napravila resize ako ne preuzmem njezin OnResize?
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.39.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 12:39 - pre 21 meseci
Tako sto postaviš Align na alClient i forma u dll ce se sama resizati.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.39.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 12:41 - pre 21 meseci
A može i drugačije, ako tinto ne odgovara. U dll kreiras i exportujes funkciju npr Dll_FormResize(w, h: integer) i pozivas je iz glavnog programa.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.gs1hr.org.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 14:49 - pre 21 meseci
Rješio sam manje-više sve. Radi ok. Sada se javlja problem koji ne znam kako riješiti. Zakuhao sam si bez veze, moglo je i drugačije, ali mi je u trom trenutku izgledalo baš zgodno rijšiti to sa dll-om...
Prilikom zatvaranja glavnog programa javlja mi "Acces violation at adress... in module 'Msftedit.dll'"

Koliko vidim po net-u radi se o richedit kontroli. Nigdje je ne koristim !!!

Dinamički pozivam dll:
Code:

      MySqlHandle := loadLibrary('C:\projekti\Xe\MySQLConnection\Win32\Debug\MySQLConnection.dll');
       @MyIZOnlineUAdresar := GetProcAddress(MySqlHandle, 'IzOnlineUAdresar');
       MyIZOnlineUAdresar(qWebID.AsInteger, Application, Form4.Handle, Gotovo); 


Procedura "gotovo" je us glavnom programu, a poziva se na gumb u formi iz dll-a: "Upis" ili "Odustani".
Code:

   FreeUpisUAdresar;
   if form4.MySqlHandle <> 0 then begin
      FreeLibrary(form4.MySqlHandle);
      form4.MySqlHandle := 0;
   end;
   Form4.UpisStarted := false;
   if Odgovor > 0 then ShowMessage('Upisano') else ShowMessage('NIJE upisano');


Procedure "FreeUpisUAdresar" je u dll-u:
Code:

    if Assigned(frmUpisUAdresar) then 
       FreeAndNil(frmUpisUAdresar);
    if Assigned(dm) then
       FreeAndNil(dm);   


Nigdje se na javlja greška, osim kada zatvaram cijeli program.
 
Odgovor na temu

Almedin

Član broj: 5895
Poruke: 425
109.175.38.*



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 15:09 - pre 21 meseci
U proceduri gotovo uništavaš formu iz koje je prozivaš?
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.gs1hr.org.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 15:20 - pre 21 meseci
U jednoj proceduri osnovnog programa
- učitavam dll,
- pozivam proceduru u dll-u koja kreira formu

U drugoj proceduri u osnovnom prog.
- pozivam proceduru iz dll-a koja uništava formu
- radim freelebrary

Te provedure ne javljaju greške, greška se javlja kad zatvaram program.

[Ovu poruku je menjao FranjoZG dana 30.06.2022. u 17:48 GMT+1]
 
Odgovor na temu

Almedin

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



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u30.06.2022. u 17:32 - pre 21 meseci
Šta radi procedura "gotovo" i odakle se poziva?
 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u01.07.2022. u 06:18 - pre 21 meseci
Citat:
Te provedure ne javljaju greške, greška se javlja kad zatvaram program.

Verovatno oslobađaš nešto što ne postoji.
 
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-u01.07.2022. u 08:32 - pre 21 meseci
Porc. "gotovo" je u osnovnom programu, prosljeđujem ju formi u dll-u. Iz forme se pozivana nakon klika na gumbe "Upiši" ili "Odustani". Ako se klikne na upiši - vraća ID novog zapisa, a ako se klikne na odustani - vraća -1.
Kreiranje, upis i destroy forme u dll-u radi ok, više puta uzastopno, ne javlja grešku. Greška se javlja kada zatvram osnovnu formu, tj. program. Prije toga pozivam "gotovo". U OnClose osnoven forme nema ništa pametno niti išta što bi moglo izazvati grešku...

Nemam više ideje gdje tražiti grešku. Koliko vidim po net-u, taj 'Msftedit.dll' ima veze sa richedit kontrolom, a nju ne koristim nigdje u test programu. Još ću probati izbaciti JVCL kontrole (datetimepicker) i staviti delphi-jeve.

Code:

procedure Gotovo(Odgovor: integer);
begin
   FreeUpisUAdresar; // proc. u dll-u koja uništava formu i data modul
   if form4.MySqlHandle <> 0 then begin 
      FreeLibrary(form4.MySqlHandle);
      form4.MySqlHandle := 0;
   end;
   Form4.UpisStarted := false;  // indikator da nije aktivna forma iz dll-a
   if Odgovor > 0 then ShowMessage('Upisano') else ShowMessage('NIJE upisano');
end;


proc. FreeUpisUAdresar (u dll-u)
Code:

  procedure FreeUpisUAdresar;
  begin
    if Assigned(frmUpisUAdresar) then 
       FreeAndNil(frmUpisUAdresar);
    if Assigned(dm) then
       FreeAndNil(dm);   
  end;


Proc. u osnovnom programu:
Code:

procedure TForm4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if UpisStarted then begin
     ShowMessage('Zatvorite upis');
     Action := caNone;
   end else Action := caFree;
end;


Našao sam u čemu je problem !!! Glava pa u zid... U formi (u dll-u) kreiram datamodul, a nigdje ga ne uništavam. Kad sam stavio dm.free sve radi i ne javlja grešku. Mada, prilično glupa poruka.

[Ovu poruku je menjao FranjoZG dana 01.07.2022. u 10:47 GMT+1]
 
Odgovor na temu

Almedin

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



+27 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u01.07.2022. u 11:37 - pre 21 meseci
Pa imaš FreeAndNil(dm) koji uništava dm.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 298
*.static.a1.hr.



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u03.07.2022. u 18:41 - pre 21 meseci
Ovo kao da je ukleto, popravim jedno - ne radi drugo...
U petak nije bilo te greške. Vjerojatno sam nešto izmjenio, ali ne znam što. Vratio sam na staro sve čega sam se sjetio.

Forma iz dll-a ne prihvata ENTER.
Poziv iz glavnog programa:
Code:

procedure tForm4.Button1Click(Sender: TObject);
var i: integer;
begin
   i := qWebID.AsInteger;
   DBGrid1.Visible := false;
   UcijajFunk;
   IzOnlineUAdresar(i, Application, Form4.Handle, Gotovo);
end;


Kod u dll-u (ima viška koda, čistit ću kasnije):
Code:

        frmUpisUAdresar := TfrmUpisUAdresar.CreateParented(ParentControl);
        frmUpisUAdresar.IDUnosa := id;                 
        frmUpisUAdresar.Left := 0;
        frmUpisUAdresar.Top := 0;
        frmUpisUAdresar.WindowState := wsMaximized;
        frmUpisUAdresar.Align := alClient;
        Application.ProcessMessages;
        frmUpisUAdresar.Show;
        frmUpisUAdresar.Align := alClient;
        frmUpisUAdresar.Anchors := [akLeft, akTop, akBottom, akRight];
        frmUpisUAdresar.ProcKraj := ProcKraj;
        Application.ProcessMessages;
        frmUpisUAdresar.dbeJMBG.SetFocus;


kod u unit-u forme:
Code:

procedure TfrmUpisUAdresar.FormActivate(Sender: TObject);
begin
   ShowMessage('activate');
   PrikaziPodatke;
end;

procedure TfrmUpisUAdresar.dbeJMBGKeyPress(Sender: TObject; var Key: Char);
begin
   if Key = #13 then SelectNext(sender as TWinControl, true, true);
end;


Poroc. PrikaziPodatke učitava podatke iz baze...

GREŠKA:
- kursor je u tdbEdit-u "dbeJMBG"
- pritiskom na slova aktivira se OnKeyPress, dbeJMBG prihvaća unos
- pritiskom na ENTER aktivir se gumb iz glavnog programa "tForm4.Button1Click" i ide na ponovno kreiranje forme iz dll-a
- TAB kreće po kontrolama glavnog programa, a ne po vidljivoj formi iz dll-a.

Pokušao sam proceduru u kojoj se kreira forma promjeniti u funkciju koja vraća TWinControl, pa u glavnog programu dodao: NovaForm.SetFocus; nište se ne mijenja

Izgleda mi kao da je Button1 zadržao fokus.

Probao sam na obje forme staviti:
Code:

KeyPreview := true;

Ne pokrene se OnKeyPress na niti jednoj formi.



[Ovu poruku je menjao FranjoZG dana 03.07.2022. u 20:37 GMT+1]
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

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



+4 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u04.07.2022. u 09:59 - pre 21 meseci
Još jedna zanimljiva pojava:
na osnovnoj formi imam nekoliko gumba, TEdit i TDBLookupComboBox. Nakon prikaza forme iz dll-a i postavljanja kursora na neko polje za unos, TAB mi se kreće po osnovnoj formi, a ne po formi iz dll-a. Ako s tab-om postavim fokus na TEdit ili TDBLookupComboBox tada se na formi iz dll-a, nakon pritiska na ENTER aktivira OnKeyPress, a ako je aktivan gumb na osnovnoj formi, forma iz dll-a ne doživljava ENTER.

Ima li tko ideju o čemu se radi. Rokovi su me davno prestigli...
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u06.07.2022. u 05:16 - pre 21 meseci
Ovo vec ima veze kako VCL handluje keyboard u embeded formama, vidi da stavis OnShorcut event na dll formu (iskljuci KeyPreview na glavnoj) i proveri da li se poziva za enter. Ako ne onda stavi OnShortcut u glavnoj formi (isprobaj razne kombinacije KeyPreview).

Ako se event poziva za pritisak na Enter onda ga ili tu hendluj (proveri da li je aktivan edit koji ti treba) ili pusti kroz debugger i udji u VCL kod i gledaj red po red gde dalje ide na izvrsavanje (ActionList, MainForm, form, kontrola, application...) pa ga tamo hvataj.
 
Odgovor na temu

tkaranovic
Tomislav Karanović
Beograd

Član broj: 220507
Poruke: 307



+18 Profil

icon Re: ShowModal u DLL-u, na TabSheet-u06.07.2022. u 13:27 - pre 21 meseci
Da dodam:

Pravio sam sa WebBrowser komponentom slicno prikazivanje ali to je poseban slucaj radilo je kao odbojen progra.
Recimo kao je fokus na WebBrowser posle alt i enter se pojavi meni main prozora.
Znaci ne prva stavka u main meniju nego default meni prozora koji se pojavljuje kad se klikne na ikonu prozora.
Ako tako radi i dll radu slicno. Ako ni to ne radi onda radi bas razlicito iz dll.

Inace jos uvek pisem i gledam ove poruke sa WebBrowser komponentom.

Plus: Application ima kreiranje forme (CreateForm) i kad bi se tako mogla kreirati mozda bi drugacije radila.
 
Odgovor na temu

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

Strane: 1 2

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

Postavi temu Odgovori

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