Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wann wird eine Form angezeigt ? (https://www.delphipraxis.net/195775-wann-wird-eine-form-angezeigt.html)

H.Bothur 24. Mär 2018 13:15

Delphi-Version: 10.1 Berlin

Wann wird eine Form angezeigt ?
 
Moin,

ich stehe mal wieder vollkommen auf dem Schlauch:

Ich habe ein Programm das automatisch - also ohne Start-Button oä. - bei Form.Show abläuft. Wann bzw. wie kann ich denn während des Programmlaufes die Form anzeigen ??

Ich habe mal ein Textprogramm erstellt - nur die Form, darauf ein Label und eine Textdatei mit 20.000 Zeilen.
Ich merke auch das das Programm ausgeführt wird, es ist aber nicht sichtbar.

Gruss
Hans

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var
  ArtikelString: TStringList;
  Zeile: String;
  i, j: Integer;
begin
  ArtikelString := TStringList.Create;
  ArtikelString.LoadFromFile('d:\temp\test\artikelliste.csv');
  for j := 1 to 10 do
  begin
    for i := 0 to ArtikelString.Count -1 do
    begin
      Zeile := ArtikelString.Strings[i];
      Form1.Label1.Caption := Copy(Zeile, 1, 12);
      Form1.Label1.Refresh;
    end;
  end;
  ArtikelString.Free;
  Application.Terminate;
end;

end.

mkinzler 24. Mär 2018 13:19

AW: Wann wird eine Form angezeigt ?
 
Nach Vorbereitung -> Selbstmord

Zitat:

Delphi-Quellcode:
  Application.Terminate;


H.Bothur 24. Mär 2018 13:27

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von mkinzler (Beitrag 1397155)
Nach Vorbereitung -> Selbstmord

Zitat:

Delphi-Quellcode:
  Application.Terminate;


Ist es - erklärt aber nicht warum in der Zwischenzeit nichts angezeigt wird. :_(

mkinzler 24. Mär 2018 13:38

AW: Wann wird eine Form angezeigt ?
 
Weil Form.Show vor dem Anzeigen ausgeführt wird.

Und auch wenn die Form sichtbar wäre, wäre ja wenig sichtbar

günni0 24. Mär 2018 13:56

AW: Wann wird eine Form angezeigt ?
 
Dein Problem kann man schön mit WMFormVisible lösen

Delphi-Quellcode:
const
 WM_FORM_VISIBLE = WM_USER + 1;

private
 FormInitialised: Boolean;
 procedure WMFormVisible(var msg: TMessage); message WM_FORM_VISIBLE;
end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
 FormInitialised := False;
end;

procedure TForm1.WMFormVisible(var msg: TMessage);
begin
 if not FormInitialised then
  begin
   FormInitialised := True;
   
   Code hier rein
  end;
end;

Bernhard Geyer 24. Mär 2018 14:51

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von mkinzler (Beitrag 1397157)
Weil Form.Show vor dem Anzeigen ausgeführt wird.

Könnte man evtl. auch sagen das das OnShow-Event die letzte Aktion vor dem Anzeigen des Formulares ist.

mkinzler 24. Mär 2018 14:54

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1397159)
Zitat:

Zitat von mkinzler (Beitrag 1397157)
Weil Form.Show vor dem Anzeigen ausgeführt wird.

Könnte man evtl. auch sagen das das OnShow-Event die letzte Aktion vor dem Anzeigen des Formulares ist.

Das wollte ich damit ausdrücken

H.Bothur 24. Mär 2018 16:01

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von günni0 (Beitrag 1397158)
Dein Problem kann man schön mit WMFormVisible lösen

Das bekomme ich komischerweise nicht kompiliert ... Delphi (10.1) meckert bei

"message WM_FORM_VISIBLE;"
Undeklarierter Bezeichner "WM_FORM_VISIBLE"

Gruß
Hans

H.Bothur 24. Mär 2018 16:04

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von mkinzler (Beitrag 1397157)
Weil Form.Show vor dem Anzeigen ausgeführt wird.

Aber ... welches Ereignis kommt den wenn die Form wirklich zum ersten Mal sichtbar ist ?

Zitat:

Und auch wenn die Form sichtbar wäre, wäre ja wenig sichtbar
In dem Beispiel nicht viel - das stimmt :-D

Hans

Delphi.Narium 24. Mär 2018 16:15

AW: Wann wird eine Form angezeigt ?
 
Gehen wir davon aus, dass das Formular momentan so aufgerufen wird:
Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Form1.Show;
end;
Dann könnte man den Aufruf dahingehend ändern:
Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Form1.Show;
  Form1.DoSomething; // Diese Methode enthält den Inhalt des jetzigen OnShow-Ereignisses.
  Close;
end;
Delphi-Quellcode:
procedure TForm1.DoSomething;
var
  ArtikelString: TStringList;
  Zeile: String;
  i, j: Integer;
begin
  ArtikelString := TStringList.Create;
  ArtikelString.LoadFromFile('d:\temp\test\artikelliste.csv');
  for j := 1 to 10 do
  begin
    for i := 0 to ArtikelString.Count -1 do
    begin
      Zeile := ArtikelString.Strings[i];
      Form1.Label1.Caption := Copy(Zeile, 1, 12);
      Form1.Label1.Refresh;
    end;
  end;
  ArtikelString.Free;
  Close;
end;
Eventuell könntest Du uns aber auch mal die Stelle in Deinem Quelltext zeigen, an der Form1 angezeigt werden soll. Was passiert da vorher noch so alles?

DeddyH 24. Mär 2018 16:18

AW: Wann wird eine Form angezeigt ?
 
Man könnte das auch mit einer eigenen Message lösen, die man sich selbst schickt (aber nicht SendMessage, sondern PostMessage benutzen). Die wird dann abgearbeitet, wenn alle anderen Messages davor durch sind.

günni0 24. Mär 2018 16:31

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von H.Bothur (Beitrag 1397162)
Zitat:

Zitat von günni0 (Beitrag 1397158)
Dein Problem kann man schön mit WMFormVisible lösen

Das bekomme ich komischerweise nicht kompiliert ... Delphi (10.1) meckert bei

"message WM_FORM_VISIBLE;"
Undeklarierter Bezeichner "WM_FORM_VISIBLE"

Gruß
Hans

Irgendwo deklarieren
Delphi-Quellcode:
const
 WM_FORM_VISIBLE = WM_USER + 1;

H.Bothur 24. Mär 2018 16:31

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1397164)
Gehen wir davon aus, dass das Formular momentan so aufgerufen wird:
Delphi-Quellcode:
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Form1.Show;
end;
Eventuell könntest Du uns aber auch mal die Stelle in Deinem Quelltext zeigen, an der Form1 angezeigt werden soll. Was passiert da vorher noch so alles?

