Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Ist Parentform von Frame ein Modales Form? (https://www.delphipraxis.net/208011-ist-parentform-von-frame-ein-modales-form.html)

bernau 27. Mai 2021 11:49

Ist Parentform von Frame ein Modales Form?
 
Ich habe ein Frame, auf dem einige Buttons sind. Dieses ist entweder auf einem Modalen "oder" einem Nicht-Modalen Form plaziert. Das Frame erzeuge ich im OnCreate des Forms.

Wenn das Frame auf einem Modalen Form ist, dann möchte ich einen bestimmten Button ausblenden.

Eigentlich ist es kein Problem herauszufinden, ob das Form Modal ist:

Delphi-Quellcode:
isModal := (fsModal in TForm(owner).FormState);


Wenn ich diesen Code aufrufe, wenn das Form erzeugt ist, dann ist es kein Problem.

Aber... dieser Code Funktioniert nicht im Create oder Afterconstruction des Frames, da das Form "noch nicht" den Modalen Status hat.

Irgendeine Idee, wie ich sonst noch im Frame herausfinden kann, ob das Form mit ShowModal aufgerufen wird?

DeddyH 27. Mai 2021 12:12

AW: Ist Parentform von Frame ein Modales Form?
 
Könnte der Ansatz funktionieren? https://www.detlef-heibing.de/progra...und-holen.html
Interessant wäre für Dich in dem Zusammenhang die Methode GetModalWindow, wenn da ein Ergebnis <> 0 herauskommt, kannst Du das Fensterhandle mit dem Deines Fensters vergleichen.

[edit] Der Code ist allerdings schon etwas älter, statt der TList kannst Du auch eine generische Variante benutzen. [/edit]

Delphi.Narium 27. Mai 2021 12:15

AW: Ist Parentform von Frame ein Modales Form?
 
Ich frag' jetzt mal, ohne wirklich Ahnung zu haben:

Du willst doch wissen, ob das Parentform modal ist, fragst aber, ob der Owner modal ist. Parent ist nicht zwingend gleich Owner.

Was passiert, wenn Du Owner durch Parent ersetzt?

Delphi-Quellcode:
isModal := (fsModal in TForm(Parent).FormState);
Klar, ggfls. muss vorher prüfen werden, ob Parent was zugewiesen wurde und wenn ja, ob das ein TForm ist.

BerndS 27. Mai 2021 12:43

AW: Ist Parentform von Frame ein Modales Form?
 
Man könnte auch OnShow oder OnActivate vom Form auf den Frame umleiten. Das wird erst aufgerufen, nachdem
Delphi-Quellcode:
    Include(FFormState, fsModal);
aufgerufen wird.

Delbor 27. Mai 2021 13:00

AW: Ist Parentform von Frame ein Modales Form?
 
Hi Bernau
Zitat:

Ich habe ein Frame, auf dem einige Buttons sind. Dieses ist entweder auf einem Modalen "oder" einem Nicht-Modalen Form plaziert. Das Frame erzeuge ich im OnCreate des Forms.
Was du da erzeugst, ist bestimmt die Frameinstanz, nicht den Frame selbst - der wird vor der ersten Form (in der Regel die Mainform) erstellt. Zu dem Zeitpunkt, wenn du nun die Form erzeugst, kannst du auf die Frameinstanz zugreifen, zB. in OnShow, und hier kannst du entscheiden, ob der Button sichtbar sein soll oder nicht.

Gruss
Delbor

bernau 27. Mai 2021 13:32

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1490252)
Ich frag' jetzt mal, ohne wirklich Ahnung zu haben:

Du willst doch wissen, ob das Parentform modal ist, fragst aber, ob der Owner modal ist. Parent ist nicht zwingend gleich Owner.

Was passiert, wenn Du Owner durch Parent ersetzt?

Delphi-Quellcode:
isModal := (fsModal in TForm(Parent).FormState);
Klar, ggfls. muss vorher prüfen werden, ob Parent was zugewiesen wurde und wenn ja, ob das ein TForm ist.

Das Frame wird im OnCreate des Forms erzeugt.

Delphi-Quellcode:
myFrame := TMyFrame.Create(self);
myFrame.parent := self;
Wie du siehst, wird Parent erst im nächsten Befehl zugewiesen. Daher ist Parent im Create des Frames nil. Owner ist aber bekannt. Deshalb verwende ich owner.

Es ist ja auch nicht das Problem, an die Form zu kommen, auf dem das Frame sitzt. Die Form hat zu dem Zeitpunkt einfach noch nicht den Modal-Status. Das war mein Problem.

bernau 27. Mai 2021 13:43

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von Delbor (Beitrag 1490254)
Was du da erzeugst, ist bestimmt die Frameinstanz, nicht den Frame selbst - der wird vor der ersten Form (in der Regel die Mainform) erstellt. Zu dem Zeitpunkt, wenn du nun die Form erzeugst, kannst du auf die Frameinstanz zugreifen, zB. in OnShow, und hier kannst du entscheiden, ob der Button sichtbar sein soll oder nicht.

Es ist kein Problen, von der Form auf die Buttons des Frame zuzugreifen und dort Visible=False zu setzen. Diesen Code will ich mir aber sparen. Das Frame wird vielen verschiedenen Forms verwendet. Wenn ich das Ausblenden des Buttons im Frame einmal automatisiere, dann brauche ich das nicht in den vielen Forms, in dem das Frame erzeugt wird, zu machen.

bernau 27. Mai 2021 13:49

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von Delbor (Beitrag 1490254)
Was du da erzeugst, ist bestimmt die Frameinstanz, nicht den Frame selbst - der wird vor der ersten Form (in der Regel die Mainform) erstellt. Zu dem Zeitpunkt, wenn du nun die Form erzeugst, kannst du auf die Frameinstanz zugreifen,

Oh... Jetzt erst deinen Satz verstanden 8-)

Warum sollte ich ein Frame erzeugen, wenn es noch nicht gebraucht wird? Das Frame wird erzeugt, wenn das Form erzeugt wird, in dem es benötigt wird.

Aber das ist auch nicht das Problem :wink:

bernau 27. Mai 2021 13:53

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von BerndS (Beitrag 1490253)
Man könnte auch OnShow oder OnActivate vom Form auf den Frame umleiten. Das wird erst aufgerufen, nachdem
Delphi-Quellcode:
    Include(FFormState, fsModal);
aufgerufen wird.

Das müsste ich aber im Code des Forms machen. Das will ich vermeiden, da es viele Forms gibt, die das Frame verwenden. Den Code will ich einmal im Frame haben. In den Forms soll einfach nur das Frame erzeugt werden. Keine zusätzlichen Zeilen. Ich möchte Code sparen und Fehler vermeiden.

BerndS 27. Mai 2021 13:55

AW: Ist Parentform von Frame ein Modales Form?
 
Dann könnte der Frame doch im Create beim Form das OnShow Event setzen und bei Bedarf auch sichern und dann hier im Event die Prüfung machen und OnShow wiederherstellen und aufrufen, falls gesetzt.

BerndS 27. Mai 2021 14:05

AW: Ist Parentform von Frame ein Modales Form?
 
Eine weitere Möglichkeit wäre dem Frame im Create csActionClient im ControlStyle hinzuzufügen und Frame.InitiateAction zu überschreiben und hier die Prüfung zu machen und danach csActionClient zu entfernen.

bernau 27. Mai 2021 14:06

AW: Ist Parentform von Frame ein Modales Form?
 
Vielleicht habe ich meine Frage etwas zu kompliziert gestellt. Ich versuche es noch mal.

Bisher ist es so (Alles vereinfacht dargestellt):

Delphi-Quellcode:
// Beispiel für EINE Form

procedure TMyForm.FormCreate(Sender: TObject);
begin
  myFrame := TMyFrame.create(PanelXYZ);
  myFrame.parent := PanelXYZ;
  // Der Frame-Button darf nicht verfügbar sein, wenn das Form ein Dialog ist
  // Folgender Code kommt also hinzu, wenn das Form ein Dialog ist.
  // Folgender Code ist "nicht" bei "normalen" Forms vorhanden
  myFrame.BoeserDialogButton.visible := False;
end;
Ich möchte
Delphi-Quellcode:
myFrame.BoeserDialogButton.visible := False;
einfach in das Frame verlagern, damit ich beim nächsten Form, in dem ich das Frame verwende, nicht mehr daran denken muss. Einmal geschrieben. Fertig.

Wenn ich anderen Code im Form einfügen muss um diese Zeile zu sparen, bringt mir das nichts. Dann lasse ich es so wie es ist.

BerndS 27. Mai 2021 14:21

AW: Ist Parentform von Frame ein Modales Form?
 
Meine beiden letzen Anworten haben das doch berücksichtigt, wobei beim 2. Vorschlag beim Form nicht mal einen Event umgeleitet werden müsste.

Uwe Raabe 27. Mai 2021 14:24

AW: Ist Parentform von Frame ein Modales Form?
 
Beim FormCreate kann man aber noch gar nicht wissen, ob das Form später mit Show oder ShowModal aufgerufen wird. Insbesondere ist es durchaus möglich, ein und dieselbe Form-Instanz z.B. einmal mit ShowModal und einmal mit Show aufzurufen (und noch mehrmals und auch umgekehrt). Wohlgemerkt, dieselbe Instanz! Folglich kann das im FormCreate gar nicht ausgewertet werden, weil es erst später durch deinen Code bestimmt wird. Du kannst allenfalls im FormShow darauf reagieren.

Insofern geht die Anwort in #4 schon in die richtige Richtung.

bernau 27. Mai 2021 15:22

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1490269)
Beim FormCreate kann man aber noch gar nicht wissen, ob das Form später mit Show oder ShowModal aufgerufen wird. Insbesondere ist es durchaus möglich, ein und dieselbe Form-Instanz z.B. einmal mit ShowModal und einmal mit Show aufzurufen (und noch mehrmals und auch umgekehrt). Wohlgemerkt, dieselbe Instanz! Folglich kann das im FormCreate gar nicht ausgewertet werden, weil es erst später durch deinen Code bestimmt wird. Du kannst allenfalls im FormShow darauf reagieren.

Insofern geht die Anwort in #4 schon in die richtige Richtung.

Ja. Stimmt. Zum Create-Zeitpunkt kann man nicht feststellen, ob das Form Modal ist oder nicht. Deshalb auch die Frage, wie man das anderweitig lösen kann. Allerdings ohne zusätzlichen Code (OnShow) im "Form".

Bei #4 hatte es nicht sofort bei mir klick gemacht. Ich werde damit mal etwas ausprobieren. Danke euch allen für die Hinweise.

Uwe Raabe 27. Mai 2021 16:20

AW: Ist Parentform von Frame ein Modales Form?
 
Du kannst in dem Frame die Messages CM_PARENTVISIBLECHANGED oder CM_SHOWINGCHANGED abfangen und dort das fsModal abfragen:
Delphi-Quellcode:
  TMyFrame = class(TFrame)
  private
    procedure CMPARENTVISIBLECHANGED(var Message: TMessage); message CM_PARENTVISIBLECHANGED;
// oder
    procedure CMShowingChanged(var Message: TMessage); message CM_SHOWINGCHANGED;
//  ...

procedure TMyFrame.CMPARENTVISIBLECHANGED(var Message: TMessage);
var
  isModal: Boolean;
begin
  inherited;
  isModal := (fsModal in GetParentForm(Self).FormState); // funktioniert auch wenn der Frame nicht direkt im Form sitzt sondern z.B. auf einem TPanel oder TPageControl
//  ...
end;

bernau 27. Mai 2021 18:22

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1490278)
Du kannst in dem Frame die Messages CM_PARENTVISIBLECHANGED oder CM_SHOWINGCHANGED abfangen und dort das fsModal abfragen:

CM_SHOWINGCHANGED > Ja perfekt. Genau das habe ich gesucht.

Und "GetParentForm" kannte ich auch noch nicht. Hatte mir zwar eine Funktion geschrieben, die sich bis zum Parentform hochhangelt, aber so ist es viel eleganter.


Danke dir.

himitsu 27. Mai 2021 18:30

AW: Ist Parentform von Frame ein Modales Form?
 
Vorallem bei eingebetteten Forms (MDI und Co.) solltst du dir aber den weiteren optionalen Parameter genauer ansehn und vielleicht ändern. :wink:

bernau 27. Mai 2021 18:37

AW: Ist Parentform von Frame ein Modales Form?
 
Zitat:

Zitat von himitsu (Beitrag 1490284)
Vorallem bei eingebetteten Forms (MDI und Co.) solltst du dir aber den weiteren optionalen Parameter genauer ansehn und vielleicht ändern. :wink:

Welcher optionale Parameter?:?:

Uwe Raabe 27. Mai 2021 18:42

AW: Ist Parentform von Frame ein Modales Form?
 
Delphi-Quellcode:
function GetParentForm(Control: TControl; TopForm: Boolean = True): TCustomForm;
...
Bei MDI-Forms sind ja die MDIChilds im MDIForm eingebettet. Mit TopForm = True bekommst du dann das MDIForm, bei False das entsprechende MDIChild.

bernau 27. Mai 2021 18:46

AW: Ist Parentform von Frame ein Modales Form?
 
Ah. Danke euch beiden!:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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