PHP týden Předvánoční slevová akce
Pouze tento týden sleva až 80 % na PHP e-learning!
Využij předvánočních slev a získej od nás 20 % bodů zdarma! Více zde

Diskuze: Dialog ve druhém formuláři blokuje první formulář

Aktivity (4)
Avatar
Michal Pflegshörl:23. září 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. září 12:57
Avatar
JerryM
Člen
Avatar
JerryM:24. září 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. září 12:01
Avatar
Michal Pflegshörl:24. září 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. září 14:21
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:25. září 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. září 9:53
Avatar
Odpovídá na Roman
Michal Pflegshörl:25. září 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. září 11:02
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:25. září 11:29

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

Enabled = false;
 
Nahoru Odpovědět
25. září 11:29
Avatar
Odpovídá na Roman
Michal Pflegshörl:25. září 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. září 13:35
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:25. září 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. září 14:09
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Michal Pflegshörl:26. září 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. září 9:08
Avatar
Michal Pflegshörl:3. října 13:57

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

 
Nahoru Odpovědět
3. října 13:57
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:4. října 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. října 9:28
Avatar
Odpovídá na Roman
Michal Pflegshörl:4. října 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. října 11:23
Avatar
Roman
Člen
Avatar
Odpovídá na Michal Pflegshörl
Roman:4. října 11:49

Cele tve reseni je nesikovne - hledej splash screen nebo napr

 
Nahoru Odpovědět
4. října 11:49
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Luboš Běhounek Satik:4. října 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. října 12:27
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Roman
Michal Pflegshörl:4. října 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. října 13:26
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 15 zpráv z 15.