nein - die Form ist ja die Mainform des Programmes - sprich das Programm soll vollautomatisch ablaufen und nur eben während die Daten verarbeitet werden einen Status anzeigen - und sich dann eben auch selber wieder beenden.

Das ist übrigens (fast) der komplette Code, der Rest ist der Delphi-Standard:

Delphi-Quellcode:
unit TestUnit;

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)
    Label1: TLabel;
    procedure FormShow(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
  ArtikelString: TStringList;
  Zeile: String;
  i, j: Integer;
begin
  ArtikelString := TStringList.Create;
  ArtikelString.LoadFromFile('d:\temp\test\artikelliste.csv');
  for j := 1 to 10 do
  begin
    for i := 0 to ArtikelString.Count -1 do
    begin
      Zeile := ArtikelString.Strings[i];
      Form1.Label1.Caption := Copy(Zeile, 1, 9);
      Form1.Label1.Refresh;
    end;
  end;
  ArtikelString.Free;
  Application.Terminate;
end;

end.
Hans

haentschman 24. Mär 2018 16:35

AW: Wann wird eine Form angezeigt ?
 
Moin...:P
Zitat:

Man könnte das auch mit einer eigenen Message lösen
...genau. :wink:
Delphi-Quellcode:
const
  WM_AFTERSHOW = WM_USER + 100;
...
procedure FormAfterShow(var Msg: TMessage); message WM_AFTERSHOW;
...
procedure TfoMain.FormAfterShow(var Msg: TMessage);
begin
  // das ist dann sichtbar...
end;

günni0 24. Mär 2018 16:36

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von haentschman (Beitrag 1397168)
Moin...:P
Zitat:

Man könnte das auch mit einer eigenen Message lösen
...genau. :wink:
Delphi-Quellcode:
const
  WM_AFTERSHOW = WM_USER + 100;
...
procedure FormAfterShow(var Msg: TMessage); message WM_AFTERSHOW;
...
procedure TfoMain.FormAfterShow(var Msg: TMessage);
begin
  // das ist dann sichtbar...
end;

Genau wie ich oben schon erklärt habe.

H.Bothur 24. Mär 2018 16:37

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von günni0 (Beitrag 1397166)

Irgendwo deklarieren
Delphi-Quellcode:
const
 WM_FORM_VISIBLE = WM_USER + 1;

Danke - da war ich gerade Blind ... ich dachte das wäre irgendeine feste Systemkonstante aus einer Unit.
Jetzt klappt es wunderbar :_)

Hans

hoika 24. Mär 2018 16:50

AW: Wann wird eine Form angezeigt ?
 
Hallo,
warum nimmst Du nicht FormActivate?

Und dort als letzte Zeile
PostMessage(Handle, WM_CLOSE, 0, 0);

Delphi.Narium 24. Mär 2018 16:58

AW: Wann wird eine Form angezeigt ?
 
Wenn Form1 das Hauptformular ist, kann man das Problem doch in der DPR lösen:

Man entferne dort die Zeile
Delphi-Quellcode:
Application.Run;
und füge statt dessen dort ein:
Delphi-Quellcode:
  Form1.Show;
  Form1.DoSomething;
Das Close in DoSomething führt dazu, dass das Programm beendet wird. Man muss es dann nicht per Selbstmord über
Delphi-Quellcode:
Application.Terminate;
beenden.
Eventuell vorhandene OnClose-Ereignisse werden dann auch noch korrekt verarbeitet.

H.Bothur 24. Mär 2018 17:30

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1397172)
Wenn Form1 das Hauptformular ist, kann man das Problem doch in der DPR lösen:

DANKE !! Das ist imho eine schöne und elegante Lösung !!

Gruß
Hans

KodeZwerg 24. Mär 2018 19:35

AW: Wann wird eine Form angezeigt ?
 
Steig lieber auf eine ProgressBar Anzeige um, ein Panel was sich bei jedem Wechsel umbenennt verzögert die abarbeitung.
Besser eine Anzeige per Bar, das Max ist die Menge der Daten, bei unbekannt viel Daten halt Marquee Effekt und alle paar (10'er/50'er/100'er?) Schritte mal den Anwender informieren das was verarbeitet wurde. Nur so am Rande meine 2 Cent.

p80286 25. Mär 2018 09:48

AW: Wann wird eine Form angezeigt ?
 
Zitat:

Zitat von H.Bothur (Beitrag 1397173)
Zitat:

Zitat von Delphi.Narium (Beitrag 1397172)
Wenn Form1 das Hauptformular ist, kann man das Problem doch in der DPR lösen:

DANKE !! Das ist imho eine schöne und elegante Lösung !!

Gruß
Hans

NaJa, eher die Lösung mit dem geringsten Aufwand. Sobald Deine Verarbeitung länger dauert, und Du u.U. das Fenster verschieben willst, ist das doch etwas ruckelig.
Bastel Dir doch etwas mit 2 Threads, der MainThread für die Anzeige und den Verarbeitungsthread.

Gruß
K-H

himitsu 25. Mär 2018 15:02

AW: Wann wird eine Form angezeigt ?
 
Warum überhaupt GUI?

Wenn ich mir den ersten Post anseh, dann wäre Konsole doch genau die passende Lösung. :roll:

Bzw. die Hauptform ist keine Hauptform, von der aus alles abläuft, sondern stattdessen gehört da eine eine Statusform hin, welche von dem Arbeitscode aus angesteuert wird.

KodeZwerg 25. Mär 2018 15:42

AW: Wann wird eine Form angezeigt ?
 
Verarbeitet wird da ja nicht wirklich was, sieht mir eher nach einer CPU-Beschäftigung aus die (noch) keinen Sinn ergibt.
Starte Programm -> Lade Liste -> Zeige Liste -> Schließe Programm, alles ohne Interaktion.
Irgend etwas fehlt da :gruebel:

Delphi.Narium 25. Mär 2018 16:36

AW: Wann wird eine Form angezeigt ?
 
Nein, das ist der Versuch ein Batchprogramm mit Oberfläche (zur Fortschrittsanzeige) zu realisieren.

Sowas musste ich auch schon häufiger machen.

'ne Konsole ist bei manchen halt verpönt, die können den Fortschritt einer Aufgabe nur in 'ner Windowsoberfläche erkennen, aber nicht an der Ausgabe auf der Konsole ;-)

Und mit sowas kann man ein Programm mit Oberfläche auch "mal eben" zu 'nem "bedienungslosen" Batchprogramm umfunktionieren:
Delphi-Quellcode:
// in der DPR
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  ... // halt da hier gewöhnliche
  if ParamCount > 1 then begin
    Form1.Show;
    Form1.DoSomething;
    Form1.Close;
  end else begin
    Application.Run;
  end;
end;
Und wenn's in erster Linie um "sichtbare Funktionalität" geht, dann kann das ausreichen ;-)

himitsu 26. Mär 2018 00:38

AW: Wann wird eine Form angezeigt ?
 
Hier im Forum suchenfilesplitter himitsu
Konsolenanwendung, wenn in Konsole gestartet, und ansonsten GUI-Anwendung.

Delphi.Narium 26. Mär 2018 12:14

AW: Wann wird eine Form angezeigt ?
 
Geht im Prinzip ja und ist auch durchaus sinnvoll, dass man Konsolenanwendungen als ebensolche implementiert und GUI-Anwendung als GUI-Anwendungen.

Aber es gibt halt im realen Leben durchaus schonmal die Anforderung, dass eine Anwendung, die sinnvoll als Konmsolenanwendung realisiert werden kann, vom "Kunden" als GUI-Anwendung verlangt wird, weil er da so schön was sehen kann. Die Anforderungen sind halt manchmal "gegen alle Vernunft" ;-)

Letztlich kann man alle Formen von Konsolenanwendungen und GUI-Anwendungen quasi beliebig mischen. Ob man's als sinnvoll erachtet, steht auf 'nem anderen Blatt ;-)


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