CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Caption() formy w C++Builder

Caption() formy w C++Builder

dział ogólny

Caption() formy w C++Builder

Nowy postprzez lzommer » piątek, 19 października 2012, 11:32

Nie wiem jak uaktualnić nowy Caption formy. Repaint czy Refresh czy Invalidate nie daje skutku. Musze zrobić Hide() i ponownie Show(), żeby uaktualnic Caption. Czy jest inny prostszy sposób?
To jest fragment kodu. Ma podać czas obliczen w Caption formy calcF. Czy zrobie to w osobnym wątku, czy na stronie formy w jakimkolwiek Events - skutek ten sam.

KOD cpp:     UKRYJ  
if (!Initialization)
       {
          //calcF->Invalidate();
          calcF->Caption= "Expected calculation time of the line "+ ActLine +":  "+ hs_str +" h "+ ms_str +" min "+ ss_str +" s";
          //calcF->Update();
          calcF->Hide();
          calcF->Show();

       }
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Caption() formy w C++Builder

Nowy postprzez Mironas » piątek, 19 października 2012, 11:44

Co to jest 'Initialization'?
Caption zazwyczaj odświeża się bez problemów.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Caption() formy w C++Builder

Nowy postprzez Cyfrowy Baron » piątek, 19 października 2012, 11:57

W jakim zdarzeniu (Events) to robisz? Zdarzenia nie wykonują się cały czas, np. zdarzenie OnShow dla Formularza wykonuje się tylko raz gdy formularz je pokazywany, czyli tutaj zadziała dopiero jak wywołasz dla formularza funkcję Show o ile formularz wcześniej nie był widoczny. Jeżeli chcesz, żeby wartość Caption zmieniała się cyklicznie w jakichś odstępach czasu umieść na formularzu komponent TTimer, utwórz dla niego zdarzenia OnTimer i umieść w nim ten kod. Właściwość Enabled obiektu Timer włącza (true) wyłącza zegar (false);

KOD cpp:     UKRYJ  
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 /* włączenie zegara w zdarzeniu OnClick przycisku Button1 */
 
 Timer1->Enabled = true;
}
//-----------------------------------------------------------------------
/* zdarzenie OnTimer obiektu Timer */
void __Fastcall TForm1::Timer1Timer(TObject *Sender)
{
 if ( !Initialization )
 {
  calcF->Caption = "Expected calculation time of the line "+ ActLine + ":  " + hs_str + " h " + ms_str + " min " + ss_str + " s";
 }
}


Właściwość Interval obiektu Timer określa częstotliwość pracy zegara 1000 = 1 sekunda.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
lzommer
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Caption() formy w C++Builder

Nowy postprzez lzommer » piątek, 19 października 2012, 13:24

Cyfrowy Baron napisał(a):W jakim zdarzeniu (Events) to robisz? [...]


Właściwość Interval obiektu Timer określa częstotliwość pracy zegara 1000 = 1 sekunda.[/quote]W momencie zakonczenia fragmentu kodu Initialization chce w Caption podac przewidywany czas nastepnych obliczen. Obliczenia sa prowdzone w osobnym watku. I niestety bez Hide i Show Caption sie nie aktualizuje. Probowalem umiescic to wyswietlenie w event formy OnPaint, ale skutek ten sam.
Hide i Show powoduje " zadrganie" screenu i dlatego chcialbym tego uniknac.
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Caption() formy w C++Builder

Nowy postprzez Corvis » piątek, 19 października 2012, 13:30

Pamiętaj, że w wątku nie możesz aktualizować kontrolek wizualnych VCL !!

Wrzuć tu projekt jak to nie tajemnica albo chociaż kod z wątka
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House

Za ten post autor Corvis otrzymał podziękowanie od:
lzommer
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    Windows 7Chrome

Re: Caption() formy w C++Builder

Nowy postprzez Mironas » piątek, 19 października 2012, 13:34

Obliczenia sa prowdzone w osobnym watku

W jaki sposób tworzysz wątek?
Jeśli zmiana Caption-a odbywa się w wątku TThread to powinieneś użyć funkcji Synchronize():
KOD cpp:     UKRYJ  
Synchronize(UpdateCaption);

void __fastcall JWatek1::UpdateCaption()
{
Form1->Caption = "Updated in a thread";
}
 

Za ten post autor Mironas otrzymał podziękowanie od:
lzommer
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Caption() formy w C++Builder

Nowy postprzez lzommer » piątek, 19 października 2012, 15:26

Mironas napisał(a):
Obliczenia sa prowdzone w osobnym watku

W jaki sposób tworzysz wątek?
Jeśli zmiana Caption-a odbywa się w wątku TThread to powinieneś użyć funkcji Synchronize():[...]


Wielkie dzieki za zainteresowanie!!!
Ale jak przekazac parametry dla Caption?
W
Synchronize(UpdateCaption)
nie ma miejsca na parametry, a ja powinienem przekazac obliczony czas do Caption.
Bez parametrow owszem dziala, ale co z tego.
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Caption() formy w C++Builder

Nowy postprzez lzommer » piątek, 19 października 2012, 15:39

Jeszcze wyjaśnie, że probowalem napisac UpdateCaption(AnsiStrina h, AnsiString m, AnsiString s) i Synchronize(UpdateCaption(h,m,s))
ale tego kompilator nie przyjmuje.
Przepraszam, ale nie wiem komu z Was odpowiadam. Czy Wszystkim?
Nie wiem czy i jak sie wybiera adresata odpowiedzi.
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows XPInternet Explorer 8

Re: Caption() formy w C++Builder

Nowy postprzez Mironas » piątek, 19 października 2012, 16:40

Wyjaśnię dokładniej.

W wątku tworzysz funkcję UpdateCaption() - bez żadnych parametrów wejściowych. Nazwa funkcji jest dowolna.
Wewnątrz tej funkcji wykonujesz:
KOD cpp:     UKRYJ  
Form1->Caption = "Ala ma kota";

Funkcje tą wywołujesz w dowolnym zdarzeniu lub w innej funkcji przez Synchronize(...):
KOD cpp:     UKRYJ  
Synchronize(UpdateCaption);

Jeśli chcesz przekazać jakieś parametry to musisz to zrobić za pomocą zmiennych globalnych w wątku. Czyli w pliku nagłówkowym wątku (np.: JWatek1.h) umieszczam:
KOD cpp:     UKRYJ  
private:
  int ilosc;
 

A w pliku CPP wątku dajesz:
KOD cpp:     UKRYJ  
void __fastcall JWatek1::Execute()
{
  ilosc = 0;
  for (int i=0 ; i<1000 ; i++)
  {
    if (Terminated)
      break;
    ilosc++;
    Synchronize(UpdateCaption);
    Sleep(1);
  }
  FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall JWatek1::UpdateCaption()
{
  Form1->Caption = "Ala ma kotów: " + IntToStr(ilosc);
}
//---------------------------------------------------------------------------
 

Ten przykład dotyczy wątków tworzonych za pomocą klasy TThread.
W BCB 6: File >> New >> Other >> Thread Object

Za ten post autor Mironas otrzymał podziękowanie od:
lzommer
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Caption() formy w C++Builder

Nowy postprzez lzommer » piątek, 19 października 2012, 19:38

Serdeczne dzięki.
Nie liczyłem na tak szybką i dokładną odpowiedź.
:) :D
Avatar użytkownika
lzommer
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): piątek, 19 października 2012, 10:01
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: winXP
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Internet Explorer 9


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości