Würdet ihr es anders machen? [Gerne auch Diskussion]

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
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:

Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von Maik81SE »

Moin @ll.

hier habe ich mal eine sogenannte Schönheitsfrage und würde gerne mal wissen, welche Variante ihr eher bevorzugen würdet..

Variante A (CloseWithOk in jeder Unit)

Code: Alles auswählen

procedure CloseWithOk;
// Status auf ok und Dialog/Formular schließen
begin
  Status := mrOk;
  UserForm.Close;		
end;
Variante B (CloseWithOk in einer Sammlung aufnehmen)

Code: Alles auswählen

// Funcktion in der Sammel-Unit (in meinem Fall >ufunction<)
procedure CloseWithOk(Form: tform);
// Status auf ok und Dialog/Formular schließen
begin
  Status := mrOk;
  Form.Close;
end;

//Aufruf im Formular
CloseWithOk(UserForm)
Da diese Funktion in jedem Form aufgerufen wird, wo mit CloseWithOk gearbeitet wird spart man unterm Strich keine Programmzeilen lediglich schaft man sich selbst eine Funktion um die Effektiven Zeilen welche man von Hand schreiben muß um ca 84% spart.

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
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von theo »

Was ist "Status"?

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von MmVisual »

Normalerweise gibt es für modale Formulare den "ModalResult".
Wenn man ein TButton drückt kann man in den Eigenschaften vom Button direkt einstellen mit welchem Rückgabewert das Formular geschlossen werden soll.

Es braucht dazu genu 0 Codezeilen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von wennerer »

Hallo Maik,
zu ModalResult ist hier ein schönes Beispiel:

viewtopic.php?p=68128#p68128

Wichtig ist du musst im OI beim TButton das Ergebnis für ModalResult einstellen.

Viele Grüße
Bernd

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von MmVisual »

Wenn man auf einem Formular, das man aus dem Haupt Formular mit "ShowModal" auf ruft, und auf diesem aufgerufenen Formular ein TButton mit der Eigenschaft TButton.ModalResult auf mrOK im Objektinspektor setzt, dann brauch es in dem aufgerufenen Formular kein FormXY.Close. Das macht die Taste von ganz alleine.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von Maik81SE »

theo hat geschrieben:
Sa 27. Jan 2024, 12:58
Was ist "Status"?
Status ist eine Variable vom Typ Integer.
MmVisual hat geschrieben:
Sa 27. Jan 2024, 13:05
Normalerweise gibt es für modale Formulare den "ModalResult".
Wenn man ein TButton drückt kann man in den Eigenschaften vom Button direkt einstellen mit welchem Rückgabewert das Formular geschlossen werden soll.

Es braucht dazu genu 0 Codezeilen.
Ungeachtet dessen, und da wirst du mit zustimmen, muß man eine Form mit der Anweisung Formxy.Close; oder ähnliches schließen. Und selbst wenn ich zB die Form User Schließe, welche aus der Main aufgerufen wird, muß ich in der *User* irgendwo bei Klick auf einen Button, den Rückgabewert für den ModalResult definieren.

Ich weiß ja nicht, ob deine Kristallkugel weiß, mit welchem Rückgabewert dein Form arbeitet, wenn in selbst gebauten keine Rückgabe definierst.
Meine kann es auf jedenfall nicht außer ich verwende MessageDLG und/oder TTaskDLG :mrgreen: :mrgreen:
Ich hoffe du verstehst die Ironie in diesem Vergleich
wennerer hat geschrieben:
Sa 27. Jan 2024, 13:47
Hallo Maik,
zu ModalResult ist hier ein schönes Beispiel:

viewtopic.php?p=68128#p68128

Wichtig ist du musst im OI beim TButton das Ergebnis für ModalResult einstellen.

Viele Grüße
Bernd
Im Kern genau das, mit dem ich ja auch arbeite.
Hier mal das Form.

Code: Alles auswählen

unit _user;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  StdCtrls, Menus, registry,

  uconst, udata, ufunction, uvar;

type

  { TUserForm }

  TUserForm                                      = class(TForm)
    button1                                      : tbutton;
    button2                                      : tbutton;
    button3                                      : tbutton;
    checkbox1                                    : tcheckbox;
    ComboBox1                                    : TComboBox;
    Label1                                       : TLabel;
    procedure button1click(sender :tobject);
    procedure button2click(sender :tobject);
    procedure checkbox1change(sender :tobject);
    procedure formcreate(sender :tobject);
    procedure formshow(sender :tobject);
  private
    { private declarations }
  public
    { public declarations }

    // Klassenaufrufe
    Benutzer                                     : TUser;

end;

var
  UserForm                                       : TUserForm;

implementation

{$R *.lfm}

uses main, _user_setting;

{ TUserForm }

procedure tuserform.formcreate(sender :tobject);
begin
  benutzer                                       := TUser.Create;
end;

procedure tuserform.formshow(sender :tobject);
var
  a                                              : Byte;
  Count                                          : Integer = 0;
  Reg                                            : TRegistry;

begin
  Reg                                            := TRegistry.Create;
  Status                                         := 0;
  try
    Reg.RootKey                                  := HKeyUser;
    Reg.OpenKeyReadOnly(ListKey);
    repeat
      Inc(Count);
      until Reg.ValueExists('Benutzer: ' + IntToStr(Count)) = False;
    for a := 0 to Count-1 do
      if (ComboBox1.Items[a] <> Benutzer.fUserList[a]) then
        ComboBox1.Items.Add(Benutzer.fUserList[a]);
    finally
      Reg.Free;
  end;
end;

procedure tuserform.button1click(sender :tobject);
var
  Reg                                            : TRegistry;
begin
  Benutzer.fUsed                                 := ComboBox1.Text;
  UserCount                                      := IntToStr(ComboBox1.Items.IndexOf(ComboBox1.Text));
  Form1.User.User;
  if DefaultUser then begin
    Reg                                          := TRegistry.Create;
    try
      Reg.RootKey                                := HKeyUser;
      Reg.OpenKey(ProgKey + PathDelim + 'Mastersettings', True);
      Reg.WriteString('User:', UserCount);
    finally
      reg.Free;
      end;
    end;
  LoadUser;
  CloseWithOK(UserForm);
end;

procedure tuserform.button2click(sender :tobject);
begin
  Close;
end;

procedure tuserform.checkbox1change(sender :tobject);
begin
  if Checkbox1.Checked then DefaultUser              := True
  else DefaultUser                                   := False;
end;

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)

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: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von Maik81SE »

MmVisual hat geschrieben:
Sa 27. Jan 2024, 14:25
Wenn man auf einem Formular, das man aus dem Haupt Formular mit "ShowModal" auf ruft, und auf diesem aufgerufenen Formular ein TButton mit der Eigenschaft TButton.ModalResult auf mrOK im Objektinspektor setzt, dann brauch es in dem aufgerufenen Formular kein FormXY.Close. Das macht die Taste von ganz alleine.
Zumindest eine Variante, die man auch mal in's Auge fassen kann :D

So zeigt sich, das jeder seine eigene Handschrift im laufe der Zeit entwickelt hat.

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)

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von MmVisual »

Ich habe dir mal ein Projekt angehängt.
- Hauptformular ruft Modales auf.
- 2 Button drin mit unterschiedlichen Rükgabewerten wenn man drauf drückt
- Hauptformular reagiert darauf.

Du siehst, man kann Rückgabewerte generieren und Formular schließen ohne Code zu schreiben.

DIe Handschrift ist ja ganz Nett, jedoch wenn man nicht die Funktionen von der IDE richtig benutzt wird einem das mit der Zeit auf die Füße fallen, den Code unübersichtlicher und die Wartung erschweren und andere haben es schwerer da rein zu kommen.

Ich progge schon über 20 Jahre Pascal, ich weiß auch vieles nicht und frage hier oft wie man das und das löst, denn wenn man es so löst wie die Lazarus Entwickler sich das erdacht haben hat man hinterher es deutlich einfacher und baut sich weniger Fallen in der Zukunft ein, bzw. Lazarus sagt einen dann ganz genau was "Depreached" ist und es gibt dann die Hilfe wie man das ändern sollte.

Demo Modal:
TestModal.zip
(138.94 KiB) 73-mal heruntergeladen
EleLa - Elektronik Lagerverwaltung - www.elela.de

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: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von Maik81SE »

MmVisual hat geschrieben:
Sa 27. Jan 2024, 15:06
Du siehst, man kann Rückgabewerte generieren und Formular schließen ohne Code zu schreiben.
Das ein Punkt, den kann/will/werde ich nie wiedersprechen. ;)
MmVisual hat geschrieben:
Sa 27. Jan 2024, 15:06
DIe Handschrift ist ja ganz Nett, jedoch wenn man nicht die Funktionen von der IDE richtig benutzt wird einem das mit der Zeit auf die Füße fallen, den Code unübersichtlicher und die Wartung erschweren und andere haben es schwerer da rein zu kommen.
Das muß ich mir auf die Fahne schreiben.
Ich hab es bis heute noch nicht Geschafft das entsprechende Buch für Lazarus zu kaufen.
Hab es noch auf meiner ToDo-Liste, welche aber anstelle kürzer zu werden immer länger wird. :shock:
MmVisual hat geschrieben:
Sa 27. Jan 2024, 15:06
Ich progge schon über 20 Jahre Pascal, ich weiß auch vieles nicht und frage hier oft wie man das und das löst, denn wenn man es so löst wie die Lazarus Entwickler sich das erdacht haben hat man hinterher es deutlich einfacher und baut sich weniger Fallen in der Zukunft ein, bzw. Lazarus sagt einen dann ganz genau was "Depreached" ist und es gibt dann die Hilfe wie man das ändern sollte.
Wäre echt fatal, wenn man alles wissen würde.
Uns würde der ergeitz fehlen sich selber zu verbessern.
Kenne ich auch in meinem Job als Schaltschrankbauer.

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)

CCRDudeLaz
Beiträge: 29
Registriert: Do 25. Jan 2024, 08:33
OS, Lazarus, FPC: Win/macOS/Linux (L trunk FPC trunk)
CPU-Target: 32+64

Re: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von CCRDudeLaz »

Variante A klappt ja nur mit der globalen Variable und wäre mir nicht zukunftskompatibel genug. Vielleicht soll das Formular in Zukunft ja mehrfach nutzbar sein können, oder aus Performancegründen erst wenn benötigt erstellt werden.

Variante B ist mir als Prozedur auch nicht angenehm.

Warum nicht C, TMeineForm.CloseWithOk? Wenn es mehrere Forms betrifft vllt. auch in einer gemeinsamen Parent-Form-Klasse nur ein einziges mal definiert.

Ansonsten verwendet man den Status doch am ehesten mit ShowModal, nicht mit bloßem Show, und dann wären mir A und B eh fremd.

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: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von Maik81SE »

CCRDudeLaz hat geschrieben:
So 28. Jan 2024, 13:07
Variante A klappt ja nur mit der globalen Variable und wäre mir nicht zukunftskompatibel genug. Vielleicht soll das Formular in Zukunft ja mehrfach nutzbar sein können, oder aus Performancegründen erst wenn benötigt erstellt werden.

Variante B ist mir als Prozedur auch nicht angenehm.

Warum nicht C, TMeineForm.CloseWithOk? Wenn es mehrere Forms betrifft vllt. auch in einer gemeinsamen Parent-Form-Klasse nur ein einziges mal definiert.

Ansonsten verwendet man den Status doch am ehesten mit ShowModal, nicht mit bloßem Show, und dann wären mir A und B eh fremd.
Letzten Endes hat mich MmVisual mit deinem Demo mehr als überzeugt und und das Programm war binnen 5 Minuten um 10 % reduziert.

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)

Erwin
Beiträge: 286
Registriert: Mi 16. Sep 2009, 14:15
OS, Lazarus, FPC: Xubuntu 22.04 / x86_64_linux-gtk 2 / L 2.2.0 / FPC 3.2.2

Re: Würdet ihr es anders machen? [Gerne auch Diskussion]

Beitrag von Erwin »

Abgesehen davon, ob diese Prozedur überhaupt Sinn macht, so ist meiner Meinung nach Variante B überwiegend die bessere Wahl.

Ich selbst habe oft mit Variante A gearbeitet. Und inzwischen mehrmals festgestellt, dass ich eine Prozedur auch für anderes gebrauchen könnte, wäre da nicht das Problem mit der Festen Variable/Bezeichnung innerhalb der Prozedur. Was oft dazu führte, anstatt im Programm entsprechender Stelle einfach der Prozedur anderen Variablen zu übergeben, ich eine neue Prozedur (A) schrieb ... nur um mir später klar zu werden, dass es Sinnvoller gewesen wäre, die bereits vorhandene Prozedur (A) etwas anzupassen (zu B).

Ich denke, Prozuduren und Funktionen sollten generell so geschrieben sein, dass beim Aufruf alle nötigen Daten dann übergeben werden (auch wenn es beim Aufruf somit mit etwas mehr Schreibarbeit verbunden ist). So dass man diese in allen Programmen nutzen kann, und nicht an einzelne Programmen, ja gar Aufgaben gebunden sind. Meine sind es überwiegen. Und ich finde das im Nachhinein dumm von mir, weil nicht selten hätte ich die gleiche Prozedur auch an anderer Stelle brauchen können, wäre da eben nicht das Problem mit der festen Variablen in der Prozedur.
Lazarus 2.2.0 / FP 3.2.4

Antworten