Autor Téma: Form.Show(modal) + SetFocus  (Přečteno 5439 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4224
  • Karma: 37
    • Verze Delphi: XE7 professional
Form.Show(modal) + SetFocus
« kdy: 23-08-2012, 11:28:56 »
Chcel som si to najprv pozrieť v helpe.
Požaduje "C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\Help\Doc\rad.HxS"
Ale na disku rad.HxS neexistuje.

K otázke. Vytváram formulár programovo   Application.CreateForm(TMyform,Myform). Ak požijem
Myform.ShowModal +xxx.SetFocus v Myform.onShow či Myform.onCreate
tak to funguje

Pri Myform.Show neviem programovo nijako získať focus. Ani takto

Application.CreateForm(TMyform, Myform);
Myform.Show
Myform.xxx.SetFocus či Myform.SetFocus

Ďakujem za vysvetlenie.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Form.Show(modal) + SetFocus
« Odpověď #1 kdy: 23-08-2012, 21:32:55 »
Application.CreateForm(TMyform, Myform);
Myform.Show
Myform.xxx.SetFocus či Myform.SetFocus
Nevim, jestli rozumim tvemu popisu, ale pokud se jedna o VCL, na tom formulari je alespon jeden focusable widget a neni to nejak zablokovane, tak nevidim duvod, proc by Myform.xxx.SetFocus nemelo prenest focus na xxx, je-li potomkem TWinControl tj. ma svoje wokenni handle. Myform.SetFocus moc smysl nedava, to by se melo po Show stat automaticky, pokud nejak nezasahujes do mechanismu zobrazeni formulare.

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1121
  • Karma: 41
    • Verze Delphi: 7, 2010
Re:Form.Show(modal) + SetFocus
« Odpověď #2 kdy: 24-08-2012, 07:31:39 »
K otázke. Vytváram formulár programovo   Application.CreateForm(TMyform,Myform). Ak požijem
Myform.ShowModal +xxx.SetFocus v Myform.onShow či Myform.onCreate
tak to funguje

ma to znamenat, ze v onShow pouzivas ShowModal toho stejneho formulare? a to ti vazne jde? :D

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Form.Show(modal) + SetFocus
« Odpověď #3 kdy: 24-08-2012, 08:06:01 »
ma to znamenat, ze v onShow pouzivas ShowModal toho stejneho formulare? a to ti vazne jde? :D
Proboba, proc bych v OnShow volal znovu Show :o :o

Obavam se, ze vubec tvemu popisu problemu  nerozumim. Asi mi to budes muset napsat nejak polopaticky  :)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4224
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:Form.Show(modal) + SetFocus
« Odpověď #4 kdy: 24-08-2012, 08:07:08 »
// ma to znamenat, ze v onShow pouzivas ShowModal toho stejneho formulare? a to ti vazne jde?
Nie! Tam používam SetFocus. A ten pri konštrukcii

Application.CreateForm(TMyform, Myform);
Myform.Show;

nefunguje. Zatiaľ čo pri

Application.CreateForm(TMyform, Myform);
Myform.ShowModal;

Funguje. A ja neviem prečo.

// Myform.SetFocus moc smysl nedava, to by se melo po Show stat automaticky, pokud nejak nezasahujes do mechanismu zobrazeni formulare.

To bol iba pokus, lebo ten focus formulár nezíska automaticky (pri použití Show). Ale ani takto.

Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Form.Show(modal) + SetFocus
« Odpověď #5 kdy: 24-08-2012, 08:54:58 »
Application.CreateForm(TMyform, Myform);
Myform.Show;

nefunguje. Zatiaľ čo pri

Application.CreateForm(TMyform, Myform);
Myform.ShowModal;

Funguje. A ja neviem prečo.
Presne to nevim, ale zakladni rozdil je v tom. ze pri show se spusti cirkus visible changed atd. a pak se udela BringToFront, takze OnShow se vola v dobe, kdy okno nemusi byt nutne na popredi a tim nemuze dostat focus), zatimco u ShowModal se dela RecreateWnd, kde se jednak spusti cast changed cirkusu, dvak se explicitne upravuje focused list,form apod. a pak se teprve vola Show, jehoz dusledkem je OnShow.

My nepouzivame standardni VCL a pro podobne ucely mame asynchronni event AfterShow.

Ale
Kód: Delphi [Vybrat]
  1. MyForm.Show;
  2. MyForm.edit1.SetFocus;
  3.  

by ti melo fungovat.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4224
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:Form.Show(modal) + SetFocus
« Odpověď #6 kdy: 24-08-2012, 09:15:45 »
Mňa to zaujíma čisto akademicky. Všade som nahodil ShowModal a je pokoj. Len som sa predtým čudoval, prečo nemám focus, keď to doteraz fungovalo - v iných projektoch. Ale vždy som mal ShowModal.

Tvoj príklad by mal, ale nefunguje! To som skúšal. A okno je v popredí - aspoň na obrazovke.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Form.Show(modal) + SetFocus
« Odpověď #7 kdy: 24-08-2012, 09:23:24 »
Tvoj príklad by mal, ale nefunguje! To som skúšal. A okno je v popredí - aspoň na obrazovke.
Doufam, ze se bavime o VCL a ne o opici... To je divny: zkousel jsi to  na uplne novem formulari, na ktery si das treba edit1, edit2 a edit2 a  po Show() udelas  MyForm.edit3.SetFocus?

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4224
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:Form.Show(modal) + SetFocus
« Odpověď #8 kdy: 24-08-2012, 09:30:48 »
Áno VCL. Ako som písal, skúšal som to v

MyForm.onShow aj MyForm.Create. V prípade MyForm.Show som skúšal aj po tomto príkaze. Vždy sa to správa rovnako. Pre prax mi postačuje ShowModal len nerozumiem rôznemu správaniu sa.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2525
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Form.Show(modal) + SetFocus
« Odpověď #9 kdy: 24-08-2012, 09:51:22 »
MyForm.onShow aj MyForm.Create.
Jak jsem psal, v OnShow s tim budou nejspis problemy, protoze pri jeho volani jeste neprobehlo BringToFront. V Create to z principu nemuze fungovat (zmena focusu se aplikuje na zobrazene prvky zarazene v hierarchii vsech visualnich prvku na obrazovce)

V prípade MyForm.Show som skúšal aj po tomto príkaze.
No a to je prave divny, protoze to normalne fungovava (za predpokladu, ze nemas nekde neco Disabled a prvek, kterych chces focusnout, je z pohledu OS okno tj. ma handle tj. je potomkem TWinControl.

Tu odlisnost jsem se ti snazil v kostce uz popsat: komunikace (nejen) s OS je pres zpravy, ktere se normalne   obsluhuji v Application tzv. message loop a kdyz udelas show, tak jen zobrazis prvek a pokusis se ho prenest  do popredi. Zatimco pri Show modal zajistis, aby vytvoreny formular byl na popredi manipulaci se seznamem focused formularu na obrazovce, zobrazis ho a spustis lokalne jeho message loop. Dusledkem  mj. je jine poradi a a jiny kontext zprav (vsechno se deje pres zpravy komunikaci s OS).


Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4224
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:Form.Show(modal) + SetFocus
« Odpověď #10 kdy: 24-08-2012, 10:18:23 »
Takto to je pre mňa zrozumiteľné. Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.