tworzenie z klasy nowego obiektu w Form

Odpowiedz Nowy wątek
2015-05-23 22:27

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

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:)

Pozostało 580 znaków

2015-05-23 22:52

Rejestracja: 5 lat temu

Ostatnio: 1 dzień temu

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");
                }
            }
          }
edytowany 3x, ostatnio: RideorDie, 2015-05-23 22:53

Pozostało 580 znaków

2015-05-24 07:57

Rejestracja: 5 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Hong Kong

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
}));
edytowany 2x, ostatnio: katelx, 2015-05-24 07:59

Pozostało 580 znaków

2015-05-24 13:45

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

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?

edytowany 1x, ostatnio: krisrk4, 2015-05-24 13:45

Pozostało 580 znaków

2015-05-24 14:20

Rejestracja: 6 lat temu

Ostatnio: 4 lata temu

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????

Pozostało 580 znaków

2015-05-24 15:25

Rejestracja: 5 lat temu

Ostatnio: 7 godzin temu

Lokalizacja: Hong Kong

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))
edytowany 1x, ostatnio: katelx, 2015-05-24 15:27

Pozostało 580 znaków

Odpowiedz

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