TModalResult

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

TModalResult

Beitrag von Maik81SE »

Moin zusammen,

Ich spiele Gerade mal wieder mit dem https://wiki.lazarus.freepascal.org/TTaskDialog

Nach diesem Bsp will ich mir einen Dialog aufbauen.
Soweit auch alles IO, aber aus einem mir unerklärlichen Grund wird das ModulResult entweder nicht gesetzt oder übergeben.

Hier die Procedure, welche ich entsprechend aufgebaut habe.

Code: Alles auswählen

procedure tform1.vergangen_itemclick(sender :tobject);
var
  a                                         : Byte;
begin
  For a := 0 to 9 do begin
    if (FileExists(Set_FileName(Tages_Ausloese.PConst.fExt + PathDelim +
                         	Tages_Ausloese.fYear.Benutzer + PathDelim +
                                IntToStr(Tages_Ausloese.fYear.Yaer),
                                Tages_Ausloese.PConst.fProg, false, false))) then begin
      with Jahr_DLG do begin
        with TTaskDialogButtonItem(Buttons.add) do begin
          Caption            := IntToStr(Tages_Ausloese.FYear.Yaer);
          ModalResult        := Tages_Ausloese.fYear.Yaer;		<--- Setzt ModalResult mit entsprechendem Jahr.
          end;
        end;
      dec(Tages_Ausloese.FYear.Yaer);
      end;
    end;
  if Jahr_DLG.Execute then begin
    Caption := IntToStr(ModalResult);
    if ModalResult = 2022 then begin
      Day.ItemUser                               := Tages_Ausloese.fBenutzer.Name + ' ' + Tages_Ausloese.fBenutzer.Lastname;
      StatusBar1.Panels.Items[0].Width           := StatusBar1.Canvas.TextWidth(Tages_Ausloese.PConst.fFilename)+20;
      StatusBar1.Panels.Items[0].Text            := Tages_Ausloese.PConst.fFilename;
      Caption                                    := Prog_Caption + IntToStr(ModalResult);
//      Caption                                    := Prog_Caption + IntToStr(Tages_Ausloese.fYear.Yaer) + '. Benutzer: ' + Day.ItemUser;
      ReloadItem.Click;
      end;
  end;
end;
im Gegensatz zu dem Beispiel, habe ich das TTaskDialog auf dem Formular fest definiert.

Da ModalResult ja laut Definition Werte von low(Integer) bis high(Integer) enthalten kann, sollte es ja nominell problemlos möglich sein, Werte größer 2020 zu verwenden.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.4 FPC 3.2.2);

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: TModalResult

Beitrag von Zvoni »

1) Bist du dir sicher, dass es YAER heisst?
2)
Dialog is shown with the Execute() method, and if this returns True, property ModalResult has ModalResult of the pressed button:

ModalResult of standard button (mrOK, mrCancel, mrYes etc)
Wieso setzt du Modalresult auf einen EIGENEN Integer?!?!?!?!?
Vor allem, wenn dieser dann "überschrieben" werden kann

Benutz ne eigene Form-Variable und gut ist
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Maik81SE
Beiträge: 327
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
CPU-Target: x86-64; avr
Wohnort: Lübeck
Kontaktdaten:

Re: TModalResult

Beitrag von Maik81SE »

Zvoni hat geschrieben: Do 5. Sep 2024, 13:51
Wieso setzt du Modalresult auf einen EIGENEN Integer?!?!?!?!?
Vor allem, wenn dieser dann "überschrieben" werden kann
Da dies die Dateinamen meiner Anwendung sind
Zvoni hat geschrieben: Do 5. Sep 2024, 13:51 Benutz ne eigene Form-Variable und gut ist
Dafür steht mein Type TAusloese

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.4 FPC 3.2.2);

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TModalResult

Beitrag von Mathias »

Ich spiele Gerade mal wieder mit dem https://wiki.lazarus.freepascal.org/TTaskDialog
Toter Link.

Nachtrag, im Zitat geht er, aber im ersten Post nicht. :roll:
Wieso auch immer.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TModalResult

Beitrag von Michl »

Maik81SE hat geschrieben: Do 5. Sep 2024, 13:42 Soweit auch alles IO, aber aus einem mir unerklärlichen Grund wird das ModulResult entweder nicht gesetzt oder übergeben.
Du greifst auf zwei verschiedene Modalresults zurück.

Hier setzt du TTaskDialogButtonItem(Buttons.add).ModalResult:

Code: Alles auswählen

      with Jahr_DLG do begin
        with TTaskDialogButtonItem(Buttons.add) do begin
          Caption            := IntToStr(Tages_Ausloese.FYear.Yaer);
          ModalResult        := Tages_Ausloese.fYear.Yaer;		<--- Setzt ModalResult mit entsprechendem Jahr.
          end;
Hier fragst du tform1.ModalResult ab:

Code: Alles auswählen

  if Jahr_DLG.Execute then begin
    Caption := IntToStr(ModalResult);
    if ModalResult = 2022 then begin
Aus genau diesem Grund ist es besser, with nicht zu nutzen und den Bezeichner immer komplett zu schreiben.

Code: Alles auswählen

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

Benutzeravatar
Maik81SE
Beiträge: 327
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
CPU-Target: x86-64; avr
Wohnort: Lübeck
Kontaktdaten:

Re: TModalResult

Beitrag von Maik81SE »

Moin @ll.

Hab das die Tage auf einer anderen Art elegant gelöst.
Habe mir dabei auch mal den Aufwand für die kommenden 20 Arbeitsjahre gemacht und für mich entschieden, das ich nur auf <> 0 abfrage.

Ergebnis.
Jahr_DLG komplett raus und alles nur in dem Ereignis verwendet.
Leider brauchte ich am Ende auch noch eine globale Variablen, da der TTaskDialog am Ende des Ereignisses entsorgt wird.

EDIT: 18:17
Hier hab ich mal die entsprechende Procudre.

Code: Alles auswählen

procedure tform1.vergangen_itemclick(sender :tobject);
var
  a                                         : Byte;
begin
  with TTaskDialog.Create(self) do try
    MainIcon                                := tdiInformation;
    CommonButtons                           := [tcbCancel];
    For a := 0 to 9 do begin
      if (FileExists({$ifdef Windows}
                     Tages_Ausloese.PConst.fExt + PathDelim + Tages_Ausloese.fYear.Benutzer + PathDelim + IntToStr(Tages_Ausloese.fYear.Yaer)
                     {$else ifdef}
                     Set_FileName(Tages_Ausloese.PConst.fExt + PathDelim +
                                  Tages_Ausloese.fYear.Benutzer + PathDelim +
                                  IntToStr(Tages_Ausloese.fYear.Yaer),
                                  Tages_Ausloese.PConst.fProg, false, false){$endif})) then begin
        with TTaskDialogButtonItem(Buttons.add) do begin
          Caption            := IntToStr(Tages_Ausloese.FYear.Yaer);
          ModalResult        := Tages_Ausloese.fYear.Yaer;
          end;
        dec(Tages_Ausloese.FYear.Yaer);
        end;
      end;
    if Execute then begin
      Current_Jahr                               := ModalResult;
      if ModalResult <> mrCancel then begin
        ReloadItem.Click;
        end;
      end;
  finally
    Free;
  end;
end;
Sicher werdet Ihr euch jetzt Fragen, warum ich hier mit der Current_Jahr arbeite.
dies ist dem geschuldet, da ich in dem ReloadItem meine Klassen einmal in die Ablage P werfe und neu aufbaue.

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.4 FPC 3.2.2);

Antworten