MainForm zur Laufzeit ändern

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

MainForm zur Laufzeit ändern

Beitrag von Maik81SE »

Moin zusammen.

Die überschrift lässt wohl erahnen, auf was ich dieses mal anspielen möchte und wo ich eure Meinung dazu hätte?

Besteht die Möglichkeit in einer Anwendung welche mind. 2 Forms enthält die MainForm wärend das Programm läuft von zB Form2 auf Form1 zu ändern?
Ein Blick in die forms.pp Zeile 1646

Code: Alles auswählen

property MainForm: TForm read FMainForm;
beantwortet mir diese Frage Pauschal mit einem NEIN.
Aber vielleicht hat ja jemand von euch noch ein Hintertürchen, welches nicht jedem bekannt ist.

Sollte dies Nicht möglich sein, muß ich schauen und überlegen, ob ich mir die Units UITypes und System.UITypes soweit erweitere, das mir damit Spezielle Abfragen bauen kann, bzw ich bau mir ein Frame auf, welches ich von Programm zu Programm anpassen kann.

Alternative Lösungsvorschläge sind aber auch gerne willkommen, sofern es nicht der ist
--> Form2 vor Form1 anzeigen zu lassen.
Diese Weg nutze ich im Moment, und bin zugegeben nicht wirklich 100 prozentig Glücklich damit.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

ArchChem
Beiträge: 83
Registriert: Mo 11. Jul 2022, 10:41

Re: MainForm zur Laufzeit ändern

Beitrag von ArchChem »

Hallo,

was ist denn der Zweck für diese Änderung? Gegebenfalls gibt es eine andere etwas elegantere Lösung.

Soner
Beiträge: 624
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: MainForm zur Laufzeit ändern

Beitrag von Soner »

Ich habe es damals so gelöst, dass mein Mainform leer und unsichtbar war. Es diente nur dazu andere Formulare zu öffnen und zu zeigen.
Wenn alle anderen Formulare geschlossen wurden, dann rief es Application.Terminate auf und das Programm wurde beendet.
Simpel und tut das, was du möchtest.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: MainForm zur Laufzeit ändern

Beitrag von Maik81SE »

Soner hat geschrieben:
Do 19. Okt 2023, 23:26
Ich habe es damals so gelöst, dass mein Mainform leer und unsichtbar war. Es diente nur dazu andere Formulare zu öffnen und zu zeigen.
Wenn alle anderen Formulare geschlossen wurden, dann rief es Application.Terminate auf und das Programm wurde beendet.
Simpel und tut das, was du möchtest.
Das ist analog selbiges Vorgehen, was ich jetzt mache.
Programm starten und je nach Auswertungen unsichtbar und folgende Formular Aktiv setzen, beim Beenden Application.Terminate oder direkt beenden.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: MainForm zur Laufzeit ändern

Beitrag von Maik81SE »

ArchChem hat geschrieben:
Do 19. Okt 2023, 23:03
Hallo,

was ist denn der Zweck für diese Änderung? Gegebenfalls gibt es eine andere etwas elegantere Lösung.
Zweck ist dieser, das ich keinen MessageDLG habe bzw es noch kein gibt, der Radio-Buttons oder ähnliche Komponenten nutzt.
Und über diesen Weg diese Dialoge simulieren wil/muss/möchte

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

charlytango
Beiträge: 845
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: MainForm zur Laufzeit ändern

Beitrag von charlytango »

Ich hab den Eindruck du schießt mit Kanonen auf Spatzen.

Für einen individuellen Dialog nimmt man ein Form das alles enthält was der Dialog braucht und öffnet es modal.
Erste Hinweise dazu findest du hier

Vorsicht beim nachvollziehen! Das Dialog-Formular wurde nicht automatisch generiert sondern im Code selbst erzeugt.

Ein grobes Beispiel liegt bei.

PS:
Maik81SE hat geschrieben:
Do 19. Okt 2023, 21:17
--> Form2 vor Form1 anzeigen zu lassen.
Diese Weg nutze ich im Moment, und bin zugegeben nicht wirklich 100 prozentig Glücklich damit.
Bei mir wie bei vielen anderen wird nur das Hauptformular der Anwendung automatisch erzeugt.
Alle anderen Elemente werden im Code erzeugt nach dem Muster im Beispiel.
Das ist erstmal mehr Arbeit, bei näherem Hinsehen bekommst du mehr Kontrolle und Flexibilität.
Dateianhänge
project1.zip
(140.49 KiB) 46-mal heruntergeladen
Zuletzt geändert von charlytango am Fr 20. Okt 2023, 10:33, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: MainForm zur Laufzeit ändern

Beitrag von wp_xyz »

