Programmieren vereinfachen

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 718
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.5 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Programmieren vereinfachen

Beitrag von Niesi »

Andy Nightingale hat geschrieben: Mi 29. Apr 2026, 12:56 Hallo Leute,
um nicht in jeder Form immer wieder das Gleiche machen zu müssen habe ich eine Unit wo z.B. alle Fenstersachen drin sind.wie:

Code: Alles auswählen

  procedure FensterAktivieren(Form: TForm);

begin

  // Falls minimiert, wieder normal machen
  if Form.WindowState = wsMinimized then
    Form.WindowState := wsNormal;

  // Fenster sichtbar machen, falls es versteckt ist
  if not Form.Visible then
    Form.Show;

  // Fenster in den Vordergrund holen
  Form.BringToFront;
  Form.SetFocus;
end;   
Nun möchte ich dort noch folgendes integrieren:

Code: Alles auswählen

 if FSchnellbericht = Nil then
     FSchnellberichtf := TFSchnellbericht.Create(Self);  
Da wo jetzt Schnellbericht steht ist eigentlich jede Form gemeint. Versteht ihr was ich meine? Hat jemand irgendeine Idee dazu? Wäre super.
Wie benutzt Du das denn?

Dein Programm hat ein Fenster am Laufen, welches minimiert ist. Und Du hast eine Unit, in der Funktionen/Prozeduren sind, um diese Fenster wieder "groß" zu machen?

Wollen die User das?

Du möchtest standardisiert ein Fenster, welches noch nicht created ist, createn und dann zeigen. Zumindest verstehe ich das so. Aber: Warum? Wollen die User das in dem Moment?

Das Öffnen, Schließen, Minimieren, Maximieren oder Einstellen auf eine bestimmte Größe muss doch den Usern überlassen sein - die müssen damit arbeiten.

Oder verstehe ich da was falsch?
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Andy Nightingale
Beiträge: 403
Registriert: Mo 13. Jan 2025, 12:11

Re: Programmieren vereinfachen

Beitrag von Andy Nightingale »

Hallo Niesi,
ja das ist eine Vorgabe meines Kunden das mit den Fenstern. Danke für die Nachfrage. Grüße

Benutzeravatar
Zvoni
Beiträge: 652
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Programmieren vereinfachen

Beitrag von Zvoni »

Ungetestet

Code: Alles auswählen

procedure FensterAktivieren(Form: TForm; Besitzer:TForm);

begin
  If Form = Nil Then Form:=TFSchnellbericht.Create(Besitzer);  //Braucht natürlich die Unit, wo FSchnellbericht definiert, ist in "Uses"
  
  // Falls minimiert, wieder normal machen
  if Form.WindowState = wsMinimized then
    Form.WindowState := wsNormal;

  // Fenster sichtbar machen, falls es versteckt ist
  if not Form.Visible then
    Form.Show;

  // Fenster in den Vordergrund holen
  Form.BringToFront;
  Form.SetFocus;
end;   
Aufruf aus deinem Button-Click:

Code: Alles auswählen

FensterAktivieren(FSchnellbericht, Self);
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
af0815
Lazarusforum e. V.
Beiträge: 7285
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: Programmieren vereinfachen

Beitrag von af0815 »

Andy Nightingale hat geschrieben: Mi 29. Apr 2026, 18:24 Hallo Niesi,
ja das ist eine Vorgabe meines Kunden das mit den Fenstern. Danke für die Nachfrage. Grüße
Ich leite mir für solche "Vorgaben" ein Form ab, das im ganzen Projekt für den Kunden verwendet wird. Das wird für alle Form's für diesen Kunden als Elternform genommen. Dasselbe mit Frames, damit habe ich ganz einfach ein paar Vorlagen, das so wie das TForm zu verwenden ist. Wartbar, änderbar und alles an einer Stelle. Ändere ich den "Master" (=Vorlage), richt einmal neu clean kompilieren der Projekte und die Änderung ist überall durchgesetzt.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 718
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.5 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Programmieren vereinfachen

Beitrag von Niesi »

