![]() |
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. |
AW: Wann wird eine Form angezeigt ?
Nach Vorbereitung -> Selbstmord
Zitat:
|
AW: Wann wird eine Form angezeigt ?
Zitat:
|
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 |
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; |
AW: Wann wird eine Form angezeigt ?
Zitat:
|
AW: Wann wird eine Form angezeigt ?
Zitat:
|
AW: Wann wird eine Form angezeigt ?
Zitat:
"message WM_FORM_VISIBLE;" Undeklarierter Bezeichner "WM_FORM_VISIBLE" Gruß Hans |
AW: Wann wird eine Form angezeigt ?
Zitat:
Zitat:
Hans |
AW: Wann wird eine Form angezeigt ?
Gehen wir davon aus, dass das Formular momentan so aufgerufen wird:
Delphi-Quellcode:
Dann könnte man den Aufruf dahingehend ändern:
procedure TMainForm.Button1Click(Sender: TObject);
begin Form1.Show; end;
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:
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?
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; |
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.
|
AW: Wann wird eine Form angezeigt ?
Zitat:
Delphi-Quellcode:
const
WM_FORM_VISIBLE = WM_USER + 1; |
AW: Wann wird eine Form angezeigt ?
Zitat:
Das ist übrigens (fast) der komplette Code, der Rest ist der Delphi-Standard:
Delphi-Quellcode:
Hans
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. |
AW: Wann wird eine Form angezeigt ?
Moin...:P
Zitat:
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; |
AW: Wann wird eine Form angezeigt ?
Zitat:
|
AW: Wann wird eine Form angezeigt ?
Zitat:
Jetzt klappt es wunderbar :_) Hans |
AW: Wann wird eine Form angezeigt ?
Hallo,
warum nimmst Du nicht FormActivate? Und dort als letzte Zeile PostMessage(Handle, WM_CLOSE, 0, 0); |
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:
und füge statt dessen dort ein:
Application.Run;
Delphi-Quellcode:
Das Close in DoSomething führt dazu, dass das Programm beendet wird. Man muss es dann nicht per Selbstmord über
Form1.Show;
Form1.DoSomething;
Delphi-Quellcode:
beenden.
Application.Terminate;
Eventuell vorhandene OnClose-Ereignisse werden dann auch noch korrekt verarbeitet. |
AW: Wann wird eine Form angezeigt ?
Zitat:
Gruß Hans |
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. |
AW: Wann wird eine Form angezeigt ?
Zitat:
Bastel Dir doch etwas mit 2 Threads, der MainThread für die Anzeige und den Verarbeitungsthread. Gruß K-H |
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. |
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: |
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:
Und wenn's in erster Linie um "sichtbare Funktionalität" geht, dann kann das ausreichen ;-)
// 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; |
AW: Wann wird eine Form angezeigt ?
|
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 07:46 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