Titlebar Text ändern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Titlebar Text ändern

Beitrag von Vbxler »

Anfängerfrage zum Titlebar:

Warum kann ich den Inhalt der Titelbar nicht ändern:

Code: Alles auswählen

frmMitarbeiterbearbeiten.Caption    := 'Neuen Mitarbeiter hinzufügen'; 
Die Aweisung wird abgearbeitet, aber der Titel ist der Selbe wie in der Emtwurfsansicht.
Wenn ich statt der Form einen Lable angebe, wird dieser ordnungsgemäß geändert.

Danke für Eure Hilfe
Vbxler
-------------------------

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Titlebar Text ändern

Beitrag von m.fuchs »

Das muss natürlich gehen, hier liegt sicher ein anderes Problem vor.
  • Mach dir mal ein Beispielprojekt mit einem leeren Form und einen Knopf der die Form.Caption ändert. Funktioniert das?
  • Poste hier mal ein bisschen relevanten Quellcode (deine Zeile mit der Änderung und den Code drumherum).
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Titlebar Text ändern

Beitrag von Vbxler »

Wenn ich ein neues Projekt erstelle, dann geht es nach einem Buttonklick.

In der Anwendung will ich beim Aufruf der neuen Form festlegen, ob Daten geändert,
oder ob ein neuer Datensatz eingefügt werden kann.

Code: Alles auswählen

 
//----------------------------------------------------------
// Form wird angezeigt
//----------------------------------------------------------
procedure TfrmMitarbeiterbearbeiten.FormActivate(Sender: TObject);
begin
    case m_Bearbeitungstyp of
        1:
        begin
            //lblMitarbeiter.Caption  :='Neuen Mitarbeiter hinzufügen';                 //<--funktioniert
            frmMitarbeiterbearbeiten.Caption    := 'Neuen Mitarbeiter hinzufügen';      //<--funktioniert nicht
            //frmMitarbeiterbearbeiten.Refresh;                                         //<--kein effekt
            //frmMitarbeiterbearbeiten.Repaint;                                         //<--kein effekt
        end;
 
        2:
        begin
            frmMitarbeiterbearbeiten.Caption    := 'Daten Mitarbeiter bearbeiten';
        end;
    end;
end;      
Im Debugmode wird die procedure aufgerufen und in der Membervariable ist der
Wert 1 abgespeichert, die Anweisung zur Aenderung der Caption wird abgearbeitet,
aber in der Titelbar ändert sich nichts.
Es wird der Inhalt von Caption aus dem Objektinspektor angezeigt.
Dateianhänge
ARs 2013-08-07, 20_12_47.png
ARs 2013-08-07, 20_12_47.png (5.39 KiB) 1564 mal betrachtet
Vbxler
-------------------------

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Titlebar Text ändern

Beitrag von Michl »

Das einzigste, was mir einfällt, warum das nicht funktionieren könnte ist, dass Activate nicht erneut aufgerufen wird.

Setz dir doch mal einen Breakpoint auf
Vbxler hat geschrieben:

Code: Alles auswählen

            frmMitarbeiterbearbeiten.Caption    := 'Neuen Mitarbeiter hinzufügen';      //<--funktioniert nicht
ich glaube nicht, dass der Breakpoint gefunden wird (Debuggermode funktioniert, da nach dem Debuggen das Fenster neu aktiviert wird)

Ich habe mal ein Minimalbeispiel gemacht, dass evtl. das Verhalten nachstellt (beim Schließen der Form2 wird Form1.activate nicht nochmal aufgerufen, daher per Hand!).

In diesem Bsp. könnte man das Problem lösen, in dem man einfach noch mal Activate aufruft:
- 2 Formen
- dann in 1. Form 2 Buttons einfügen
- dann:

Form1:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Caption:='Ändere Caption aufgrund Button';
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Form2.showmodal;
//  Form1.Activate;          //Ist es damit gelöst ?!
end;
 
procedure TForm1.FormActivate(Sender: TObject);
begin
  Caption:='Caption wird von Activate geschrieben';
end;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Titlebar Text ändern

Beitrag von Vbxler »

Es ist unglaublich, aber an der selben Stelle mit

Code: Alles auswählen

Caption    := 'Neuen Mitarbeiter hinzufügen'; 
funktioniert es! :shock:

Danke für Deine Hilfe!

Leider ist es bei FPC so, dass man die Arbeiten die beim Aufruf eines Fenster
erledigt werden müssen in Activate packen muss, denn das Ereignis Create wird zweimal erzeugt.
Einmal beim Start der Anwendung und einmal beim Aufruf des Fenstern.
Das ist eigentlich eine unübliche Vorgangsweise, dass die Fenster die garnicht benötigt werden,
beim Programmstart ein Create erhalten.
Vbxler
-------------------------

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Titlebar Text ändern

Beitrag von m.fuchs »

Vbxler hat geschrieben:Es ist unglaublich, aber an der selben Stelle mit

Code: Alles auswählen

Caption    := 'Neuen Mitarbeiter hinzufügen'; 
funktioniert es! :shock:
Hm, langsam kommt mir ein Verdacht...
Vbxler hat geschrieben:Leider ist es bei FPC so, dass man die Arbeiten die beim Aufruf eines Fenster
erledigt werden müssen in Activate packen muss, denn das Ereignis Create wird zweimal erzeugt.
Einmal beim Start der Anwendung und einmal beim Aufruf des Fenstern.
Das ist eigentlich eine unübliche Vorgangsweise, dass die Fenster die garnicht benötigt werden,
beim Programmstart ein Create erhalten.
Das ist nicht richtig. OnCreate wird nur ein einziges Mal (pro Form!) aufgerufen, dann wenn das Form erzeugt wird.
Wir können jetzt also unsere Glaskugel besser raten lassen:
Du hast zwei Forms erzeugt. Und das Zweite heißt nicht frmMitarbeiterbearbeiten. Dann kann das natürlich auch nicht funktionieren, denn dein ursprünglicher Code ändert explizit die Caption des Forms, was gar nicht zu sehen ist. Das ist übrigens auch mit ein Grund warum man Self nutzen sollte, das nur nebenbei.
Schmeiß dein zweites Form raus und lass lieber das automatisch erzeugte mit .Show anzeigen. Es sei denn du möchtest mehrere Instanzen dieses Forms gleichzeitig erlauben.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Titlebar Text ändern

Beitrag von Vbxler »

Create wird deshalb zweimal aufgerufen, da Lazarus beim Hinzufügen einer weiteren Form
in der Programmunit diese zweite Form beim Programmstart aufruft.

Code: Alles auswählen

 
begin
    RequireDerivedFormResource := True;
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.CreateForm(TForm2, Form2);  //<-- wird automatisch eingefügt
    Application.Run;
end.
 
Wenn man es manuell entfernt ist es so wie Du gesagt hast, ausser es gibt abhängigkeiten:
OnCreate -> OnShow -> OnActivate -> OnPaint -> OnResize ...

Ich gestalte den Aufruf so wie im Anhang, das ist hoffentlich richtig.


Danke für Eure Hilfe!
Dateianhänge
Form_Test.7z
(660.02 KiB) 81-mal heruntergeladen
Vbxler
-------------------------

Vbxler
Beiträge: 129
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Titlebar Text ändern

Beitrag von Vbxler »

Ich habe jetzt diese Abhängigkeiten bereinigt, jetzt ich in der Programmunit nur das erste Hauptfenster,
dadurch habe ich nur eine OnCreate. Das ist sehr beruhigent, jetz verhält es sich wie erwartet.
Vbxler
-------------------------

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2822
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Titlebar Text ändern

Beitrag von m.fuchs »

Vbxler hat geschrieben:Create wird deshalb zweimal aufgerufen, da Lazarus beim Hinzufügen einer weiteren Form
in der Programmunit diese zweite Form beim Programmstart aufruft.
Nein, Create wird nur einmal pro Form aufgerufen. Dein Problem ist, dass du zu viele Forms hast. Oder hattest wenn du es jetzt nicht mehr so wie in deinem Beispiel machst.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten