Otevírání Formů (nové instance) a jejich uspořádání   otázka

VB.NET, WinForms

Dobrý den,

chtěl bych pozeptat na toto:

mám např. Form2 a ten opakovaně otevírám v MDIformu jako childForm. Jde mi o to jakým způsobem ta nová okna budou umístěna na obrazovce.

Standartně jsou nová (child) okna otevírána do kaskády, ale není mi zcela přesně jasné jak je toto vnitřně ošetřeno.

Já si ukládám poslední velikost a polohu Formu po jeho uzavření, a to používám při následném otevření nového okna. Tady nastává můj problém, protože přestává fungovat "kaskádování" a Formy se mi vlastně "vrší na sebe".

Dotaz zní, jestli původního "kaskádování" lze dosáhnout nějakým elegantním způsobem (pomocí již vestavěné metody), nebo je třeba toto ošetřovat zcela vlastním kódem.

Předem děkuji

Tady mi tím pádem vzniká problém

nahlásit spamnahlásit spam 0 odpovědětodpovědět

omlouvám se, ten poslední řádek se tam vloudil omylem

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Předpokládejme, že Me bude v tomto kontextu nadřazené MDI okno:

Me.LayoutMdi(MdiLayout.Cascade)

Tímto uspořádáte všechna podřízená MDI okna do kaskády.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nejdříve děkuji za bleskovou odpověď.

Já jsem již toto zkoušel, ale zatím se mi nedaří dosáhnout požadovaného výsledku.

Okna se mi otevírají "kaskádově", ale potom se mi ztratí mé formátování (velikost a poloha posledně otevřeného okna), načítané ze souboru při Form_Load. Já bych chtěl načíst tyto hodnoty pro každé nové okno a toto nově otevírané okno umístit do kaskády, aby nebyly navršeny přes sebe.

Nejspíš to budu muset ošetřit vlastní procedurou pomocí počítání otevřených ChildFormů a nějakého offsetu u vlastnosti Location.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud máte na mysli fakt, že když nastavíte velikost a pozici MDI podřízeného okna a potom ho zobrazíte metodou Show() a ono se kupodivu zobrazí uplně jinak, tak s tímto jsem se potýkal také. V podstatě to jde vyřešit buď opětovným nastavením souřadnic a velikosti ihned po zavolání Show(), ovšem potom je vidět jak okno poskočí, nebo elegantním způsobem pomocí DataBindingu vlastností Location a Size na konfigurační hodnoty (DataBinding lze nastavit buď vizuálně v návrhovém prostředí nebo programově v konstruktoru třídy).

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Postupuji takto:

- nastavím Layout(LayoutMDI.Cascade)

- potom zavolám Show() z MDI formuláře

- při Form_Load (childform) načtu uložené hodnoty Size a Location (ve tříde daného formuláře) a nastavím jimi vlastnosti Formu

Chová se to tak, že okno se nastaví na požadovanou velikost a potom přeskočí do pozice Cascade a přenastaví se defaulní velikost a to právě nechci. Myslel jsem jestli by šlo provádět to kaskádování s mojí hodnotou Location a Size.

Nejspíš to takto kombinovat nejde. Nemám problém s tím si to ošetřit vlastní procedurou, ale šlo mi o to, abych nepsal nějakou funkcionalitu která je již součástí .NETu a jen ji neumím použít.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to jste vůbec nepochopil chování podřízených MDI oken.

1) Layout je metoda a ne vlastnost, tudíž tím nenastavujete žádné chování, ale pouze srovnáte aktuálně zobrazená podřízená MDI okna požadovaným způsobem (uvedeným jako parametr). Jestliže tuto funkci zavoláte ještě než je cokoliv zobrazeno, logicky to tedy nic neudělá.

2) Ať nastavíte jakékoliv hodnoty vlastností Location a Size, všechna MDI okna se po zavolání metody Show zobrazí na výchozí pozici s výchozí velikostí (shodou okolností je to do tvaru kaskády). Toto chování lze ovlivnit nastavením vlastnosti StartPosition na Manual.

3) Kaskádování nelze ovlivnit, systém prostě srovná okna do výchozího umístění s výchozí velikostí a hotovo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback