Odświeżanie TForm

1

A więc, mam sobie pewną formę (stworzoną oddzielnie, poleceniem frm:=TMyForm.Create(nil); ). I chcę ją updatować (tj. żeby działaly timery, rysowała się ona, i łapała message od windowsa itd. itp.), z tym że, chcę, aby było to w jednej procedurze. Od razu mówię, że application.ProcessMessages nie działa, bo ta forma ma być updatowana w czasie, gdy w programie jest wyjątek. wykonanie ProcessMessages powoduje wywołanie tego wyjątku jeszcze raz co kończy się źle.
Dodam, że pokazanie tej formy mam podpięte pod Application.OnException .
Próbowałem już frm.Update i takie podobne, ale generalnie niewiele to dało.
Ma ktoś może pomysł jak zupdatować tylko tą formę, albo i całą aplikację, ignorując wyjątek?
Z góry dzięki

1

Owszem:

  • łap wyjątki i obsługuj je (nie pozwalaj by wykrzaczały aplikację)
  • nie rzucaj wyjątków, które nie są obsługiwane :>
0
[losowa nazwa] napisał(a)

Owszem:

  • łap wyjątki i obsługuj je (nie pozwalaj by wykrzaczały aplikację)
  • nie rzucaj wyjątków, które nie są obsługiwane :>

Łapię ten wyjątek i chce go wyświetlić użytkownikowi za pomocą tej formy. I może bez wymijających odpowiedzi .

0
olesio napisał(a)

Jakie wymijające odpowiedzi? Dostaleś informacje podstawowe. Co za problem wpisać w google: delphi handle exceptions i poczytać informacje na zwróconych stronach. Na przykład w pierwszym linku masz informacje o Application.OnException. Googlując za tym hasłem można znaleźć przykłady i więcej informacji. Ech, totalne lenistwo ludzkie coraż bardziej tutaj się ujawnia i jest to wręcz przerażające. Masz prosty kod dołaczony do tego posta - pisane na szybko, ale pewnie niewiele się nauczysz, bo chyba nie chcesz ;/ Nie ma co mieć pretensji do [losowa nazwa] czy innych, tylko najpierw przed zadaniem pytania googlować. I przenoszę do Newbie, bo obsluga wyjątków przez wspomniane zdarzenie to wydaje mi się pewne podstawy.

Jakbyś olesio zauważył, nie chodzi o łapanie wyjątków (to zrobiłem bez większych problemów, i nawet użyłem google!). Chodzi o odświeżanie formy w procedurze łapiącej ten wyjątek. Macie kod, może zrozumiecie:

procedure TForm1.MyHandler(Sender: TObject; E: Exception);
var
  s:shortstring;
begin
  s:=DumpExceptionCallStack(e);
  CreateErr(s,'Błąd');
  while frm.visible do
        begin
        application.ProcessMessages;
        sleep(20);
        end;
  halt;
end;  

DumpExceptionCallStack zwraca informacje o wyjątku. CreateErr otwiera forme frm. I tutaj się pojawia problem, bo chce aby się ta forma odświeżała, ale bez application.ProcessMessages, bo to powoduje ponowne złapanie wyjątku (jako że ta procedura się jeszcze nie skończyła) i powoduje kolejne application.ProcessMessages co z kolei znowu otwiera nowe MyHandler. Więc pytam czy jest inne rozwiązanie niż używanie ProcessMessages do odświeżania formy. Albo coś co spowoduje że ProcessMessages zignoruje wyjątek.
I tak, to były wymijające odpowiedzi gdyż zupełnie nie o to mi chodziło.
I nie jestem pewien czy to takie 'newbie' pytanie.

0

Przeanalizuj kod dołaczony do tego posta. U mnie wszystko działa ok, nie wiem po co Tobie jakieś odświeżanie. Zarówno formatka pokazana od razu przez Show, jak i przez button przez ShowModal pokazuje wyjątki, jak nalezy. Chyba, że coś kombinujesz inaczej, to sprecyzuj co ma Tobie te wyjątki pokazać na tej formatce i jak ją tworzysz, a nie unoś się odpowiadając [losowej nazwie].

0
olesio napisał(a)

Przeanalizuj kod dołaczony do tego posta. U mnie wszystko działa ok, nie wiem po co Tobie jakieś odświeżanie. Zarówno formatka pokazana od razu przez Show, jak i przez button przez ShowModal pokazuje wyjątki, jak nalezy. Chyba, że coś kombinujesz inaczej, to sprecyzuj co ma Tobie te wyjątki pokazać na tej formatce i jak ją tworzysz, a nie unoś się odpowiadając [losowej nazwie].

" a nie unoś się odpowiadając [losowej nazwie]." - ah, czyli mam głaskać tych co odpowiadają nie na temat? Ja tam nie wnikam w wasze zasady pseudo bycia miłym.
Ten kod zaledwie dodaje wyjątek do listy. Mi chodzi o wykonanie własnej pętli komunikatów wewnątrz procedury obsługi wyjątku. A nie oddawanie obsługi z powrotem do programu. dlatego dałem petlę dopóki forma wyświetlająca błąd jest widoczna. Gdy ją zamkniemy to następuje halt i koniec. A nie oddawanie obsługi do reszty programu.
Czyli, chodzi mi o to, że jeśli będzie błąd to nie ignorujemy go wracając do aplikacji, ale pokazujemy formę z błędem, czekamy aż ją użytkownik zamknie, i zamykamy program. I tu jest problem o którym wciąż mówię - ProcessMessages powoduje kolejne wyrzucenie wyjątku zamiast po prostu odświeżyć formę z błędem.

0

No teraz opisałeś dokładnie z czym masz problem, ja wątek umieściłem jednak z powrotem tutaj, bo wcześniej błędnie sądziłem, że masz problem z jakimiś podstawami. Jeżeli wątki nie pomagają i nie można wykonać tego w wątku ze Sleepem bez tego processMessages to znaczy, że problem jednak jest poważniejszy i ja szczerze pisząc nie wiem jak Tobie pomóc, bo ekspertem nie jestem, ale być może ktoś będzie jednak jeszcze umiał tutaj Tobie pomóc, skoro dokładnie wiadomo z czym jest problem i co chcesz osiągnąć, bo podałeś przykład. Jakbyś napisał to od razu przykład to może wtedy [losowa nazwa] by nie pomyślał, że źle przechwytujesz wątki.

0

to moze zamiast TForm uzyc okna zrobionego w winApi i wlasnej petli komunikatow...

0

Oj, problem okazał się bardzo prosty: wyrzucenie testowego wyjątku przez pomyłkę dałem do timera, i każdy processmessages wykonywało ten timer co skutkowało kolejnym wywaleniem błędu. Dzięki wszystkim za pomoc!

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