Andy Nightingale hat geschrieben: Mi 29. Apr 2026, 18:24 Hallo Niesi,
ja das ist eine Vorgabe meines Kunden das mit den Fenstern. Danke für die Nachfrage. Grüße
Na ja, so etwas solltest Du ruhig erwähnen.

Ich muss aber zugeben, dass ich nicht sicher bin, ob ich alles richtig verstanden habe - ich denke, ein Beispielprojekt würde helfen. Mag jetzt ein wenig Arbeit sein, aber wenn es viele besser verstehen, dann kommen vielleicht auch gute Ideen dabei rum. Und das kann dann nicht nur Dir helfen, vielleicht ist das dann für einige noch mal eine Inspiration ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Andy Nightingale
Beiträge: 403
Registriert: Mo 13. Jan 2025, 12:11

Re: Programmieren vereinfachen

Beitrag von Andy Nightingale »

Zvoni hat geschrieben: Do 30. Apr 2026, 09:30 Ungetestet

Danke Zvoni.- so habe ich es noch nicht getestet. Coole Idee. Grüße :D

Andy Nightingale
Beiträge: 403
Registriert: Mo 13. Jan 2025, 12:11

Re: Programmieren vereinfachen

Beitrag von Andy Nightingale »

af0815 hat geschrieben: Do 30. Apr 2026, 10:44
Andy Nightingale hat geschrieben: Mi 29. Apr 2026, 18:24 Hallo Niesi,
ja das ist eine Vorgabe meines Kunden das mit den Fenstern. Danke für die Nachfrage. Grüße
Ich leite mir für solche "Vorgaben" ein Form ab, das im ganzen Projekt für den Kunden verwendet wird. Das wird für alle Form's für diesen Kunden als Elternform genommen. Dasselbe mit Frames, damit habe ich ganz einfach ein paar Vorlagen, das so wie das TForm zu verwenden ist. Wartbar, änderbar und alles an einer Stelle. Ändere ich den "Master" (=Vorlage), richt einmal neu clean kompilieren der Projekte und die Änderung ist überall durchgesetzt.
Hallo 0815, ja genau. Das verstehe ich noch nicht ganz....aber so ähnlich stelle ich mir das vor. Man ändert die Hauptform und alles passt sich an. Coole Idee. Wie macht man das genau. Gibt es dafür ein Beispiel irgendwo? Grüße :roll:

kirchfritz
Beiträge: 270
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win11 (L 4.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: Programmieren vereinfachen

Beitrag von kirchfritz »

Ich verstehe die Frage des Fragestellers so:

Er möchte eine allgemeingütige Procedure FensterAktivieren haben, die ungefähr so aussehen soll:

Code: Alles auswählen

procedure FensterAktivieren(Form: TForm);
begin

  // Falls minimiert, wieder normal machen
  if Form.WindowState = wsMinimized then
    Form.WindowState := wsNormal;

  // Fenster sichtbar machen, falls es versteckt ist
  if not Form.Visible then
    Form.Show;

  // Fenster in den Vordergrund holen
  Form.BringToFront;
  Form.SetFocus;
end;   
Ich glaube sein Problem ist, dass er das Erzeugen der Form nicht außerhalb der

Code: Alles auswählen

procedure FensterAktivieren
machen möchte, sondern innerhalb der

Code: Alles auswählen

procedure FensterAktivieren
.

Also ungefähr so:

Code: Alles auswählen

procedure FensterAktivieren(Form: TForm);
begin
  if Form = nil then
    Form := TIrgendwas?????.create(?????);
    
  // Falls minimiert, wieder normal machen
  if Form.WindowState = wsMinimized then
    Form.WindowState := wsNormal;

  // Fenster sichtbar machen, falls es versteckt ist
  if not Form.Visible then
    Form.Show;

  // Fenster in den Vordergrund holen
  Form.BringToFront;
  Form.SetFocus;
end;   
Jetzt gilt es eigentlich, die von mir gesetzten ????? in Sinnvolles umzusetzen.
Die zweiten ??????? lassen sich mit der vorhererwähnten BesitzerForm eliminieren.
Bleiben also noch die ersten ??????
Man müsste irgendwie den Typ der Form an die Procedure mit übergeben.
Wie das geht, habe ich keine Ahnung.
Ich würde ebenhalt die Form außerhalb der

Code: Alles auswählen

procedure FensterAktivieren
erzeugen, dann bleibt diese proecedure davon verschont, die zu aktivierende Form auch noch erzeugen zu müssen

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

Re: Programmieren vereinfachen

Beitrag von wp_xyz »

Ich würde auch dringend davon abraten, das Formular in "FensterAktivieren" zu erzeugen. Dafür fehlen noch wichtige Parameter: Welche Klasse soll verwendet werden (d.h. es muss der Klassentyp angegeben werden, z.b. TSchnellBericht)? Wer ist der Owner (d.h. wer kümmert sich darum, das Formular wieder zu zerstören)? Und vor allem, wenn der User nil als Owner angibt, muss du dich selbst um das Aufräumen kümmern, hast aber keine Möglichkeit, das erzeugte Formular wiederzufinden, weil es nicht als var-Parameter oder als Funktionsergebnis angegeben ist. Und selbst wenn, würde ich bei einer Funktion namens "FensterAktiveren" nie daran denken, dass ich noch Aufräumarbeiten erledigen muss - dafür wäre ein Namen wie "FensterErzeugen" oder "FensterErzeugenUndAktivieren" besser:

Code: Alles auswählen

function FensterErzeugenUndAktivieren(AClass: TFormClass; AOwner: TComponent): TForm;
begin
  Result := AClass.Create(AOwner);
  FensterAktivieren(Result);
end;
Aufruf:

Code: Alles auswählen

FSchnellBericht := FensterEreugenUndAktivieren(TSchnellBericht, Application);
Aber ehrlichgesagt: dafür gibt es schon den Standard-Aufruf mit Hilfe des Constructors:

Code: Alles auswählen

FSchnellBericht := TSchnellBericht.Create(Application);
FensterAktivieren(FSchnellBericht);

Benutzeravatar
kupferstecher
Beiträge: 438
Registriert: Do 17. Nov 2016, 11:52

Re: Programmieren vereinfachen

Beitrag von kupferstecher »

Dass auf die Ausgangsfrage nicht direkt eine passende Antwort gekommen ist, liegt m.E. daran, dass die Vorgehensweise vom TE, ein Formular genau bei der ersten Benutzung zu erzeugen eher ungewöhnlich ist. Entweder man erzeugt alle beim Programmstart, oder man erzeugt sie wirklich nur bei Bedarf, dann sollte man sie aber nach jedem Schließen auch wieder freigeben. In dem Fall wäre wie von wp_xyz angesprochen dann der direkte Konstruktoraufruf (und analog der Destruktor bzw. Free) die passende Vorgehensweise. Aber ein nichtbenutztes Formular im RAM frisst keinen Strom und Geld gibt es für leeren Speicher auch nicht zurück, von daher würde ich bei Programmstart schon alle Formulare erzeugen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7285
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: Programmieren vereinfachen

Beitrag von af0815 »

Ich bin da nicht der Meinung von Kupferstecher. Ich erzeuge genau ein Formular beim Start und sonst nichts. Dieses Formular erzeugt alles weitere in definierter Reihenfolge. Nur sollte man sowieso ein Konzept haben, wie die Lebensdauer von Objekten ist und wer sich um die Verwaltung kümmert. Vor allen sollte man sich auf die automatische Erstellung zum Start nicht verlassen, es wäre nicht das erste Mal, das da Überraschungen sind, falls sich da eine Kleinigkeit ändert. Plötzlich sind benötigte Laufzeit Abhängigkeiten gestört und es geht Boooom und jeder wundert sich. Gerade wenn die Programme älter werden und wachsen kommt es oft zu diesen Woow Effekten.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Andy Nightingale
Beiträge: 403
Registriert: Mo 13. Jan 2025, 12:11

Re: Programmieren vereinfachen

Beitrag von Andy Nightingale »

Hallo Leute,

danke für die Vorschläge. Ich bin nun davon abgekommen, da immer wieder Fehler auftreten. Alle Fenster am Anfang zu laden funktioniert nicht wirklich und wenn man dann vergißt eins zu schließen dann entstehen irgendwie Speicherlücken und das Programm läuft nicht merh rund. So lernt man dazu :D

Antworten