Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Form-Event global für alle Formulare überschreiben? (https://www.delphipraxis.net/196066-form-event-global-fuer-alle-formulare-ueberschreiben.html)

günni0 20. Apr 2018 08:27

Delphi-Version: 10.2 Tokyo

Form-Event global für alle Formulare überschreiben?
 
Ich bin mir fast sicher, dass das nicht möglich ist.
Trotzdem interessiert es mich, ob es vielleicht doch möglich ist.

Ist es in Delphi möglich in einer einzigen Unit ein Event reinzuschreiben, welches ein normales Formular-Event anderer Formulare überschreibt?

haentschman 20. Apr 2018 08:29

AW: Form-Event global für alle Formulare überschreiben?
 
Moin...:P
Was hast du denn konkret vor? Ich wette, daß es andere Lösungen gibt.

günni0 20. Apr 2018 08:33

AW: Form-Event global für alle Formulare überschreiben?
 
In einem anderen thread hat mich jemand davon überzeugt, Formulare dynamisch zu erzeugen.
Das setze ich aktuell um.

Ich möchte aber ungerne überall wo ich Show brauche das hier schreiben
Delphi-Quellcode:
 if not Assigned(formmxyz) then
  formmxyz := TFormXYZ.Create;

 formmxyz.Show;
In eine Prozedur packen ist auch schlecht denke ich.

Der schöne Günther 20. Apr 2018 08:52

AW: Form-Event global für alle Formulare überschreiben?
 
Dein allererster Schritt sollte sein nicht mehr
Delphi-Quellcode:
TForm
sondern deine eigene
Delphi-Quellcode:
TGünniForm
zu benutzen und von dieser abzuleiten. In der Klasse kannst du dann das ganze grundlegende Verhalten einbauen das jedem Formular gleich sein soll.

günni0 20. Apr 2018 08:54

AW: Form-Event global für alle Formulare überschreiben?
 
Das klingt kompliziert. Sowas habe ich noch nie gemacht und höre davon auch zum ersten mal.
Hättest du ein Minimalbeispiel für mich?

himitsu 20. Apr 2018 09:14

AW: Form-Event global für alle Formulare überschreiben?
 
entweder Ableiten
> Bei Google suchenDelphi Form ableiten

Wobei TFormXYZ doch bereits eine Ableitung ist.
Wenn es für alle TFormXYZ gelten soll, dann genau da drin das Event im Formdesigner deklarieren.



Für Alle, die du erstellst:
Delphi-Quellcode:
formmxyz := TFormXYZ.Create;
formmxyz.OnEinEvent := DeineMethode;



ODER wenn wirklich für "Alle", also nicht nur für eine einzige FormKlasse:
dann NEIN

ABER Delphi führt für alle Nachfahren von TForm/TCustomForm/TDataModule eine globale Liste, welche man durchlaufen könnte.
> Screen (Delphi-Referenz durchsuchenVCL.Forms.TScreen.Forms)

günni0 20. Apr 2018 09:26

AW: Form-Event global für alle Formulare überschreiben?
 
Das versteh ich nicht so ganz.

Das hier steht in meiner DPR:
Delphi-Quellcode:
Application.CreateForm(TFormListe, FormListe);
Application.CreateForm(TAlphabet, FormAlphabet);
Die würde ich gerne da rausnehmen und selber erzeugen. Kein Problem. Aber das ergibt dann viel von dem o.g. doppelten Code.

TiGü 20. Apr 2018 10:18

AW: Form-Event global für alle Formulare überschreiben?
 
Zitat:

Zitat von günni0 (Beitrag 1399952)
Das versteh ich nicht so ganz.

Das hier steht in meiner DPR:
Delphi-Quellcode:
Application.CreateForm(TFormListe, FormListe);
Application.CreateForm(TAlphabet, FormAlphabet);
Die würde ich gerne da rausnehmen und selber erzeugen. Kein Problem. Aber das ergibt dann viel von dem o.g. doppelten Code.

Wie wärs mit:
Delphi-Quellcode:
function CreateAndShowForm(const AFormClass: TFormClass; AFormInstance: TCustomForm): Boolean;
begin
 if not Assigned(AFormInstance) then
  AFormInstance := AFormClass.Create(Application);

 AFormInstance.Show;

 Result := AFormInstance.Visible;
end;
Delphi-Quellcode:
CreateAndShowForm(TFormListe, FormListe);
CreateAndShowForm(TAlphabet, FormAlphabet);

günni0 20. Apr 2018 10:28

AW: Form-Event global für alle Formulare überschreiben?
 
Die Zuweisung und Erstellung funktioniert und ich kann das in einem ButtonClick aufrufen.
Komischerweise kann ich an einer anderen Stelle außerhalb des Formulars was da erstellt wird aber nicht auf die erstellte Klasseninstanz zugreifen.

Das hier hingegen funktioniert
Delphi-Quellcode:
   if not Assigned(FormListe) then
    FormListe:= TFormListe.Create(Application);

haentschman 20. Apr 2018 10:39

AW: Form-Event global für alle Formulare überschreiben?
 
Moin...:P
Zitat:

Dein allererster Schritt sollte sein nicht mehr TForm sondern deine eigene TGünniForm zu benutzen und von dieser abzuleiten.
Wenn Ableitungen für dich ein indisches Gewürz ist, dann fehlen Grundlagen.
Vererbung:
https://www.delphi-treff.de/object-pascal/vererbung/
https://de.wikibooks.org/wiki/Progra...cal:_Vererbung

Dann hast du in allen Forms die von der Basis ableiten das fertige OnShow Event. inherited ist in diesem Zusammenhang wichtig!

günni0 20. Apr 2018 10:42

AW: Form-Event global für alle Formulare überschreiben?
 
Ich habe mich von Vererbung immer fern gehalten, weil alle Beispiele komischerweise immer auf scheinbar sinnlosen Daten die Obst, Autos, Reifen oder wie hier in dem Fall Menschen bezogen sind.
Ich bekomme das dann unmöglich auf die Reihe, das auf meinen Fall mit TForms umzudenken.

Ich glaube ich hatte aber eh einen Denkfehler. Man kann ja ableiten und tun und machen was man will.
Aber wenn ich FormX.Show; aufrufen möchte und im selben Aufruf eine Instanz dieser Form erzeugen möchte, dann geht das logischerweise nicht. Da bringt auch eine Ableitung nix.

TiGüs Antwort war da schon eher das was ich gesucht habe. Aber aus einem mir unverständlichen Grund funktioniert dann der Zugriff auf die Klasseninstanz außerhalb der Klasse nicht.

haentschman 20. Apr 2018 10:48

AW: Form-Event global für alle Formulare überschreiben?
 
Hallöle...8-)
Simples Beispiel:
Du hast 3 Forms. Alle wollen drucken. Da implementiert du 3x den Druck. :? Mit der Vererbung deiner 3 Forms von einer Basisform implementiert du den Druck nur 1x...nämlich in der Basisform! Vorteil: Änderungen am Druck stehen in allen der 3 Forms zur Verfügung. :thumb:

