Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Wie ShowModal Form aus dem HauptForm schließen? (https://www.delphipraxis.net/185219-wie-showmodal-form-aus-dem-hauptform-schliessen.html)

AlexII 22. Mai 2015 18:29

Wie ShowModal Form aus dem HauptForm schließen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich versuche wie folgt ein modales Fenster zu schließen:

Delphi-Quellcode:
procedure TMainForm.SetAppOnline();
begin
  OfflineForm.Visible := False;
  //oder
  OfflineForm.ModalResult := mrCancel;
  //oder
  OfflineForm.ModalResult := mrOK;
end;
bekomme aber immer diese Fehlermeldung, siehe Anhang. Wie bekomme ich das modale Fenster aus dem Hauptfenster zu?

Danke!

himitsu 22. Mai 2015 19:08

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Wo kommt der Fehler, bei allem zusammen, oder wirklich nur bei einem der Oder?

Delphi-Quellcode:
OfflineForm.ModalResult := irgendwas_ungleich_mrNone;
oder
Delphi-Quellcode:
OfflineForm.Close;
sind die offiziellen Wege, eine modale Form zu schließen. (Close setzt intern auch nur das ModalResult auf mrAbort oder vermutlich eher auf mrCancel ... weiß grade nicht genau was)


* Du hast die QuellCodes der FCL rumliegen
* Du hast den Fehlertext
* Du könntest eventuell auf die Idee kommen und da drin z.B. nach dem Fehlertext (oder Teilen davon) zu suchen, nachzuschauen warum Dieses angezeigt wird und schon weißt du auch das Warum.
(oder Pause drücken und hoffen man erkennt im Stacktrace wo der Aufruf her kommt und so dort hinzufinden, bzw. man debuggt sich vor dem Knall zu der Stelle)

PS: Auch Lazarus wird bestimmt Strg+C kennen, mit dem man Dialoge als "Text" kopieren kann. (meist hört man ein liebevolles Beep, als Bestätigung)

Perlsau 22. Mai 2015 19:10

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Also mal ganz von vorne:

Ein Form ruft man deshalb modal auf, um zu verhindern, daß der Anwender in der aufrufenden Form herumwerkelt, so lange die modale Form sichtbar ist. In der modalen Form hat der Anwender nun das eine oder andere zu erledigen. Je nachdem, was der Anwender dort macht, wird Modalresult gesetzt, und zwar innerhalb der modalen Form – was anderes geht ja gar nicht, denn der Anwender kann zu diesem Zeitpunkt ausschließlich in der modalen Form was machen, auf die Mainform hat er keinen Zugruff, das ist die Bedeutung von Modal. So weit, so gut.

Wenn du nun die modale Form ohne Zuweisung von Modalresult via Close schließt, erhält Modalresult immer den Wert mrNone. Die Zuweisung eines anderen Wertes – noch immer ist die modale Form sichtbar! – schließt die modal angezeigte Form; der Programmzeiger kehrt zum nächsten Befehl in der Mainform (bzw. der aufrufenden Form) zurück und führt diesen aus. Jetzt ist die "modale" Form nicht mehr geöffnet, es gibt also gar keine modale Form mehr ... wir erinnern uns: modal heißt, daß die aufrufende Form gesperrt ist, und natürlich alle anderen Formulare deiner Anwendung ebenso, sollten sie sichtbar sein.

Nun versuchst du von deiner Mainform aus Modalresult zu setzen. Das macht keinen Sinn. Modalresult als Rückgabewert (result) der modal aufgerufenen Form wird immer in letztgenannter gesetzt. Immer! Du kannst doch gar nicht von der Mainform aus das modale Fenster schließen, denn der Programmzeiger befindet sich in der modal angezeigten Form, so lange diese nicht geschlossen wird, und kehrt erst wieder zur Mainform zurück, nachdem die modal angezeigte Form geschlossen wurde.

Zum Schließen der modalen Form setzt du dort z.B. einen Button, der Modalresult auf mrOK setzt:
Delphi-Quellcode:
Procedure TMyModalForm.BtnOkayClick(Sender : TObject);
Begin
  ModalResult := mrOK;
End;
Oder du klickst auf einen Abbrechen-Button:
Delphi-Quellcode:
Procedure TMyModalForm.BtnCancelClick(Sender : TObject);
Begin
  ModalResult := mrCancel;
End;
Oder du klickst auf einen Schließen-Button:
Delphi-Quellcode:
Procedure TMyModalForm.BtnCloseClick(Sender : TObject);
Begin
  Close;
End;
Zitat:

Zitat von AlexII (Beitrag 1302634)
ich versuche wie folgt ein modales Fenster zu schließen:

Delphi-Quellcode:
procedure TMainForm.SetAppOnline();
begin
  OfflineForm.Visible := False;
  //oder
  OfflineForm.ModalResult := mrCancel;
  //oder
  OfflineForm.ModalResult := mrOK;
end;
bekomme aber immer diese Fehlermeldung, siehe Anhang. Wie bekomme ich das modale Fenster aus dem Hauptfenster zu?

Diese Fehlermeldung bekommst du, weil OfflineForm nicht visible ist. Du kannst Modalresult nicht von einer anderen Form aus setzen, sondern immer nur in der modal angezeigten Form selber. Das ist doch logisch, denn ModalResult dient dazu, die modale Form mit einem bestimmten Rückgabewert zu schließen. Jede Zuweisung an ModalResult (außer mrNone) schließt die modal angezeigte Form. Sonst würde ja auch die Zuweisung von Modalresult keinen Sinn machen.

Ich hoffe, daß es jetzt klar ist, ansonsten muß ich hier leider passen, mir geht die Geduld etwas flöten, weil ich schon seit 4 Uhr auf den Beinen (bzw. auf dem Hintern) bin :?

Zitat:

Zitat von himitsu (Beitrag 1302639)
Wo kommt der Fehler, bei allem zusammen, oder wirklich nur bei einem der Oder?
Delphi-Quellcode:
OfflineForm.ModalResult := irgendwas_ungleich_mrNone;
oder
Delphi-Quellcode:
OfflineForm.Close;
sind die offiziellen Wege, eine modale Form zu schließen. (Close setzt intern auch nur das ModalResult auf mrAbort oder vermutlich eher auf mrCancel ... weiß grade nicht genau was)

AlexII versucht, im Formular OfflineForm das Property ModalResult von der Mainform aus zu setzen. Zu diesem Zeitpunkt kann OfflineForm aber gar nicht modal sichtbar sein. Wäre OfflineForm modal geöffnet, würde der Programmzeiger niemals an diese Stelle kommen, um ModalResult von der Mainform aus zu setzen. Man bekommt ein modales Fenster nicht "von der Hauptform zu". Der Programmzeiger kann gar nicht in den Code der Hauptform zurückkehren, so lange das modale Fenster angezeigt wird. Modal heißt doch nicht, okay, dann wechsle ich jetzt schnell mal wieder in die Hauptform und mach das dann von dort aus zu. Das auch nur anzudenken ist Unsinn hoch 3.

Die Fehlermeldung ist offensichtlich irreführend, denn sie sagt aus, das Fenster sei bereits modal geöffnet.

himitsu 22. Mai 2015 19:20

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Der erste Teil der Fehlermeldung klang so, als wenn die Form sichtbar ist.
Genauso, wie wenn man ShowModal aufruft, während die Form sichtbar ist.


Wie will die LCL erkennen, ob jemand "Fremdes" das ModalResult setzt?

Solange man das nicht bösartig in einem anderem Thread macht (was man niemals machen sollte), kann das doch auch eine Methode sein, welche über die modale Form ausgelöst wurde. :gruebel:
Oder hat die LCL zwei der Property? Eein Internes und ein Öffentliches. :shock:

AlexII 22. Mai 2015 19:20

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Alle oben genannten Versuche führen zu dem Fehler, OfflineForm.Close; auch.

Popov 22. Mai 2015 19:27

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
@AlexII

Perlsau hat es schon angesprochen und auch ich frage mich seit einigen Threads, ob du dir des Sinns des ShowModal Fensters sicher bist. In der Regel ruft man ein Fenster ShowModal auf, um in des Fenster zu wechseln. Bin ich also in Form1 und rufe daraus das Fenster Form2 modal auf, will ich nun mit meiner Arbeit in des Form2 Fenster wechseln. Rufe ich es auf, will ich, dass der Anwender nun in Form2 arbeitet, aber nicht in Form1. Will ich nur ein zweites Fenster parallel zum ersten Fenster, rufe ich es normal auf. Will ich, dass Form2 über Form1 ist, stelle ich es StayOnTop. Nur welchen Sinn macht es ein Fenster ShowModal aufzurufen um weiter im alten Fenster zu arbeiten?

Habe ich Form1 und Form2 und will ich Form2 zusätzlich auf dem Fenster haben, rufe ich es mit Show auf. Will ich, dass Form2 Top ist, stelle ich es so ein.

Habe ich Form1 und Form2 und will mit der Arbeit in Form2 wechseln, rufe ich es mit ShowModal auf. Will ich, dass Form2 Top ist, stelle ich es so ein.

Dialogfenster für Öffnen, Speichern, Font, Farbe, usw. sind ShowModal. Rufe ich sie auf, will ich ein Ergebnis haben. Ich rufe das Speichern Dialogfenster nicht auf um noch weiter im Hauptfenster zu arbeiten.

Sir Rufo 22. Mai 2015 19:28

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Natürlich kann man eine modale Form auch von ausserhalb schliessen, dazu benötigt man aber z.B. einen Timer.

Die Fehlermeldung sagt aber aus, dass schon der Aufruf von
Delphi-Quellcode:
OfflineForm.ShowModal
fehlschlägt und somit dieser bisher gezeigte Code für den Fehler nicht aber auch absolut gar nicht verantwortlich ist.

Dalai 22. Mai 2015 19:29

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Ich bin mir nicht sicher, ob du verstehst, was ein modales Fenster ist, und wie Perlsau es erklärt hat. Versuchen wir es mal mit einem (zum Teil sinnfreien) Beispiel:
Delphi-Quellcode:
function TForm1.PluginShowForm(const AhParent: HWND): Boolean;
var fmStartupProperties: TfmStartupProperties;
begin
    fmStartupProperties:= TfmStartupProperties.Create(nil, AhParent);
    try
      fmStartupProperties.ShowModal;
      ShowMessage('blub');
    finally
      fmStartupProperties.Free;
    end;
end;
Wann taucht deiner Meinung nach die Meldung 'blub' auf? Wenn du das ggf. mal ausprobierst, wird dir vielleicht klar, wie der Programmablauf ist und warum eine Zuweisung an ModalResult in diesem Kontext - im Code oben innerhalb der Klasse TForm1 - keinerlei Sinn hat, innerhalb der Klasse TfmStartupProperties (=blockierendes Kindfenster von TForm1) hingegen schon.

MfG Dalai

Perlsau 22. Mai 2015 19:36

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Dalai (Beitrag 1302648)
Ich bin mir nicht sicher, ob du verstehst, was ein modales Fenster ist, und wie Perlsau es erklärt hat.

Ich glaube fast, er hat das gar nicht gelesen ... da gibt man sich mal so richtig Mühe und versucht das ordentlich zu erklären ... :-D

Egal, ich guck jetzt meinen Film weiter, das ist entspannender :lol:

Zitat:

Zitat von Sir Rufo (Beitrag 1302647)
Natürlich kann man eine modale Form auch von ausserhalb schliessen, dazu benötigt man aber z.B. einen Timer.

Aber wozu soll das gut sein? Vielleicht: "Wenn du, Anwender, jetzt nicht innerhalb von 10 Sekunden einen Button drückst, dann nehm ich dir den Dialog wieder weg und du kannst gucken, wo du bleibst!"

Zitat:

Zitat von Sir Rufo (Beitrag 1302647)
Die Fehlermeldung sagt aber aus, dass schon der Aufruf von
Delphi-Quellcode:
OfflineForm.ShowModal
fehlschlägt und somit dieser bisher gezeigte Code für den Fehler nicht aber auch absolut gar nicht verantwortlich ist.

Er ruft doch gar nicht ShowModal auf, sondern versucht, ModalResult on OfflineForm von der MainForm aus aufzurufen. Also wenn ich jetzt auf die mainform einen Button setze und dort den Code von AlexII reinkopiere, das Programm starte und diesen Button klicke, passiert da in allen drei Fällen absolut gar nix.
Delphi-Quellcode:
procedure TFormMain.Button1Click(Sender: TObject);
begin
  //OfflineForm.Visible := False;
  //OfflineForm.ModalResult := mrCancel;
  OfflineForm.ModalResult := mrOK;
end;
Ist OfflineForm modal sichtbar, komme ich an diesen Button auf dem Mainform ja gar nicht ran. Ein OnIdle hab ich nicht gefunden, und einen Timer laufen zu lassen, ist mir jetzt zu viel Streß.

himitsu 22. Mai 2015 19:37

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
OfflineForm wird auch wirklich modal angezeigt?

Um das zu prüfen, was die Perlsau meint:
Eine Methode in die Form, da drin Close aufrufen und dann rufst du diese Methode auf.


Ich bin was essen, hab keine Lust mir die LCL runterzuladen und das zu machen, was der TE auch selber machen kann.
> nachsehen, warum es diese Meldung gibt (da findet man garantiert ein paar IFs und die sagen Einem, was sie nicht mögen)

Sir Rufo 22. Mai 2015 19:44

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Nur um mal mit dieser Mär mit den modalen Forms, die sich angeblich nicht von aussen schliessen lassen, aufzuräumen habe ich hier ein Beispiel-Code
Delphi-Quellcode:
unit Form.Main;

interface

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

  Form.Dialog;

type
  TMainForm = class( TForm )
    Button1: TButton;
    Timer1: TTimer; { Enabled = False, Interval = 5000 }
    procedure Timer1Timer( Sender: TObject );
    procedure Button1Click( Sender: TObject );
  private
    FDialogForm: TDialogForm;
  public
    { Public-Deklarationen }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.Button1Click( Sender: TObject );
begin
  FDialogForm := TDialogForm.Create( nil );
  try
    Timer1.Enabled := True;
    FDialogForm.ShowModal;
    Timer1.Enabled := False;
  finally
    FreeAndNil( FDialogForm );
  end;
end;

procedure TMainForm.Timer1Timer( Sender: TObject );
begin
  if Assigned( FDialogForm ) then
    FDialogForm.Close;
end;

end.
Die DialogForm ist ein simple Form.

Sir Rufo 22. Mai 2015 19:58

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Aber wir driften vom Thema ab, denn die Fehlermeldung kommt nicht vom Versuch die Form zu schliessen, sondern vom Versuch die modal anzuzeigen.

Die Fehlermeldung ist doch sehr eindeutig:
Zitat:

Delphi-Quellcode:
TCustomForm.ShowModal
for
Delphi-Quellcode:
OfflineForm:TOfflineForm
impossible, because already visible (hint for designer forms: set
Delphi-Quellcode:
Visible
property to
Delphi-Quellcode:
false
) already modal.)
und da gibt es auch noch einen Tip, was man kontrollieren, bzw. gewährleisten sollte (Im OI
Delphi-Quellcode:
OfflineForm.Visible = False
setzen)

Dalai 22. Mai 2015 20:00

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1302657)
Nur um mal mit dieser Mär mit den modalen Forms, die sich angeblich nicht von aussen schliessen lassen, aufzuräumen habe ich hier ein Beispiel-Code

Ich glaube, es bezweifelt niemand, dass es geht, wenn man nur ein bisschen (mehr) Aufwand treibt. Aber ich denke auch, dass das dem Sinn einer modalen Form zuwiderläuft.

Aber wie himitsu schon im anderen Thread schrieb: Hier kann man nur mutmaßen, weil zu wenige Infos vorhanden sind, und der Code keine wirkliche Aussagekraft hat.

MfG Dalai

Sir Rufo 22. Mai 2015 20:05

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Die Mär besagte, dass es gar nie niemals nicht geht. Das galt es zu widerlegen.

Nein, warum sollte es dem Sinn einer modalen Form zuwiderlaufen? Die modale Form hindert den Benutzer daran, das modale Formular zu verlassen ... und mein Beispiel ändert an dieser Tatsache nicht das geringste.

Und den Code den wir hier sehen, der löst die Fehlermeldung nicht aus.

himitsu 22. Mai 2015 20:08

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1302666)
Und den Code den wir hier sehen, der löst die Fehlermeldung nicht aus.

Darum auch.
Zitat:

Zitat von himitsu (Beitrag 1302656)
...
Aber solange hier in zwei Threads nur zusammenhanglose Stückchen gezeigt werden und alles Wichtige fehlt, hat es eh keinen Sinn eine Lösung finden zu wollen.
Meine Galskugel ist grade in der Reinigung.


AlexII 22. Mai 2015 20:12

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Perlsau (Beitrag 1302653)
Zitat:

Zitat von Dalai (Beitrag 1302648)
Ich bin mir nicht sicher, ob du verstehst, was ein modales Fenster ist, und wie Perlsau es erklärt hat.

Ich glaube fast, er hat das gar nicht gelesen ... da gibt man sich mal so richtig Mühe und versucht das ordentlich zu erklären ... :-D

Ne, ich hatte es noch nicht gelesen... aber danke, ist besser erklärt als in der Hilfe! :thumb:

Perlsau 22. Mai 2015 20:16

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1302663)
Aber wir driften vom Thema ab, denn die Fehlermeldung kommt nicht vom Versuch die Form zu schliessen, sondern vom Versuch die modal anzuzeigen.

Die Fehlermeldung ist doch sehr eindeutig:
Zitat:

Delphi-Quellcode:
TCustomForm.ShowModal
for
Delphi-Quellcode:
OfflineForm:TOfflineForm
impossible, because already visible (hint for designer forms: set
Delphi-Quellcode:
Visible
property to
Delphi-Quellcode:
false
) already modal.)
und da gibt es auch noch einen Tip, was man kontrollieren, bzw. gewährleisten sollte (Im OI
Delphi-Quellcode:
OfflineForm.Visible = False
setzen)

Das paßt aber nicht damit zusammen, was AlexII im Eingangsposting meint:

Zitat:

Zitat von AlexII (Beitrag 1302634)
ich versuche wie folgt ein modales Fenster zu schließen:

Delphi-Quellcode:
procedure TMainForm.SetAppOnline();
begin
  OfflineForm.Visible := False;
  //oder
  OfflineForm.ModalResult := mrCancel;
  //oder
  OfflineForm.ModalResult := mrOK;
end;
bekomme aber immer diese Fehlermeldung, siehe Anhang. Wie bekomme ich das modale Fenster aus dem Hauptfenster zu?

Zitat:

Zitat von Sir Rufo (Beitrag 1302657)
Nur um mal mit dieser Mär mit den modalen Forms, die sich angeblich nicht von aussen schliessen lassen, aufzuräumen habe ich hier ein Beispiel-Code

... das problemlos funktioniert.

Aber wie hier und im Nachbar-Thread bereits eingewendet wurde, macht das nicht wirklich Sinn, denn man ruft eine Form doch genau deshalb modal auf, um eine bestimmte Reaktion des Anwenders quasi zu erzwingen: Wenn er z.B. einen Dateinamen auswählen soll, dann kann er das nicht, wenn der Dialog nach 5 Sekunden wieder geschlossen wird. Die Umstände in Alex' Programm sind ja auch bislang streng geheim 8-)

AlexII 22. Mai 2015 20:22

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Also ich komme mit dem Lesen nicht hinterher, aber im groben habe das Problem verstanden.

Mein Vorhaben ist folgendes, ich habe eine Anwendung = MainForm. Wenn die Anwendung offline geschaltet wird, wird OfflineForm "darüber gelegt". Wird das Programm online geschaltet - schließe ich das OfflineForm. Eigentlich ganz einfach. Nur das Schließen des OfflineForms will vom MainForm nicht klappen. Aber ich denke, ich löse das jetzt, Ihr habt mir genug wissen gegeben. Es sei denn jemand weiß besser wie ich mein Vorhaben umsetze.

DeddyH 22. Mai 2015 20:26

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Wäre es da nicht einfacher, wenn das modale Formular den Status prüft und sich selbst schließt?

Sir Rufo 22. Mai 2015 20:28

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
@AlexII

Zeig uns mehr Code und wir können dir helfen

AlexII 22. Mai 2015 20:28

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von DeddyH (Beitrag 1302672)
Wäre es da nicht einfacher, wenn das modale Formular den Status prüft und sich selbst schließt?

Aber ich muss doch den Status von dem MainForm veranlassen, oder? Hm...

AlexII 22. Mai 2015 20:31

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1302673)
@AlexII

Zeig uns mehr Code und wir können dir helfen

Das sind nur ein Paar Zeilen weit verstreut.

Aber ich habe es schon verstanden... es wird gleich laufen wie geschmiert! :thumb:

EWeiss 22. Mai 2015 20:40

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Ich kenne das aus anderen Sprachen da wird das mit modalen Forms anders gelöst.
Wird eine Form Modal aufgerufen ist eine Eingabe in der Hauptform nicht mehr möglich.
Sollte zumindest so sein.
Welchen zweck sonst verfolgt eine Modale Form .. nur diesen das wie schon gesagt eingaben
in der Hauptform verwehrt werden und nur in dieser Modalen Form eingaben möglich sind
so lange bis diese geschlossen wird.

Möchtest du das nicht dann erstelle keine Modale Form.
Die Frage wäre also welchen zweck verfolgst du damit das du eine Modale Form erstellst(aufrufst)

gruss

Sir Rufo 22. Mai 2015 20:46

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
@Perlsau

Ich behaupte mal dass AlexII hier einfach die falschen Schlüsse zieht und nur denkt, dass diese von ihm gezeigten Codezeilen für die Fehlermeldung verantwortlich sind.

Die Fehlermeldung bezieht sich aber ganz eindeutig auf ShowModal und davon ist in dem hier gezeigten Code nichts zu sehen, ergo sind die nicht verantwortlich.

Und eine modale Form ist nicht auf eine Auswahl von was auch immer beschränkt. Bei einem Datei-Auswahl-Dialog macht es allerdings zu 99,9999% keinen Sinn diesen nach einer gewissen Zeit automatisch zu schliessen. Es gibt aber eben mehr als nur das ;)

Perlsau 22. Mai 2015 20:49

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
@AlexII:

Also egal, was bei dir jetzt Online oder Offline bedeutet: Ich gehe mal davon aus, daß es sich um Ereignisse handelt, für die du Ereignisbehandlungen schreibst:
Delphi-Quellcode:
Procedure Mainform.Offline(Sender: TObject);
Begin
  Self.Enabled := False;
End;

Procedure Mainform.Online(Sender: TObject);
Begin
  Self.Enabled := True;
End;
Mit Enabled := False erreichst du, daß das Hauptfenster nicht mehr auf Benutzeraktionen reagieren kann. Auch ein Haupt- oder Objektmenü ist davon betroffen. Willst du dazu noch alles verdecken, genügt ein Frame, den du auf die Hauptform mit Align := alClient legst. Damit hast du dir das ganze Modalzeugs erspart.

@Sir Rufo:
d'accord

EWeiss 22. Mai 2015 20:58

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Mit Enabled := False erreichst du, daß das Hauptfenster nicht mehr auf Benutzeraktionen reagieren kann.
Soll der Anwender dann die Anwendung im Taskmanager beenden?
Oder wie stellst du dir das vor.

Mit dem Frame hingegen stellt das kein Problem dar..
So kann man wenigstens die Anwendung selbst noch schließen wenn man genug vom Offline Modus hat.

gruss

Perlsau 22. Mai 2015 21:04

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Guter Einwand :thumb:

Bei der Lösung mit dem modalen Fenster hat er aber dasselbe Problem, so lange er auf der modale Form keine Schaltflächen anbietet, um selbige zu schließen. Und bei einem Frame, der via Align := alCLient auf der Form liegt, sind die Menüs, so vorhanden, weiterhin bedienbar, außer er schaltet sie ebenfals auf Enabled := False.

AlexII 22. Mai 2015 21:05

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Was ist der Unterschied zwischen Frame und nem Form, das nicht modal aufgerufen wird?

AlexII 22. Mai 2015 21:10

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1302680)
@Perlsau

Ich behaupte mal dass AlexII hier einfach die falschen Schlüsse zieht und nur denkt, dass diese von ihm gezeigten Codezeilen für die Fehlermeldung verantwortlich sind.

Die Fehlermeldung bezieht sich aber ganz eindeutig auf ShowModal und davon ist in dem hier gezeigten Code nichts zu sehen, ergo sind die nicht verantwortlich.

Und eine modale Form ist nicht auf eine Auswahl von was auch immer beschränkt. Bei einem Datei-Auswahl-Dialog macht es allerdings zu 99,9999% keinen Sinn diesen nach einer gewissen Zeit automatisch zu schliessen. Es gibt aber eben mehr als nur das ;)

Aber wie kann ein ShowModal diesen Fehler verursachen? Das OfflineForm wird doch super angezeigt. Nur beim Schließen vom HautpForm heraus knallt es. :gruebel:

EWeiss 22. Mai 2015 21:12

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Zitat von AlexII (Beitrag 1302685)
Was ist der Unterschied zwischen Frame und nem Form, das nicht modal aufgerufen wird?

Perlsau sagte es doch schon..
Es verdeckt deine Controls Button usw.. so das keine Eingaben in der Hauptform selbst mehr möglich sind.
Ausgenommen vom Menu natürlich.
Da hat er aber auch schon einiges zu gesagt.

gruss

Popov 22. Mai 2015 21:16

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
@AlexII

Was du da machst ist vermutlich "falsch" (in Anführungszeichen). Das ShowModal Fenster hat eigentlich einen Sinn. So wie es aussieht nutzt du es aber für die Sperrung eines Fensters. Das kann man aber auch anders lösen.

Hier mal etwas aus meinem alten Beispiele-Ordner.


Form1:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  ModalResult: ShortInt;
begin
  ModalResult := ModalForm.ShowModal;

  case ModalResult of
    mrOk      : ShowMessage('Das Modalfenster hat mrOk als Ergebnis.');
    mrCancel  : ShowMessage('Das Modalfenster hat mrCancel als Ergebnis.');
    mrAbort   : ShowMessage('Das Modalfenster hat mrAbort als Ergebnis.');
    mrRetry   : ShowMessage('Das Modalfenster hat mrRetry als Ergebnis.');
    mrIgnore  : ShowMessage('Das Modalfenster hat mrIgnore als Ergebnis.');
    mrYes     : ShowMessage('Das Modalfenster hat mrYes als Ergebnis.');
    mrNo      : ShowMessage('Das Modalfenster hat mrYes als Ergebnis.');
    mrAll     : ShowMessage('Das Modalfenster hat mrAll als Ergebnis.');
    mrNoToAll : ShowMessage('Das Modalfenster hat mrNoToAll als Ergebnis.');
    mrYesToAll : ShowMessage('Das Modalfenster hat mrYesToAll als Ergebnis.');
  else
    {mrNone} ShowMessage('Das Modalfenster hat mrNone als Ergebnis.');
  end;
end;
Form2
Delphi-Quellcode:
procedure TModalForm.Button1Click(Sender: TObject);
begin
  //ohne Close passiert nichts
end;

procedure TModalForm.Button2Click(Sender: TObject);
begin
  Close; //mit Close wird das Fenster geschlossen. ModalResult = mrCancel
  //Close setzt das Fenster von sich aus automatisch auf mrCancel
end;

procedure TModalForm.Button3Click(Sender: TObject);
begin
  ModalResult := mrOk;
  //Close; //Close ist nicht nötig. ModalResult = mrOk
end;

procedure TModalForm.Button4Click(Sender: TObject);
begin
  ModalResult := mrCancel;
  //Close; //Close ist nicht nötig. ModalResult = mrCancel
end;

procedure TModalForm.Button5Click(Sender: TObject);
begin
  ModalResult := mrNone; //Bringt nichts. mrNone bewirkt kein Schleißen
  Close; //Close ist nötig. ModalResult = mrCancel
end;

procedure TModalForm.Button6Click(Sender: TObject);
begin
  ModalResult := mrYes;
  //Close; //Close ist nicht nötig. ModalResult = mrYes
end;

EWeiss 22. Mai 2015 21:23

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Zitat:

Aber wie kann ein ShowModal diesen Fehler verursachen?
Könnte daran liegen das Die HauptForm mehr oder weniger das Parent bzw. "GW_OWNER" der Modalen Form ist.
Wenn du also versuchst aus der HauptForm das modale Fenster zu schließen zerschießt du quasi das Parent Fenster (Hauptform) selbst.

Zumindest kenne ich das aus VB Zeiten nicht anders.
Code:
Form2.Show vbModal, Me
Ist eine der gründe warum die Eingabe in der Hauptform durch das modale Fenster gesperrt wird.

gruss

Popov 22. Mai 2015 21:25

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Übrigens, wie jede Komponente hat TForm auch die Eigenschaft Enabled. Das kann man auf False setzten, dann reagiert das Fenster aber gar nicht mehr. Eine bessere Möglich wäre aber einfach auf das Formular ein TPanel zu setzten und das False zu stellen. Die Komponenten legst du auf das Panel. Ist Panel nicht Enabled, reagiert keine Komponente drauf.

Perlsau 22. Mai 2015 21:26

AW: Wie ShowModal Form aus dem HauptForm schließen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von AlexII (Beitrag 1302685)
Was ist der Unterschied zwischen Frame und nem Form, das nicht modal aufgerufen wird?

Ein Frame kannst du nur auf einem Form anzeigen. Du erstellst ein Frame (Neu -> Frame), machst dein Zeugs drauf (Buttons. Labels etc.) und nimmst die Unit des Frames in die Uses-Klauses deiner Mainform auf. In selbiger erstellst du eine Variable vom Typ des Frames und erzeugst eine Instanz des Frames (Create), wenn du ihn benötigst oder auch gleich beim Programmstart. Im ersten Fall zerstörst du den Frame, wenn du ihn nicht mehr benötigst (Free), im zweiten Fall in OnDestroy deines Hauptfensters. Aber bevor ich das lang und breit erkläre, ist das schneller programmiert.

Zitat:

Zitat von Popov (Beitrag 1302690)
Übrigens, wie jede Komponente hat TForm auch die Eigenschaft Enabled. Das kann man auf False setzten, dann reagiert das Fenster aber gar nicht mehr. Eine bessere Möglich wäre aber einfach auf das Formular ein TPanel zu setzten und das False zu stellen. Die Komponenten legst du auf das Panel. Ist Panel nicht Enabled, reagiert keine Komponente drauf.

Das ist natürlich die allereinfachste Idee und hat somit alle Aussichten zum Favoriten. :thumb:
Um die Menüs, falls vorhanden, muß er sich dann extra kümmern. Wenn er keine ActionList hat, beschränkt sich das darauf, die Hauptmenü-Einträge zu disablen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:34 Uhr.

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