tworzenie z klasy nowego obiektu w Form

0

Witam,
Mam taki problem mam jakiś wątek w którym wykonują się działania po wykonaniu tych działań chciałbym aby odpalił mi się SaveFileDialog(); czyli:

 
 FileDialog FilDial = new SaveFileDialog();
 FilDial.ShowDialog();

Jak robię to z tego wątku to nic się nie pokazuje, trzeba to więc jakoś wywołać z Form, próbowałem wywołać zdarzenie w wątku obliczeniowym, a do zdarzenia była przypięta metoda wywołująca SaveFileDialog(), ale to nie pomogło:( Próbowałem też coś wykombinować przez Invoke i InvokeRequired ale też z kiepskim rezultatem.

Może ktoś ma jakiś pomysł, z góry dzięki za jakiś kod wtedy dużo łatwiej pojąć o co chodzi:)

0

Ja w sumie nie rozumiem za bardzo o co Ci chodzi ale pewnie dlatego że sam mało wiem, ale masz tu fragment kodu może jakoś Ci pomoże

Dodany button (Menustrip) i po jego naciśnięciu otwiera się save dialog i zapisuje wczytany obraz do Jpeg

 
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
        {

            SaveFileDialog saveFileDialog = new SaveFileDialog();

            saveFileDialog.Filter = "(*.jpg)|*.jpg|(*.bmp)|*.bmp|All files (*.*)|*.*";
            saveFileDialog.FilterIndex = 3;
            saveFileDialog.RestoreDirectory = true;

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    pictureBox1.Image.Save(saveFileDialog.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                }
                catch
                {
                    MessageBox.Show("error");
                }
            }
          }
0

nie pokazuj dialogow poza watkiem gui. mozesz oddelegowac pokazywanie dialogu z innego watku np. przy uzyciu:

form.BeginInvoke(new Action(() => {
//tu kod pokazujacy dialog
}));
0

Ale jak mam to zrobić np. wygląda to tak:

 
public partial class ClientForm : Form
{
public delegate void wywolaniezapisuEventHandler(object sender, EventArgs e);
public event wywolaniezapisuEventHandler wykonajzapis;
        
         public ClientForm()
        {
            InitializeComponent();
            wykonajzapis += ClientForm_wykonajzapis;
        }
        public void ClientForm_wykonajzapis(object sender, EventArgs e)
        {
            FileDialog _FilDial = new SaveFileDialog();
            _FilDial.ShowDialog();
            
        }
        backgroundWorker1.RunWorkerAsync();

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            while (true)
            {
                tu wykonuje się jakiś kod
            }
             wykonajzapis(new object(), new EventArgs());
         }
}

I to nie działa, jak mam się posłużyć tym BeginInvake i co użyć zamiast form. - jak podaje user katelex?

0

Witam,
znalazłem odpowiedź i działa:)

 
public string AskSaveFile() {
        if (this.InvokeRequired) {
            return (string)Invoke(new Func<string>(() => AskSaveFile()));
        }
        else {
            var sfd = new SaveFileDialog();
            sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*";
            sfd.FilterIndex = 1;
            sfd.RestoreDirectory = true;
            return sfd.ShowDialog() == DialogResult.OK ? sfd.FileName : null;
        }
    }

ale mógł by mi to ktoś wyjaśnić jak to działa czytałem o Invoke ale to polecenie

 
return (string)Invoke(new Func<string>(() => AskSaveFile()))

to jakiś kosmos, O CO TU CHODZI????

1

oprocz przeczytania o invoke przerob sobie jakas w miare nowa ksiazke od podstaw (np essential c# 5.0)

 
public string AskSaveFile() {
        if (this.InvokeRequired) {//czy jestesmy na tym samym watku na ktorym zostala utworzona kontrolka
            return (string)Invoke(new Func<string>(() => AskSaveFile()));//nie jestesmy, tak wiec przejdzmy do wlasciwego watku (i wywolajmy biezaca metode)
        }
        else {
            var sfd = new SaveFileDialog();
            sfd.Filter = "Fichiers txt (*.txt)|*.txt|Tous les fichiers (*.*)|*.*";
            sfd.FilterIndex = 1;
            sfd.RestoreDirectory = true;
            return sfd.ShowDialog() == DialogResult.OK ? sfd.FileName : null;
        }
    }

edit: swoja droga

 
return (string)Invoke(new Func<string>(() => AskSaveFile()))

prosciej zapisac

 
return (string)Invoke(new Func<string>(AskSaveFile))

1 użytkowników online, w tym zalogowanych: 0, gości: 1