günni0 20. Apr 2018 10:50

AW: Form-Event global für alle Formulare überschreiben?
 
Das mit dem Drucken war ein komisches Beispiel, weil ich einfach eine Prozedur dafür aufrufen würde ABER ich verstehe was du meinst :P

Es gibt aktuell tatsächlich nur ein Beispiel wo ich Vererbung nutzen könnte.
Im FormCreate jeder form fast aller meiner Forms setze ich KeyPreview.

TiGü 20. Apr 2018 11:09

AW: Form-Event global für alle Formulare überschreiben?
 
Zitat:

Zitat von günni0 (Beitrag 1399963)
TiGüs Antwort war da schon eher das was ich gesucht habe. Aber aus einem mir unverständlichen Grund funktioniert dann der Zugriff auf die Klasseninstanz außerhalb der Klasse nicht.

Ohne Quelltext im Kontext deiner Anwendung -> keine Lösung von uns erwarten!

günni0 20. Apr 2018 11:18

AW: Form-Event global für alle Formulare überschreiben?
 
Ich verstehe euer Problem nicht.

Es gibt keinen Kontext. Ich habe einen Button, rufe deine Funktion auf, die ich zur Prozedur gemacht habe - klappt alles wie es soll!
Wenn dann aber eine andere Unit, weder die mit dem Button noch die, die erzeugt wird, auf die eigentlich erzeugte Klasseninstanz zugreifen will, kracht es.

Nicht mehr, nicht weniger.
Wenn das aber schon so anfängt, dann bin ich auch nicht mehr an einer Lösung interessiert. Ich habe alles beigetragen was ich beitragen kann.
Warum sollte ich den Aufruf deiner Funktion in einem simplen Button hier reinkopieren?

haentschman 20. Apr 2018 11:23

AW: Form-Event global für alle Formulare überschreiben?
 
Zitat:

Wenn dann aber eine andere Unit, weder die mit dem Button noch die, die erzeugt wird, auf die eigentlich erzeugte Klasseninstanz zugreifen will, kracht es.
Das liegt an deinem Design...was, wer, wo. Ohne QT oder eine Skizze aller Forms (wer mit wem?) kann man dir nicht wirklich helfen.

günni0 20. Apr 2018 11:28

AW: Form-Event global für alle Formulare überschreiben?
 
Erstelle ich die Instanz aber selber also
Delphi-Quellcode:
FormListe := TFormListe.Create(Application);
FormListe.Show;
gibt es diese Zugriffsverletzung nicht.

Das hier gibt aber eine in der anderen Unit
Delphi-Quellcode:
procedure CreateAndShowForm(const AFormClass: TFormClass; AFormInstance: TCustomForm);
begin
 if not Assigned(AFormInstance) then
  AFormInstance := AFormClass.Create(Application);

 AFormInstance.Show;
end;

CreateAndShowForm(TFormListe, FormListe);

Nur als Beispiel was auch schon zur AV führt. Nur ein Button, 2 Forms, absolut nichts weiter
Delphi-Quellcode:
procedure CreateForm(const AFormClass: TFormClass; AFormInstance: TCustomForm);
begin
 if not Assigned(AFormInstance) then
  AFormInstance := AFormClass.Create(Application);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateForm(TFormListe, FormListe);
 FormListe.Show; // hier passiert gar nichts und AV
end;

Jumpy 20. Apr 2018 11:37

AW: Form-Event global für alle Formulare überschreiben?
 
quatsch

Jasocul 20. Apr 2018 11:38

AW: Form-Event global für alle Formulare überschreiben?
 
Was passiert, wenn du den oberen Source wie folgt änderst?:
Delphi-Quellcode:
  if not assigned(FormListe) then
    FormListe := TFormListe.Create(Application);
  FormListe.Show;
Falls es dann auch knallt, ist wohl die Instanz-Variable nicht nil

Olli73 20. Apr 2018 11:42

AW: Form-Event global für alle Formulare überschreiben?
 
Versuche mal AFormInstance als var parameter zu deklarieren.

günni0 20. Apr 2018 11:43

AW: Form-Event global für alle Formulare überschreiben?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Jascoul, das funktioniert genau wie es soll. Kaum erstelle ich die Instanz aber über eine Prozedur, um doppelten und dreifachen Code zu sparen, kracht es sobald ich auf die Instanz zugreife.

Für alle die mir nicht glauben, da unten ist ein Beispielprojekt :P (DPR beachten, da wird Form2 absichtlich nicht erzeugt).

Zitat:

Versuche mal AFormInstance als var parameter zu deklarieren.
Dann meckert leider der Compiler wegen inkompatibler Typen.

Fritzew 20. Apr 2018 11:53

AW: Form-Event global für alle Formulare überschreiben?
 
So sollte das gehen.....

Delphi-Quellcode:
unit Unit1;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
 TForm1 = class(TForm)
  Button1: TButton;

  procedure Button1Click(Sender: TObject);
 private
  {Private-Deklarationen}
   FmyForm2 : Tcustomform;
 public
  {Public-Deklarationen}
 end;

var
 Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

(*
   Forminstance muss var sein !!!!!
*)

procedure CreateAndShowForm(const AFormClass: TFormClass; var AFormInstance: TCustomForm);
begin
 if not Assigned(AFormInstance) then
  AFormInstance := AFormClass.Create(Application);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateAndShowForm(TForm2, FmyForm2);
 FmyForm2.Show;
end;

end.

Jasocul 20. Apr 2018 11:55

AW: Form-Event global für alle Formulare überschreiben?
 
Lass mal das "const" bei den Parametern weg.

Ich kann deinen Source leider im Moment nicht prüfen, da ich hier kein Delphi zur Verfügung habe.

günni0 20. Apr 2018 11:58

AW: Form-Event global für alle Formulare überschreiben?
 
Zitat:

Delphi-Quellcode:
FmyForm2 : Tcustomform;

Doppelte Variablen dann leider. Scheint wohl nicht anders zu gehen.

Olli73 20. Apr 2018 11:59

AW: Form-Event global für alle Formulare überschreiben?
 
Mit var Parameter und folgendem Aufruf funktioniert dein Beispiel:

Delphi-Quellcode:
CreateAndShowForm(TForm2, TCustomForm(Form2));

Uwe Raabe 20. Apr 2018 16:10

AW: Form-Event global für alle Formulare überschreiben?
 
Ich will auch mal:
Delphi-Quellcode:
unit uFormUtils;

interface

uses
  Vcl.Forms;

type
  TFormUtils = record
  public
    class procedure ShowForm<T: TCustomForm>(var Instance: T); static;
  end;

implementation

class procedure TFormUtils.ShowForm<T>(var Instance: T);
begin
  if Instance = nil then begin
    Instance := T.Create(Application);
  end;
  Instance.Show;
end;
Der (typsichere) Aufruf wäre dann in etwa so:
Delphi-Quellcode:
TFormUtils.ShowForm<TForm2>(Form2);

günni0 20. Apr 2018 17:28

AW: Form-Event global für alle Formulare überschreiben?
 
Ich danke allen die mir geholfen haben.

Ich bin auf einem guten weg mit der Umstrukturierung meiner Codebasis. Der erste Schritt ist nun erst einmal, Formulare dynamisch zur Laufzeit zu erzeugen.
Habe noch gut 20 Formulare vor mir, die angepasst werden müssen. Dauert also noch etwas.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz