IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Michal Pflegshörl:23.9.2019 12:57

Z úvodního formuláře Form1 otevřu Form2 pomocí Form2.Show();
Pokud ve Form2 otevřu Form3 jako Form3.ShowDialog(); zablokuje se mi i Form1.

Zkusil jsem: Do Form2 jsem přidal metodu

public void Start()
{
        System.Threading.Tasks.Task.Run(() =>
        {
                this.ShowDialog();
        });
}

pomocí které ho otevírám z Form1.
Při deklaraci Form3 ve Form2 mi vyhodí řádek

this.MujPrvek = new Programek.UserControl_Prvek();

v InitializeCom­ponent(); ve Form3 chybu:

Pokud chcete volat funkce OLE, musí být aktuální vlákno spuštěno v režimu STA (Single Thread Apartment).
Zkontrolujte, zda je ve funkci Main určen atribut STAThreadAttribute.

Chci docílit: Aby Form3 otevřený jako dilaog z Form2 neblokoval Form1

 
Odpovědět
23.9.2019 12:57
Avatar
JerryM
Člen
Avatar
JerryM:24.9.2019 12:01

je rozdíl mezi modálním a nemodálním dialogovým oknem
pokud chceš otevřít okno z Form1, které ti nebude blokovat okno Form1 vytvoř nové okno
Form frm = new Form();

 
Nahoru Odpovědět
24.9.2019 12:01
Avatar
Michal Pflegshörl:24.9.2019 14:21

Form2 otevírám z Form1 tímto kódem

Form2 Dvojka = new Form2();
Dvojka.Start();

Form3 ve Form2 pak

Form3 Trojka = new Form3();
Trojka.ShowDialog();

Potřebuj docílit toho aby Form1 byl stále aktivní, ale Form2 se po otevření Form3 deaktivoval.

 
Nahoru Odpovědět
24.9.2019 14:21
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:25.9.2019 9:53

Jelikoz Form3 oteviras ve Form2 jako dialog, nemuzes Form2 uzavrit. Takze doporucuju prehodnotit logiku aplikace/kodu. Ja bych resil otevreni Form2 z Form1 a pokud dojde k naplneni nejake podminky pak uzavru Form2 a na zaklade vyvolane udalnosti (Closed, Closing) pri uzavirani Formu2 otevru Form3.
Nebo neotvirat Form3 jako dialog Formu2.

 
Nahoru Odpovědět
25.9.2019 9:53
Avatar
Odpovídá na Roman
Michal Pflegshörl:25.9.2019 11:02

Já ale nechci Form2 zavřít. Chci aby po otevření Form3 zůstal Form2 zobrazený, ale neaktivní, zatímco Form1 byl stále aktivní.

 
Nahoru Odpovědět
25.9.2019 11:02
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:25.9.2019 11:29

Form3 otevri pomoci Show tzn. ne jako dialog a nasledne zadej v kodu form2

Enabled = false;
 
Nahoru Odpovědět
25.9.2019 11:29
Avatar
Odpovídá na Roman
Michal Pflegshörl:25.9.2019 13:35

K řádku

Trojka.ShowDilaog();

se nedostanu. Chybou skončí ve Form2 už řádek

Form3 Trojka = new Form3();

Respektive chybu způsobí řádek

this.MujPrvek = new Programek.UserControl_Prvek();

v InitializeCom­ponent(); ve Form3

 
Nahoru Odpovědět
25.9.2019 13:35
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:25.9.2019 14:09

Ja si vubec neprecetl puvodni dotaz a nevsiml jsem si, ze do toho mas zamotane vlakna. Takze podle me se snazis pristupovat napric vlakny k ruznym formum nebo neco. Dej sem cely kod. Formy jako takove by mely vzdy bezet ve stathread. Aktualizace dat v nich muzes delat z jinych vlaken pomoci Invoke (thread safe).

 
Nahoru Odpovědět
25.9.2019 14:09
Avatar
Michal Pflegshörl:26.9.2019 9:08

Do přílohy jsem vložil projekt testovací aplikace.
Krokoval jsem více do hloubky a chybu způsobují řádky

this.comboBox1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend;
this.comboBox1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource;

v InitializeCom­ponent(); ve Form3

 
Nahoru Odpovědět
26.9.2019 9:08
Avatar
Michal Pflegshörl:3.10.2019 13:57

Odkaz ke stažení testovací aplikace
https://drive.google.com/open?…

 
Nahoru Odpovědět
3.10.2019 13:57
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:4.10.2019 9:28

Nevim proc oteviras form ve novem vlakne. Pokud potrebujes provest nejake operace tak je nech provest ve vlakne a nasledne aktualizuj data ve Formu, ktery bezi v STAThread.

Form1

namespace Aplikace
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 Dvojka = new Form2();
            Dvojka.Show();
        }
    }
}

Form2

namespace Aplikace
{
    public partial class Form2 : Form
    {

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                Form3 Trojka = new Form3();
                                Trojka.FormClosed += Trojka_FormClosed;
                Trojka.Show();
                                Enabled = false;
            }
            catch (Exception err)
            {
                MessageBox.Show(err.Message);
            }

        }

                private void Trojka_FormClosed (object sender, FormClosedEventArgs e) {
                        Enabled = true;
                }
        }
}
 
Nahoru Odpovědět
4.10.2019 9:28
Avatar
Odpovídá na Roman
Michal Pflegshörl:4.10.2019 11:23

Tvoje řešení v testovací aplikaci funguje.
Můj kód v ostré aplikaci je, bohužel, daleko složitější.
Upravil jsem testovací aplikaci tak, aby více odpovídala té ostré.
Nová testovací je zde

 
Nahoru Odpovědět
4.10.2019 11:23
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:4.10.2019 11:49

Cele tve reseni je nesikovne - hledej splash screen nebo napr

 
Nahoru Odpovědět
4.10.2019 11:49
Avatar
Luboš Běhounek Satik:4.10.2019 12:27

Nemuzu se ted podivat, v jakem stavu to ted mas, ale:

vyhod to

System.Threading.Tasks.Task.Run(() =>

nema to tam co delat.

Veskery UI nech v hlavnim vlakne a pokud potrebujes nejakou dele trvajici akci, tak az tu hod do jineho vlakna.

Pokud otviras pres ShowDialog(), tak tim to puvodni okno zablokujes, nez se to nove otevreny zavre, pokud nejaky okno chce mit pristupny, tak ty novy musis otevirat pres Show().

O co presne se pokousis?

Nahoru Odpovědět
4.10.2019 12:27
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Roman
Michal Pflegshörl:4.10.2019 13:26

Díky za šikovnější řešení ve Form_Pracuji.
Nevíš ještě jak zařídit, aby se animovaný gif vložený do tohoto formuláře v průběhu provádění akce pohyboval?

 
Nahoru Odpovědět
4.10.2019 13:26
Avatar
Odpovídá na Luboš Běhounek Satik
Michal Pflegshörl:26.2.2020 8:58

Pokouším se o následující:
Form1 funguje jako portál, ze kterého se otevírají jednotlivé seznamy záznamů, (např. Form2).
Je potřeba aby šlo otevřít více seznamů najednou i jeden seznam vícekrát.
U každého otevřeného seznamu záznamů je možné otevřít konkrétní záznam v novém formuláři (Form3).
Pokud se otevře konkrétní záznam (Form3) musí se deaktivovoat seznam záznamů (Form2), ale ostatní seznamy záznamů (Form2) i hlavní portál (Form1) musí zůstat aktivní).

Doufám, že je to srozumitelné.

 
Nahoru Odpovědět
26.2.2020 8:58
Avatar
Odpovídá na Michal Pflegshörl
Michal Štěpánek:26.2.2020 9:58

Myslím, že toto nejde. Pokud otevřeš okno jako dialog, deaktivují se tím všechna okna, neb dialog je vždy navrchu.
Řešení vidím v tom, že bys to okno, které chceš mít "deaktivované" normálně skryl. Z form2 otevřeš form3, instanci form2 předáš do konstruktoru formu3 a ve form3 jen skryješ form2.

Nahoru Odpovědět
26.2.2020 9:58
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Michal Štěpánek
Michal Štěpánek:26.2.2020 10:03

Pak samozřejmě můžeš při zavírání form3 opět "zviditelnit" form2, nebo v něm provést nějakou jinou událost...

Nahoru Odpovědět
26.2.2020 10:03
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
zelvicek
Člen
Avatar
Odpovídá na Michal Pflegshörl
zelvicek:26.2.2020 14:32

Form1.cs

private void button1_Click(object sender,EventArgs e)
{
        new Form2().Show();
}

Form2.cs

private void button1_Click(object sender,EventArgs e)
{
        Form3 f = new Form3();
        this.Enabled=false;
        f.FormClosed+=F3Closure;
        f.Show();
}

void F3Closure(object sender,EventArgs e)
{
        ((Form)sender).FormClosed-=F3Closure;
        this.Enabled=true;
}

Příště googluj, většinu problémů už vyřešili jiní.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
26.2.2020 14:32
Avatar
Michal Pflegshörl:5.3.2020 14:04

Díky to zabralo ;-)

 
Nahoru Odpovědět
5.3.2020 14:04
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 20 zpráv z 20.