Chyba MDI v XE a XE2

vložil Igor Gottwald 18. října 2011 22:51

Igor Gottwald mi poslal popis řešení problému ohledně chyby knihovny Dialogs/Vcl.Dialogs při používání MDI.

Jedná se o problém, kdy vývojář do okna MDIChild umístí více editačních prvků a v některém z nich, při jeho opuštění (OnExit) zobrazí uživateli standardní hlášení (ShowMessage, MessageDlg nebo TaskMessageDlg).

V takovém případě, pokud aplikace používá Runtime Themes (což je ve výchozím nastavení vždy, viz. nastavení Project Options / Application), dojde ke zcela nečekanému a nevhodnému chování aplikace, kdy uživatel není schopen správně umístit textový kurzor, přepínat se mezi editačními prvky a vkládat do nich text. Aby se chování obnovilo do správného stavu, musí uživatel kliknout na jiné editační pole a stisknout tabulátor, což po něm těžko vývojář může požadovat. Navíc, ani to vždy nepomůže. Přitom informovat o nějakém stavu či události uživatele v metodě OnExit není až tak nečekaný postup.

Naopak, problém nenastane, pokud nedojde ke změně aktivního prvku (tj. metodou SetFocus se podrží aktivní pole, v jehož metodě OnExit se vypisuje hlášení, anebo je vygenerována výjimka). Tj. chybové hlášení zabraňující opuštění editačního pole funguje správně.

Jak jsem již uvedl, problém je hluboko uvnitř knihovny Dialogs. Ačkoliv jsem problém nahlašoval na Quality Central koncem dubna a byl identifikován, dostal se i do Delphi XE2. Přitom jeho odstranění je velmi jednoduché.

Naneštěstí vývojář si tak snadno nepomůže a musí zkopírovat celou knihovnu Dialogs.pas, resp. Vcl.Dialogs.pas. Pote ji musí upravit a přilinkovat do svého projektu.

Pro opravu chyby vyhledejte v knihovně Dialogs/Vcl.Dialogs tělo metody TCustomTaskDialog.Execute.

Zde pak stačí opravit jediný řádek a tím je první podmínka:

  if Assigned(Screen.ActiveForm) then
na
  if Assigned(Screen.ActiveForm) and
    not (Screen.ActiveForm.FormStyle in [fsMDIForm, fsMDIChild]) then

Tato drobná úprava zajistí, že se program v popsaném postupu začne chovat normálně.

Bohužel, dokud Embarcadero tuto chybu neopraví, je nutné takto upravenou knihovnu Dialogs přidávat do všech programů, které používají MDI okna (pokud se u Vás toto vyskytuje). Dobrou zprávou je, že tato úprava nijak nenaruší stávající projekty a i knihovny třetích stran fungují zpravidla normálně.

S pozdravem Igor Gottwald

Tagy: , ,

Praxe

Komentáře

25.10.2011 17:10:52 #

JaroB

Docela by mne zajímalo jestli EMBT vydá opravu i pro XE. Ale tipnul by si, že ne, pro ně to je už historie.

JaroB

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců