Label Text wird nicht aktualisiert

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Label Text wird nicht aktualisiert

Beitrag von DL3AD »

Hallo,

ich habe hier das Problem, dass die Label Label_Rotor_ref.Caption und Label_ATU_ref nicht im Form aktualisiert werden obwohl der Code sauber durchlaufen wird.

ShowMessage('Init ist fertig') kommt ordnungsgemäß.

Was mache ich falsch ?

Code: Alles auswählen

procedure TForm2.FormActivate(Sender: TObject);
begin
  ACB_Com.ACB_init;
  if ACB_Com.ACB_ok = true then
     Label_ACB_ok.Caption:= 'ACB init OK'
     else
       begin
         ShowMessage('ACB Bus nicht gefunden !');
         Form1.Close;
         exit;
       end;
  Timer_init.Enabled:= true;
end;
 
procedure TForm2.Timer_initTimer(Sender: TObject);
begin
 if Rotor.Check_Init_Rotor = false then
    Rotor.RefInit_Rotor
   else
    begin
      Label_Rotor_ref.Caption:= 'Rotor is ready';
    end;
 
 if ATU.Check_init_C = false then
    ATU.RefInit_ATU_C
   else
    begin
      Label_ATU_ref.Caption:= 'ATU is ready';
    end;
 
 if Rotor.Check_Init_Rotor and ATU.Check_init_C = true then
    begin
      Timer_init.Enabled:= false;
      ShowMessage('Init ist fertig');
      Form2.Close;
    end;
end;                                                               
Gruß Frank

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Label Text wird nicht aktualisiert

Beitrag von baumina »

Versuch mal nach jeder Caption-Änderung ein

Code: Alles auswählen

Application.ProcessMessages;
.

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

... keine Änderung :shock:

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

... wenn ich zusätzlich mit If then auf true prüfen klappt es anstandslos :?

Was kann da an meinem If then else falsch sein ?

Gruß Frank

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Label Text wird nicht aktualisiert

Beitrag von baumina »

if-Beispiele:

Code: Alles auswählen

 
  // wenn nur eine Anweisung kommt, reicht ein then/else
  // niemlas auf "true" oder "false" abfragen
  If EinBoolean then IstTrue else IstFalse;
 
  If not EinBoolean then IstFalse else IstTrue;
 
  // wenn mehrere Anweisungen im if oder else kommen, dann immer mit begin/end
  If EinBoolean then
  begin
    IstTrue;
    Nochwas;
  end else
  begin
    IstFalse;
    Nochmalwas;
  end;
 
  // wenn mehrere Bedingungen abgefragt werden, muss man meist Klammern
  If (EinBoolean and (A = 1)) ...
  If A and B ....
  If ((A=1) or (B=2)) then
 
.

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

... Danke - werde ich gleich mal umsetzen :)

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

Hallo,

habe es nun wie folgt geändert - Label werden trotzdem nicht aktualisiert.

Code: Alles auswählen

procedure TForm2.FormActivate(Sender: TObject);
begin
  ACB_Com.ACB_init;
  if ACB_Com.ACB_ok then
     Label_ACB_ok.Caption:= 'ACB init OK'
     else
       begin
         ShowMessage('ACB Bus nicht gefunden !');
         Form1.Close;
         exit;
       end;
  Timer_init.Enabled:= true;
end;
 
procedure TForm2.Timer_initTimer(Sender: TObject);
begin
 if not Rotor.Check_Init_Rotor then
    Rotor.RefInit_Rotor
   else
    Label_Rotor_ref.Caption:= 'Rotor is ready';
 
 
 if not ATU.Check_init_C then
    ATU.RefInit_ATU_C
   else
    Label_ATU_ref.Caption:= 'ATU is ready';
 
 
 
 if (Rotor.Check_Init_Rotor and ATU.Check_init_C) then
    begin
      Timer_init.Enabled:= false;
      ShowMessage('Init ist fertig');
      Form2.Close;
    end;
end;
 
end.                                         
Mache ich für den else Zweig eine extra if dann klapp es :shock:

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Label Text wird nicht aktualisiert

Beitrag von baumina »

Du machst folgendes (siehe Kommenatre):

Code: Alles auswählen

procedure TForm2.FormActivate(Sender: TObject);
begin
  ACB_Com.ACB_init;
  if ACB_Com.ACB_ok then
     Label_ACB_ok.Caption:= 'ACB init OK'
     else
       begin
         ShowMessage('ACB Bus nicht gefunden !');
         Form1.Close;
         exit;
       end;
  Timer_init.Enabled:= true;
end;
 
procedure TForm2.Timer_initTimer(Sender: TObject);
begin
 // wenn noch nicht initialisiert, dann init
// wenn schon initialisiert, dann Caption <- passiert nur nie
 if not Rotor.Check_Init_Rotor then
    Rotor.RefInit_Rotor
   else
    Label_Rotor_ref.Caption:= 'Rotor is ready';
 
 // wenn noch nicht initialisiert, dann init
// wenn schon initialisiert, dann Caption <- passiert nur nie
 if not ATU.Check_init_C then
    ATU.RefInit_ATU_C
   else
    Label_ATU_ref.Caption:= 'ATU is ready';
 
 
// wenn beide initialisiert dann Timer aus, deswegen kommen nie die Captions, weil der Timer genau 1 mal durchlaufen wird 
 if (Rotor.Check_Init_Rotor and ATU.Check_init_C) then
    begin
      Timer_init.Enabled:= false;
      ShowMessage('Init ist fertig');
      Form2.Close;
    end;
end;
 
end.                                         
.

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

... doch der timer wird mehrfach durchlaufen !
Mache ich statt der Labelaktualisierung eine ShowMessage dann kommen mehrere Messagboxen nur diese Sch..ß Label werden nicht aktualisiert
Mache ich für die Label eine extra If dann werden sie ja aktualisiert.

Dass hier funktioniert

Code: Alles auswählen

procedure TForm2.FormActivate(Sender: TObject);
begin
  ACB_Com.ACB_init;
  if ACB_Com.ACB_ok then
     Label_ACB_ok.Caption:= 'ACB init OK'
     else
       begin
         ShowMessage('ACB Bus nicht gefunden !');
         Form1.Close;
         exit;
       end;
  Timer_init.Enabled:= true;
end;
 
procedure TForm2.Timer_initTimer(Sender: TObject);
 
begin
 if not Rotor.Check_Init_Rotor then Rotor.RefInit_Rotor;
 if Rotor.Check_Init_Rotor then Label_Rotor_ref.Caption:= 'Rotor is ready';
 
 if not ATU.Check_init_C then ATU.RefInit_ATU_C;
 if ATU.Check_init_C then Label_ATU_ref.Caption:= 'ATU is ready';
 
 if (Rotor.Check_Init_Rotor and ATU.Check_init_C) then
    begin
      Timer_init.Enabled:= false;
      ShowMessage('Init ist fertig');
      Form2.Close;
    end;
end;
 
end.                                

Benutzeravatar
theo
Beiträge: 10884
Registriert: Mo 11. Sep 2006, 19:01

Re: Label Text wird nicht aktualisiert

Beitrag von theo »

Ist doch vollkommen logisch. Welches Verhalten erwartest du denn?

Der Timer Eventhandler wird einmal durchlaufen, dann wird enabled auf false gesetzt.
Vorher ist halt noch nichts ge-inited, deshalb auch nicht "Ready".

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

... muss ich nach einem timerdurchlauf den timer wieder auf enabled true setzen ?
Ich dachte der timer leuft solange bis ich ihn auf enabled false setze.
In meinem Fall setze ich den timer in der letzten If Abfrage wenn beide Bedingungen erfüllt sind, auf false und schalte den timer damit ab.

In den oberen Abfragen frage ich das flag zur initialisierung ab - ist es nicht gesetzt, geht er in die Abfrage, ist es gesetzt (else) sollen die Label gesetzt werden - dass ist doch eindeutig oder?

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Label Text wird nicht aktualisiert

Beitrag von hde »

DL3AD hat geschrieben:Mache ich statt der Labelaktualisierung eine ShowMessage dann kommen mehrere Messagboxen nur diese Sch..ß Label werden nicht aktualisiert
Mache ich für die Label eine extra If dann werden sie ja aktualisiert.
Ist das nicht logisch?
DL3AD hat geschrieben:procedure TForm2.Timer_initTimer(Sender: TObject);
begin
if not Rotor.Check_Init_Rotor then
Rotor.RefInit_Rotor // Aufruf der Initprocedure, damit ist IF erledigt
else
Label_Rotor_ref.Caption:= 'Rotor is ready'; // else wird nie erreicht
oder sehe ich das falsch?

hde

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Re: Label Text wird nicht aktualisiert

Beitrag von shokwave »

DL3AD hat geschrieben:In den oberen Abfragen frage ich das flag zur initialisierung ab - ist es nicht gesetzt, geht er in die Abfrage, ist es gesetzt (else) sollen die Label gesetzt werden - dass ist doch eindeutig oder?
Naja, wie theo schon schrieb. Stell dir einen Durchlauf vor (könnte auch erst der 10. sein), in dem die beiden Variablen immer noch False sind. Jetzt kommt

Code: Alles auswählen

 if not Rotor.Check_Init_Rotor then
    Rotor.RefInit_Rotor
   else
    Label_Rotor_ref.Caption:= 'Rotor is ready';
wo RefInit.Rotor ausgeführt wird und die Variable auf True setzt. Das Lable wird aber nicht geändert, da es im else-Zweig steht. Das selbe jetzt noch bei deiner 2. Abfrage.
Bei der 3. Abfrage sind jetzt beide Variablen True, du stoppst den Timer und die Lables werden nie gesetzt...

Dein letzter Codeschnipsel mit den 2 if-Abfrage ist schon die Lösung.
mfg Ingo

DL3AD
Beiträge: 478
Registriert: Fr 13. Sep 2013, 12:07
OS, Lazarus, FPC: Debian Bullseye (L 2.2.0)
CPU-Target: 64Bit
Wohnort: Rügen

Re: Label Text wird nicht aktualisiert

Beitrag von DL3AD »

... ich glaube es hat klick gemacht :oops:
Der Tag war stressig und dass Brett vorm Kopp war ziemlich dick :mrgreen:

Ich danke euch für die Hilfe.

Gruß Frank

Antworten