Dalsze działanie programu po określonym evencie z innej formy

0

Usiłuję zrobić coś w stylu formy zastępującej msgboxa. Chcę, aby po jej wywołaniu program oczekiwał na kliknięcie określonego przycisku czy też obrazu, a następnie, po jej zamknięciu, dalej robił to co ma robić. Pojęcia nie mam jak to zrobić. Ktoś pomoże?

1

Wywołaj zamiast Show() metodę ShowModal() Dodatkowo możesz sobie ustawić zmienną ModalResult (składnik TCustomForm) w formatce i po zamknięciu zostanie ona zwrócona przez ShowModal.

2

Takie pytania lepiej zadawać w postach, więc tu napiszę. Może na początku dam odnośnik do poczytania
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TCustomForm_ShowModal.html
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Forms_TCustomForm_ModalResult.html

ModalResult to jest taki składnik TForm który będzie zwracany przez funkcję ShowModal. Dzięki temu wiemy czy user kliknął OK, Cancel, czy jeszcze coś innego. Popatrz, że niektóre komponenty (np. TButton) jakie możesz położyć na formę mają właściwość ModalRefult. Oznacza to, że kliknięcie tego przycisku spowoduje automatyczne ustawienie zmiennej ModalResult na to co wybierzesz sobie w inspektorze obiektów. Zatem można napisać tak:

#include "TMyDialogBox .h"
void __fastcall TForm::ButtonClick(TObject *Sender)
{
  if (MyDialogBox->ShowModal() == mrOk)
    ShowMessage("OK";)
}

A w oknie MyDialogBox dajemy np:

void __fastcall TMyDialogBox::OKButtonClick(TObject *Sender)
{
  ModalResult = mrOk;
}

void __fastcall TMyDialogBox::CancelButtonClick(TObject *Sender)
{
  ModalResult = mrCancel;
}

Co skutkuje tym, że po kliknięciu przycisku OK ShowModal w oknie dialogowym zwróci nam mrOk

0

OK, dzięki. Wszystko działa, ale kiedy próbuję odpalić to okienko z oddzielnego wątku (tutaj był wątek o wątku) to nie działa.

0

@wojciennie z tego co kojarzę to nie zaleca się tworzenia formatek w wątkach. Sam nigdy tego nie robiłem i pobieżne przeszukanie googla też daje podobne wyniki. Nie mniej jednak niech może jeszcze jakiś spec się wypowie. Dlatego zawołam @furious programming @grzegorz_so @abrakadaber może któryś z nich powie jak to jest w Delphi/Lazarusie i coś da się z tego wywnioskować.

2

@wojciennie:
Z jakiego powodu chcesz odpalać okienko z wątku ? to nie jest dobry pomysł.
I napisz w czym problem, bo "nie działa" to za mało

3

To mogłoby nawet zadziałać, gdyby wysłać z wątku pobocznego komunikat do głównego okna (za pomocą PostMessage) i z poziomu głównego wątku, po odebraniu komunikatu zatrzymać działanie pobocznego, wyświetlić okno dialogowe (Twój formularz), pobrać wartość modalną (ModalResult) i na jej podstawie określić, czy wznawiać wątek poboczny, czy zakończyć jego działanie.

Nigdy czegoś takiego nie robiłem, ale może i zadziała. Choć wątek poboczny tworzący okna (w dodatku modalne) wygląda dość dziwnie. IMO główny wątek powinien zajmować się formularzami, a te poboczne tylko wykonywać synchronizowaną robotę, przerywaną na jego życzenie.

Jednak z wielowątkowością mam wybitnie mało do czynienia, więc w tej materii raczej specem nie jestem. ;)

3

Nie da sie stworzyc tak formatki z watku jak bys chcial. Aby to zadzialalo musisz stworzyc formatke samodzielnie od podstaw przy urzyciu winapi poniewaz kolejka komunikatow okna musi byc osobna bo to inny watek. Mozna to zrbic i nawet dziala ale na pewno takie okno nie bedzie modalne do jakiegokolwiek z innego watku.

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