Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Eingabefenster automatisch anzeigen lassen (https://www.delphipraxis.net/209302-eingabefenster-automatisch-anzeigen-lassen.html)

zeras 19. Nov 2021 16:58

Eingabefenster automatisch anzeigen lassen
 
Ich habe ein Progamm. Dabei soll beim Start nach dem Aufbau des Hauptfensters automatisch ein Eingabefenster angezeigt werden.
Dies zeige ich im FormActivate des Haupfensters mittels

Delphi-Quellcode:
if fEntermanu.ShowModal = mrOK then begin
an. Das scheint aber nicht der richtige Aufruf zu sein, da möglicherweise das Haupfenster nicht fertig wird.
Jedenfalls habe ich komische Phänomene, das etwa bei Anzeige von weiteren globalen Fenstern, das Hauptfenster immer wieder im Vordergrund bleibt oder automatisch wieder aufpoppt.

venice2 19. Nov 2021 17:06

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Das scheint aber nicht der richtige Aufruf zu sein, da möglicherweise das Haupfenster nicht fertig wird.
Dann nimm Form_Show und deaktiviere das Hauptfenster solange bis die Eingabe erledigt ist.
Somit kann es sich nicht in den Vordergrund setzen.

Oder erstelle einen Messageloop innerhalb des Eingabe Fenster löse diesen erst auf nachdem die Eingabe abgeschlossen ist.
In dem fall wäre das Hauptfenster automatisch blockiert!

EDIT:
Beispiel

In Show deiner Eingabe form

Delphi-Quellcode:
var
  Msg: TMsg;

begin

  // Windows Messagen verarbeiten
  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

end;
Wird die form geschlossen sende in Destroy, besser noch vorher in deinem Button Ereignis
Delphi-Quellcode:
PostQuitMessage(0);

zeras 19. Nov 2021 17:17

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Zitat von venice2 (Beitrag 1497873)
Zitat:

Das scheint aber nicht der richtige Aufruf zu sein, da möglicherweise das Haupfenster nicht fertig wird.
Dann nimm Form_Show und deaktiviere das Hauptfenster solange bis die Eingabe erledigt ist.
Somit kann es sich nicht in den Vordergrund setzen.

Oder erstelle einen Messageloop innerhalb des Eingabe Fenster löse diesen erst auf nachdem die Eingabe abgeschlossen ist.
In dem fall wäre das Hauptfenster automatisch blockiert!

Danke für den Hinweis.
Ich habe mich vielleicht nicht genau ausgedrückt.
Das Hauptfenster sollte schon zu sehen sein und wenn das fertig aufgebaut ist, sollte das Eingabefenster aufpoppen. Das scheint ja zu gehen, aber Probleme siehe oben.

venice2 19. Nov 2021 17:18

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Zitat von zeras (Beitrag 1497874)
Zitat:

Zitat von venice2 (Beitrag 1497873)
Zitat:

Das scheint aber nicht der richtige Aufruf zu sein, da möglicherweise das Haupfenster nicht fertig wird.
Dann nimm Form_Show und deaktiviere das Hauptfenster solange bis die Eingabe erledigt ist.
Somit kann es sich nicht in den Vordergrund setzen.

Oder erstelle einen Messageloop innerhalb des Eingabe Fenster löse diesen erst auf nachdem die Eingabe abgeschlossen ist.
In dem fall wäre das Hauptfenster automatisch blockiert!

Danke für den Hinweis.
Ich habe mich vielleicht nicht genau ausgedrückt.
Das Hauptfenster sollte schon zu sehen sein und wenn das fertig aufgebaut ist, sollte das Eingabefenster aufpoppen. Das scheint ja zu gehen, aber Probleme siehe oben.

Lese bitte mein Edit!
Versuche es einfach mal sind nur ein paar Zeilen.

EDIT:
Vor allem sorge dafür das deine Eingabe form nicht automatisch erstellt wird.
Du mußt diese dynamisch über create in FormShow deines Hauptfensters erstellen.
Du mußt dann natürlich die Eingabe Form auch wieder freigeben aber ich denke das sollte dir klar sein.

zeras 19. Nov 2021 17:29

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Zitat von venice2 (Beitrag 1497875)

Lese bitte mein Edit!
Versuche es einfach mal sind nur ein paar Zeilen.

Danke, das werde ich mal probieren.

Zitat:

Zitat von venice2 (Beitrag 1497875)
Vor allem sorge dafür das deine Eingabe form nicht automatisch erstellt wird.
Du mußt diese dynamisch über create in FormShow deines Hauptfensters erstellen.

Nur kurz zum Verständnis. Warum kann das Eingabefenster nicht automatisch erzeugt werden? Im Moment ist es noch so.

venice2 19. Nov 2021 17:33

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Zitat von zeras (Beitrag 1497877)
Zitat:

Zitat von venice2 (Beitrag 1497875)

Lese bitte mein Edit!
Versuche es einfach mal sind nur ein paar Zeilen.

Danke, das werde ich mal probieren.

Zitat:

Zitat von venice2 (Beitrag 1497875)
Vor allem sorge dafür das deine Eingabe form nicht automatisch erstellt wird.
Du mußt diese dynamisch über create in FormShow deines Hauptfensters erstellen.

Nur kurz zum Verständnis. Warum kann das Eingabefenster nicht automatisch erzeugt werden? Im Moment ist es noch so.

Weil du dann keine Kontrolle darüber hast zu welchen Zeitpunkt diese angezeigt werden soll..
Deshalb ist oder kann deine Hauptform nicht vollständig geladen sein da es automatisiert abläuft.
Siehe Shot!

zeras 19. Nov 2021 17:48

AW: Eingabefenster automatisch anzeigen lassen
 
Danke für die Erklärung. Dann habe ich etwas fürs Wochenende zum Testen.

himitsu 20. Nov 2021 03:26

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Weil du dann keine Kontrolle darüber hast zu welchen Zeitpunkt diese angezeigt werden soll..
Doch, hat man.

Visible im FormDesigner: False = nicht sofort anzeigen
das erste Fenster wird immer die MainForm und die wird auch immer sofort sichtbar, egal wie Visible eingestellt war

und anschließend kann man mit Show+Hide oder ShowModal das Fenster anzeigen.


Wenn man das Fenster aus der Liste entfernt, dann kann muß man später dieses Fenster manuell erstellen und es anzeigen (falls nicht schon Visible=True).
Das "Selbsterstellen" ist aber kein Nachteil, da man so das Fenster erst erstellen kann, wenn man es wirklich braucht.

Für ShowModal darf das Fenster (vorher) nicht sichtbar sein (Visible=False).

haentschman 20. Nov 2021 08:02

AW: Eingabefenster automatisch anzeigen lassen
 
Moin...:P
Zitat:

Das Hauptfenster sollte schon zu sehen sein und wenn das fertig aufgebaut ist, sollte das Eingabefenster aufpoppen.
1. OnActivate ist das gaaanz falsche Event. Lies dir mal die Hilfe dazu durch. :wink:
2. OnShow ist fast das richtige Event. :P Das Problem ist, wenn du das Popup Form hier erzeugst ist das Hauptfenster noch nicht sichtbar weil durch den Dialog das OnShow nicht durchlaufen. :zwinker:

Lösung:
Im OnShow eine Message absetzen und eine "AfterShow" procedure erstellen und aufrufen.
Delphi-Quellcode:
const
  MessageAfterShow = WM_USER + 1;
...
private
procedure AfterShow(Sender: TObject);
procedure AfterShowMessage(var Msg: TMessage); message MessageAfterShow;
...
procedure TMyForm.FormShow(Sender: TObject);
begin
  PostMessage(Self.Handle, MessageAfterShow, 0, 0);
end;
...
procedure TMyForm.AfterShowMessage(var Msg: TMessage);
begin
  AfterShow(Self);
end;
...
procedure TMyForm.AfterShow(Sender: TObject);
begin
  Dialog.Execute; // sinngemäß
end;

BerndS 20. Nov 2021 09:39

AW: Eingabefenster automatisch anzeigen lassen
 
Ich öffne das erste Fenster zur Anmeldung über Applikation.OnIdle und setze es dann Applikation.OnIdle auf Nil,bevor der Dialog dann aufgerufen wird.

Delbor 20. Nov 2021 23:45

AW: Eingabefenster automatisch anzeigen lassen
 
Hi zusammen

Ich werfe da mal das Property Popupmode in den Raum...

In der Createprozedure eines Datenmoduls rufe ich folgende Prozedur auf:
Delphi-Quellcode:
function TDMLSQLiteOfficerFE.DedectBiggestFreeSpace: Char;
  var i :integer; PopupWindow: TPopupWindow;
begin
  PopupWindow := TPopupWindow.Create(Self);
  PopupWindow.PopupMode := pmExplicit;
  PopupWindow.PopupParent := HomeOfficerFeMain;
  PopupWindow.RzPageControl1.ActivePage := PopupWindow.RzPageControl1.Pages[0];
  PopUpWindow.Position := poMainFormCenter;
end;
Natürlich könnte das Popupfenster auch automatisch erzeugt werden. Aber dann existiert es auch dann, wenn es gar nicht gebraucht wird.

Gruss
Delbor

venice2 21. Nov 2021 02:26

AW: Eingabefenster automatisch anzeigen lassen
 
ok.. Scheint nicht erwünscht daher spare ich mir die vielen bit und bytes

haentschman 21. Nov 2021 05:58

AW: Eingabefenster automatisch anzeigen lassen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...8-)
Zitat:

Und man kann die 2 Form ganz normal in Create erstellen nachdem das Hauptfenster Sichtbar ist. Warum sollte das nicht gehen?
Klar kannst du die Form im Create oder Show erzeugen. Du kannst die 2. Form aber im OnShow nicht über die Mainform Modal anzeigen! Im OnShow ist die Form zwar Visible=True aber menschlich noch nicht sichtbar. Erst wenn OnShow durchlaufen ist! :zwinker:
Zitat:

Das Hauptfenster sollte schon zu sehen sein und wenn das fertig aufgebaut ist, sollte das Eingabefenster aufpoppen
Zitat:

if fEntermanu.ShowModal = mrOK then begin
...ließ das nochmal...:zwinker:
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,
  Unit2;

type
  TForm1 = class(TForm)
    lblBlubb: TLabel;
    procedure FormShow(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
  Form: TForm;
begin
  Form := Tform2.Create(nil);
  try
    Form.ShowModal; // das ist der Knackpunkt!
  finally
    Form.Free;
  end;
end;

end.
PS:
Zitat:

Ich schicke euch gerne noch die Kompilierte Exe wenn ihr das Projekt nicht zusammenbauen könnt.
...das grenzt an Beleidigung! :roll:

venice2 21. Nov 2021 06:36

AW: Eingabefenster automatisch anzeigen lassen
 
sorry zuviel Aufwand für nichts.

zeras 21. Nov 2021 16:11

AW: Eingabefenster automatisch anzeigen lassen
 
Danke für eure Info.
Ich dachte, es gibt nur eine Lösung. Aber da habe ich mich offenbar getäuscht.
Getestet habe ich erst einmal die Lösunghier.
Damit habe ich mein Problem leider nicht lösen können. Vielleicht liegt das auch an der Komponente, die ich von TMS nutze.
Das eine Problem ist ja, dass sich die Fenster nicht immer die Position merken. Dazu nutzte ich ja FormSize.
Ein weiteres Problem ist, dass teilweise das Hauptfenster wieder aufpoppt, obwohl ein anderes Fenster mit ShowModal angezeigt wurde.
Die Probleme passieren aber nicht immer, sondern sporadisch. Deshalb dachte ich, dass es vielleicht an dem Eingabefenster liegt, wie oben beschrieben.
Das sind zwar nur Schönheitsfehler. Aber die wollte ich irgendwann mal behoben haben.
Vielleicht komme ich nächstes Wochenende dazu, eure anderen Lösungen einmal einzubauen.

himitsu 21. Nov 2021 18:17

AW: Eingabefenster automatisch anzeigen lassen
 
Hmmm, ich dachte OnShow kam erst nach dem Anzeigen, aber es ist doch vorher.
Ist aber auch etwas verwirrend, da dieses Event intern CM_SHOWINGCHANGED heißt.

Und es wird auch nur aufgerufen, wenn der Status über die VCL geändert wird (Visible, Show oder Hide),
aber nicht wenn man es über die WinAPI daran vorbei ändert (ShowWindow mit SW_SHOWNORMAL oder SW_HIDE).




Und statt einem eigenen Event (siehe "MessageAfterShow"), kann man auch ein Anderes verwenden.

Delphi-Quellcode:
procedure TMyForm.FormShow(Sender: TObject);
begin
  TThread.ForceQueue(nil, procedure
    begin
      //AfterShow(Self);
      Dialog.Execute;
    end);
end;

BerndS 22. Nov 2021 08:14

AW: Eingabefenster automatisch anzeigen lassen
 
Hier noch eine einfache Variante:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
    FFirstDlg: Boolean;
  public
    procedure UpdateActions; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.UpdateActions;
begin
  if not FFirstDlg then
  begin
    FFirstDlg := True;
    ShowMessage('Hallo Welt');
  end;
  inherited;
end;

KodeZwerg 22. Nov 2021 10:24

AW: Eingabefenster automatisch anzeigen lassen
 
Zitat:

Zitat von zeras (Beitrag 1497946)
Danke für eure Info.
Ich dachte, es gibt nur eine Lösung. Aber da habe ich mich offenbar getäuscht.
Getestet habe ich erst einmal die Lösunghier.
Damit habe ich mein Problem leider nicht lösen können. Vielleicht liegt das auch an der Komponente, die ich von TMS nutze.
Das eine Problem ist ja, dass sich die Fenster nicht immer die Position merken. Dazu nutzte ich ja FormSize.
Ein weiteres Problem ist, dass teilweise das Hauptfenster wieder aufpoppt, obwohl ein anderes Fenster mit ShowModal angezeigt wurde.
Die Probleme passieren aber nicht immer, sondern sporadisch. Deshalb dachte ich, dass es vielleicht an dem Eingabefenster liegt, wie oben beschrieben.
Das sind zwar nur Schönheitsfehler. Aber die wollte ich irgendwann mal behoben haben.
Vielleicht komme ich nächstes Wochenende dazu, eure anderen Lösungen einmal einzubauen.

Die Probleme die Du hast mit dem "welches Fenster ist vorne" könnten auf falsche Fensterparameter hindeuten.
Ich empfehle einfach mal ein neues projekt zu erstellen, eine zweite form erstellen mit visible = false.
OnIdle variante würde ich priorisieren.

Man kann auch das zweite Formular aus der .dpr datei entfernen und über die haupt-unit dynamisch verwalten.
(initialization, finalisation)

Delbor 22. Nov 2021 11:08

AW: Eingabefenster automatisch anzeigen lassen
 
Hi zusammen

Ich erlaube mir, nochmal darauf hinzuweisen:
Die Eigenschaft PopupMode steuert, wie sich das Formular der obersten Obene hinsichtlich des Windows-Stils WS_POPUP verhält.
Und zwar genau deswegen:
Zitat:

Die Probleme die Du hast mit dem "welches Fenster ist vorne" könnten auf falsche Fensterparameter hindeuten.
Widersprecht mir, wenn ich mich irre, aber da steht auch etwas von "...hängende Anwendung vermeiden", und damit ist ganz klar das Überdecken des Dialog- oder Modalfensters gemeint.
Ich weiss selbst nicht, wie lange es dieses Property schon gibt, aber dass früher viel mit den (richtigen) Parametern (oder Tricks) hantiert werden musste, ist so. Und nun ist es plötzlich so einfach??

Ach so:
Zitat:

Die Eigenschaft PopupMode wird beim Aufruf der Methode ShowModal automatisch auf pmAuto gesetzt.
Zumindest nach meinem Verständnis muss PopUpMode für ein PopUpFenster aber pmExplicit sein...

Gruss
Delbor


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