Maik81SE hat geschrieben:
Fr 20. Okt 2023, 08:05
Zweck ist dieser, das ich keinen MessageDLG habe bzw es noch kein gibt, der Radio-Buttons oder ähnliche Komponenten nutzt.
Und über diesen Weg diese Dialoge simulieren wil/muss/möchte
Ich verstehe zwar immer noch nicht, worum es eigentlich geht, aber wenn das Fehlen von RadioButtons im MessageDlg das eigentliche Problem ist, dann solltest du mal den TTaskDialog ausprobieren. Das ist ein "Wald-und-Wiesen-Dialog", der Einstellmöglichkeiten für Radiobuttons, Checkboxen a la "Nicht mehr zeigen", Combobox ("Query"), Edit-Felder ("Simplequery"), Progressbar, enthält.

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: MainForm zur Laufzeit ändern

Beitrag von Maik81SE »

wp_xyz hat geschrieben:
Fr 20. Okt 2023, 10:29
TTaskDialog
charlytango hat geschrieben:
Fr 20. Okt 2023, 10:27
Ich hab den Eindruck du schießt mit Kanonen auf Spatzen.
Danke für die Beispiele.
Auch wenn TTaskDialog am ehsten dem entspricht, was ich suche, werd ich wohl eher auf die Variante von Charlytango aufbauen.
Hintergrund, bei TTaskDialog erhalte ich einen Speicherfehler, den ich nicht raus bekomme...

Code: Alles auswählen

procedure TQR_Frame.FormShow(Sender : TObject);
begin
  with TTaskDialog.Create(self) do
    try
      Title                            := 'Bitte wähle deinen Stream';
      Caption                          := 'QR Frame';
      CommonButtons                    := [tcbOk, tcbCancel];
      MainIcon                         := tdiQuestion;
      with RadioButtons.Add do
        Caption                        := '--> &Rock|Metal|NDH && Gothic <--';
      with RadioButtons.Add do
        Caption                        := '--> Electro in the Evening <--';
      with RadioButtons.Add do
        Caption                        := '--> Gemischt <--';
      if Execute then
        if ModalResult = mrOk then begin
          if RadioButton.Index = 0 then
            Rock                       := True;
          if RadioButton.Index = 1 then
            Electro                    := True;
          if RadioButton.Index = 2 then begin;
            Rock                       := True;
            Electro                    := True;
            end;
//          ShowMessage(Format('%d wird geladen', [RadioButton.Index]));
          end;
      if ModalResult = mrCancel then
        Application.Terminate;
    finally
      Free;
    end;
end;
Dabei spiel es keine Rolle, ob ich dies in einer FormShow oder in der *.lpr

Code: Alles auswählen

program QR;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  {$IFDEF HASAMIGA}
  athreads,
  {$ENDIF}
  Interfaces, sysutils, dialogs, // this includes the LCL widgetset
  Forms, UITypes, _qr, QR4OBS,
  { you can add units after this }
  // API-Units
  uconst, uvar;

{$R *.res}

begin
  RequireDerivedFormResource:=True;
  Application.Scaled:=True;
  Application.Initialize;
  Application.CreateForm(TQR_Frame, QR_Frame);
  Application.CreateForm(TQR4OBSFrame, QR4OBSFrame);
  if FileExists(TrackFile[0]) then begin
    Mixxx_File                         := TrackFile[0];
    ID_found                           := True;
    end else begin
      if FileExists(TrackFile[1]) then begin
        Mixxx_File                     := TrackFile[1];
        ID_found                       := True;
      end;
    end;
  with TTaskDialog.Create(NIL) do
    try
      Title                            := 'Bitte wähle deinen Stream';
      Caption                          := 'QR Frame';
      CommonButtons                    := [tcbOk, tcbCancel];
      MainIcon                         := tdiQuestion;
      with RadioButtons.Add do
        Caption                        := '--> &Rock|Metal|NDH && Gothic <--';
      with RadioButtons.Add do
        Caption                        := '--> Electro in the Evening <--';
      with RadioButtons.Add do
        Caption                        := '--> Gemischt <--';
      if Execute then
        if ModalResult = mrOk then begin
          if RadioButton.Index = 0 then
            QR_Frame.Rock              := True;
          if RadioButton.Index = 1 then
            QR_Frame.Electro           := True;
          if RadioButton.Index = 2 then begin;
            QR_Frame.Rock              := True;
            QR_Frame.Electro           := True;
            end;
//          ShowMessage(Format('%d wird geladen', [RadioButton.Index]));
          end;
      if ModalResult = mrCancel then
        Application.Terminate;
    finally
      Free;
    end;
Application.Run;
end.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: MainForm zur Laufzeit ändern

Beitrag von wp_xyz »

OK - keine Ahnung, aber ich könnte mir vorstellen, dass TTaskDialog nicht funktioniert, wenn er vor Application.Run ausgeführt wird.

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: MainForm zur Laufzeit ändern

Beitrag von wennerer »

Hallo Maik,
ich habe die Angewohnheit meine kleinen Test's aufzuheben und habe deshalb noch ein bißchen Beispielcode zum Task Dialog. Eventuell hilft dir der was.

Viele Grüße
Bernd
Dateianhänge
project1.zip
(106.03 KiB) 55-mal heruntergeladen

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: MainForm zur Laufzeit ändern

Beitrag von hum4n0id3 »

Maik81SE hat geschrieben:
Do 19. Okt 2023, 21:17
Besteht die Möglichkeit in einer Anwendung welche mind. 2 Forms enthält die MainForm wärend das Programm läuft von zB Form2 auf Form1 zu ändern?
Wenn ich es richtig verstehe möchtest du in einem Fenster dynamisch die Oberfläche ändern. Tricks habe ich mit dem TPanel gesehen. Statt mehrere Formen mit verschiedenen Oberflächen, macht man verschiedene TPanels und läßt diese bei Bedarf in Form1 anzeigen. Aber wie gut das ist und ob es so gewollt wäre...

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: MainForm zur Laufzeit ändern

Beitrag von wp_xyz »

Das würde ich so nicht machen. Angenommen, du würdest drei Formulare als Panels vorhalten und bei Bedarf aktivieren, dann hättest du trotzdem den Code von drei Formularen in einer Unit - ein heilloses Chaos. Besser wäre es, mit Frames zu arbeiten. Die verhalten sich wie Formulare, können in der IDE designt werden und haben ihre eigene Unit. Und zur Laufzeit erzeugst du den gewünschten Frame und gibst ihm die MainForm als Parent.

hum4n0id3
Beiträge: 301
Registriert: So 5. Mai 2019, 15:23

Re: MainForm zur Laufzeit ändern

Beitrag von hum4n0id3 »

Ja, mein Fehler. Ich kenne das mit Frames aber als ich den Post geschrieben habe ich nur TPanel gefunden und nicht Frames, dachte also das es bei Lazarus nicht gibt. Dabei ist es gleich neben TPanel. :oops:

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: MainForm zur Laufzeit ändern

Beitrag von af0815 »

hum4n0id3 hat geschrieben:
So 22. Okt 2023, 21:50
Ja, mein Fehler. Ich kenne das mit Frames aber als ich den Post geschrieben habe ich nur TPanel gefunden und nicht Frames, dachte also das es bei Lazarus nicht gibt. Dabei ist es gleich neben TPanel. :oops:
Das statische Frame am besten nicht verwenden. Dynamisch zur Laufzeit funktioniert das Spitze, aber der Editor in Lazarus hat - wie schon in Delphi - Probleme wenn laufend was geändert wird (kann es nicht erkennen) oder Ereignishandler wieder entfernt werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: MainForm zur Laufzeit ändern

Beitrag von Maik81SE »

wennerer hat geschrieben:
So 22. Okt 2023, 08:51
Hallo Maik,
ich habe die Angewohnheit meine kleinen Test's aufzuheben und habe deshalb noch ein bißchen Beispielcode zum Task Dialog. Eventuell hilft dir der was.
Auch ich hab mir angewöhnt diese Tests immer aufzuheben.
Wie oft hat mir das schon geholfen, gerade unter dem Kontext, das die auch alle in meiner #todo landen.
hum4n0id3 hat geschrieben:
So 22. Okt 2023, 12:39
Wenn ich es richtig verstehe möchtest du in einem Fenster dynamisch die Oberfläche ändern. Tricks habe ich mit dem TPanel gesehen. Statt mehrere Formen mit verschiedenen Oberflächen, macht man verschiedene TPanels und läßt diese bei Bedarf in Form1 anzeigen. Aber wie gut das ist und ob es so gewollt wäre...
Panel und Frame hab ich auch schon n's Auge gefasst, aber wegen dem Chaos schnell wieder verworfen.
wp_xyz hat geschrieben:
Sa 21. Okt 2023, 23:26
OK - keine Ahnung, aber ich könnte mir vorstellen, dass TTaskDialog nicht funktioniert, wenn er vor Application.Run ausgeführt wird.
Leider spielt es keine Rolle, ob vor oder nach dem Applocation.Run Im 2ten Test hab ich ihn in der Show getestet, mit dem selben Ergebnis als würde ich vor der Run arbeiten.

Letztendlich hab ich mich für diese Version entschieden.
Ob diese Elegant ist, darüber kann man sich gerne Streiten.
QR_Test.zip
QR-4-OSB
(10.63 KiB) 50-mal heruntergeladen

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Antworten