Autor Téma: GetDynaMethod Exception  (Přečteno 136 krát)

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 81
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
GetDynaMethod Exception
« kdy: 13-07-2018, 09:28:37 »
Zdravíčko,

můj softík se mi trochu zbláznil. A jaksi nevím čím je toto zapřícíněno. Zdá se mi to že to je někde na eventu při zavření okna.

Screen z call stacku:

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1980
  • Karma: 85
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:GetDynaMethod Exception
« Odpověď #1 kdy: 13-07-2018, 09:30:53 »
Excellent
Rated 1 time
Ze ty uvolnujes control na ktery klikas myší?
Embarcadero MVP - Czech republic

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 81
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
Re:GetDynaMethod Exception
« Odpověď #2 kdy: 13-07-2018, 10:13:29 »
no nejsem si jist, spis bych rekl ze ne. Je to MDI applikace kde mam vytvoreny form a mam v nem nekolik prvku o objednavce, a tady tahle chyba se stane jednou za cas takze nemuzu prijit na to presne kde to tu chybu dela.
Akce co se stane po kliku na ulozit ci zrusit se zavola "SendMessage(Handle, WM_CLOSE, 0, 0);" - predtim jsou volany akorat fce bud na ulozeni do databaze nebo nic. pak akorat v eventu toho vytvorenyho form v onClose je pouze "Self.Free".

Takze jsem z toho trochu vykuleny :D

Offline vandrovnik

  • Hrdina
  • ****
  • Příspěvků: 429
  • Karma: 34
    • Verze Delphi: 10.2
Re:GetDynaMethod Exception
« Odpověď #3 kdy: 13-07-2018, 10:54:54 »
Excellent
Rated 1 time
no nejsem si jist, spis bych rekl ze ne. Je to MDI applikace kde mam vytvoreny form a mam v nem nekolik prvku o objednavce, a tady tahle chyba se stane jednou za cas takze nemuzu prijit na to presne kde to tu chybu dela.
Akce co se stane po kliku na ulozit ci zrusit se zavola "SendMessage(Handle, WM_CLOSE, 0, 0);" - predtim jsou volany akorat fce bud na ulozeni do databaze nebo nic. pak akorat v eventu toho vytvorenyho form v onClose je pouze "Self.Free".

Není lepší použít PostMessage? A v OnClose by mělo snad stačit Action:=caFree;

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2125
  • Karma: 114
    • Verze Delphi: D2007, XE3, DX10
Re:GetDynaMethod Exception
« Odpověď #4 kdy: 13-07-2018, 10:55:34 »
Excellent
Rated 1 time
akorat v eventu toho vytvorenyho form v onClose je pouze "Self.Free".
Tohle je v multiskingu hrubka, v normalni aplikaci asi jen prasarna: nemuzes destruovat instanci a pak v ni jeste chvili bezet. Normalni je, ze ten kdo instanci vytvoril, tak ji taky rusi.

Formulari by melo stacit nastavit ve FormClose akci na caFree.

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 81
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
Re:GetDynaMethod Exception
« Odpověď #5 kdy: 13-07-2018, 11:04:10 »
akorat v eventu toho vytvorenyho form v onClose je pouze "Self.Free".
Tohle je v multiskingu hrubka, v normalni aplikaci asi jen prasarna: nemuzes destruovat instanci a pak v ni jeste chvili bezet. Normalni je, ze ten kdo instanci vytvoril, tak ji taky rusi.

Formulari by melo stacit nastavit ve FormClose akci na caFree.

"Normalni je, ze ten kdo instanci vytvoril, tak ji taky rusi." // toto chapu ale nevim jak bych to resil , mam btn ktery na onclick vytvori form a udela Show (aby bylo mozne se prekliknout do jineho okna), ked by byl ShowModal tak pak bych vytvoreni formu dal do try - finally a tam uvolnovoval, ale jak to udelat kdyz to nemam v tryf ?

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2125
  • Karma: 114
    • Verze Delphi: D2007, XE3, DX10
Re:GetDynaMethod Exception
« Odpověď #6 kdy: 13-07-2018, 11:27:53 »
ale jak to udelat kdyz to nemam v tryf ?
No pokud ti nevyhovuje CloseAction, tak se to delava treba tak, ze posles vlastnikovi, ktery ten form vytvoril, asynchronne zpravu (tj. nebudes cekat, az ji dostane), ze jsi skoncil a at si uklidi. Jak psal Vandrovnik, delava se to pomoci PostMessage, treba
Kód: Delphi [Vybrat]
  1. PostMessage(Application.MainForm.Handle, UM_FORMCLOSED, self.Handle, 0);
  2.  

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 81
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
Re:GetDynaMethod Exception
« Odpověď #7 kdy: 13-07-2018, 11:32:57 »
Zkusím si s tím tedy pohrát, abych posílal vlastníkovi msg, Děkuji za rady :)

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 950
  • Karma: 43
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:GetDynaMethod Exception
« Odpověď #8 kdy: 13-07-2018, 11:37:55 »
Co je spatne na te destrukci pomoci OnClose? Napr. Delphi sablona MDI projektu pouziva pro MDI okna presne tento zpusob. Pro zavreni a uvolneni takoveho okna pak staci zavolat Close (Ty pro to zavreni hadam pouzivas vlastni tlacitko). Tedy napr.:

Kód: Delphi [Vybrat]
  1. type
  2.   TMDIChild = class(TForm)
  3.     Button1: TButton;
  4.     procedure Button1Click(Sender: TObject);
  5.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  6.   end;
  7.  
  8. implementation
  9.  
  10. procedure TMDIChild.Button1Click(Sender: TObject);
  11. begin
  12.   Close;
  13. end;
  14.  
  15. procedure TMDIChild.FormClose(Sender: TObject; var Action: TCloseAction);
  16. begin
  17.   Action := caFree;
  18. end;
« Poslední změna: 13-07-2018, 11:45:17 od Delfin »
I'm a soldier, so don't panic! I know the underground! No more Google, go duck, go!

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 1980
  • Karma: 85
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:GetDynaMethod Exception
« Odpověď #9 kdy: 13-07-2018, 12:05:38 »
na ulozeni do databaze nebo nic. pak akorat v eventu toho vytvorenyho form v onClose je pouze "Self.Free".

Kdyz uz, a je to form, tak pouzij misto Free metodu Release http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TCustomForm_Release.html
Embarcadero MVP - Czech republic

Offline xnukes

  • Mladík
  • **
  • Příspěvků: 81
  • Karma: 1
    • Verze Delphi: XE7
    • Bludspeed s.r.o.
Re:GetDynaMethod Exception
« Odpověď #10 kdy: 13-07-2018, 12:41:19 »
Tak jsem asi na to kluci prisel :) v child formu jsem to predelal na Close; a v onClose Action na caFree .. Jenze v tomto problém nebyl, problem sem nasel az v mym rozsirenym datagridu, ten child form ma totiz na sobe navesenou udalost z datagridu a to takovouhle:

Kód: Delphi [Vybrat]
  1. TDataGrid = class(TObject)
  2. ...
  3. procedure TDataGrid.OnCloseReloadGrid(Sender: TObject; var Action: TCloseAction);
  4. begin
  5.   TForm(Sender).Free;
  6.   ReloadGrid(Sender);
  7. end;

:D ten free tam byl kamen urazu ... zapsal jsem to tedy takhle:


Kód: Delphi [Vybrat]
  1. TDataGrid = class(TObject)
  2. ...
  3. procedure TDataGrid.OnCloseReloadGrid(Sender: TObject; var Action: TCloseAction);
  4. begin
  5.   Action := caFree;
  6.   ReloadGrid(Sender);
  7. end;

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: