AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language TForm anzeigen obwohl Terminate bei TForm OnCreate
Thema durchsuchen
Ansicht
Themen-Optionen

TForm anzeigen obwohl Terminate bei TForm OnCreate

Ein Thema von Mike_ · begonnen am 15. Jan 2011 · letzter Beitrag vom 16. Jan 2011
Antwort Antwort
Seite 1 von 2  1 2      
Anthrox

Registriert seit: 4. Feb 2010
14 Beiträge
 
Delphi XE Architect
 
#1

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 06:39
Vielleicht liesse sich mit Threads etwas machen.
Ich habe es mir nicht genau durchüberlegt aber wenn du die Teile welche auch das Terminate enthalten in einen Thread auslagern würdest und am Ende vlt. noch ein Sleep(1000).
Das könnte gehen. Wieso willst du denn das die Form angezeigt wird? Du könntest vorher ja eine Message anzeigen lassen.

MfG Anthrox
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.436 Beiträge
 
Delphi 12 Athens
 
#2

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 07:23
Moin...
Zitat:
Bei OnShow zeigt er überhaupt nichts an und schließt nach erfolreichem ausführen.
- im OnShow kannst du auch noch nichts sehen, weil OnShow ausgeführt wird bevor die Controls / Form angezeigt werden.
- den Funktionscode im OnPaint ist das schlechteste, was du machen kannst.

Lösung:
- du mußt dir ein "OnAfterShow" Ereignis basteln damit OnShow komplett abgearbeitet wird und alles angezeigt wird.
Delphi-Quellcode:
const
  WM_FERTIG = WM_USER + 100; //Name frei wählbar
.
.
private
  procedure HabeFertig(var Msg: TMessage); Message WM_FERTIG;
.
.

procedure TFMain.FormShow(Sender: TObject);
begin
. // Controls einstellen etc.
.
  PostMessage(Handle, WM_FERTIG, 0, 0);
end;

.
.

procedure TFMain.HabeFertig(var Msg: TMessage);
begin
  // dein Funktionscode;
end;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 08:07
Hallo,

OnActivate musst du nehmen.
Vor deinen eigenen Methoden noch ein Application.ProcessMessages.

Das Programm beendest du dann über PostMessage(Handle, WM_CLOSE, 0, 0);


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.436 Beiträge
 
Delphi 12 Athens
 
#4

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 08:25
Zitat:
OnActivate musst du nehmen.
... na supi. Dann klick mal auf ein anderes Fenster und wieder zurück. Was meinst du was passiert ?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#5

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 09:30
Ich habe zwar ncoh nicht genau verstanden, was du vorhast, aber du kannst einen Timer auf dein Form legen, diesen auf Enabled schalten und im OnTimer-Ereignis den Timer disablen und deinen Code ausführen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 09:59
Zitat:
OnActivate musst du nehmen.
... na supi. Dann klick mal auf ein anderes Fenster und wieder zurück. Was meinst du was passiert ?
Dann setzt man sich einen Flag, ob es schon mal aufgerufen wurde oder nicht.

Richtig, OnShow war falsch. Ich nehme dazu immer OnPaint mit einem Flag.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 11:05
Benutze einfach die Komponente TApplicationEvents und dort das Event OnIdle.

Dort prüfst du ob du schon nach einem Update gesucht hast und startest dann die Update-Prüfung.

Das Event wird zum ersten Mal dann ausgeführt, wenn die Anwendung eben nix zu tun hat, also mit dem ganzen Erstellungsgeraffel am Ende ist und alle Formulare erzeugt und angezeigt wurden.

Noch besser ist es allerdings die Updateprüfung in einen Thread auszulagern, falls es mal wieder länger dauert mit der Prüfung
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 11:32
Hallo,

Zitat:
na supi. Dann klick mal auf ein anderes Fenster und wieder zurück. Was meinst du was passiert ?
Delphi-Quellcode:
procedure TForm1.Form1Activate;
begin
  OnActivate:= NIL;

// dein Code
end;
Erledigt, nächste Frage.


Heiko
Heiko
  Mit Zitat antworten Zitat
Mike_

Registriert seit: 26. Mär 2008
98 Beiträge
 
Delphi 2007 Professional
 
#9

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 16. Jan 2011, 16:11
Benutze einfach die Komponente TApplicationEvents und dort das Event OnIdle.

Dort prüfst du ob du schon nach einem Update gesucht hast und startest dann die Update-Prüfung.

Das Event wird zum ersten Mal dann ausgeführt, wenn die Anwendung eben nix zu tun hat, also mit dem ganzen Erstellungsgeraffel am Ende ist und alle Formulare erzeugt und angezeigt wurden.

Noch besser ist es allerdings die Updateprüfung in einen Thread auszulagern, falls es mal wieder länger dauert mit der Prüfung
Hier hatte ich das Problem, dass das Programm in einer Endlosschlaufe läuft, obwohl ich vorher eine Variable deklarierte und bei OnIdle sagte er solle nur weiter machen falls diese auf 0 steht.

Hat er wohl erkannt, jedoch blieb er in der Funktion einer Funktion stecken

Beispiel:
OnIdle -> CopyFileX Function -> WriteLogY Function
Nun blieb er mir, wenn ich z.B. eine MsgBox ind er WriteLogY Funktion reinpacke immer darin stecken und wiederholte sie von oben bis unten.

Es funktionierte tadellos ohne diese MsgBox, aber ist nicht der Sinn der Sache.

Ich habe zwar ncoh nicht genau verstanden, was du vorhast, aber du kannst einen Timer auf dein Form legen, diesen auf Enabled schalten und im OnTimer-Ereignis den Timer disablen und deinen Code ausführen.
Das war doch die - für mich - beste Lösung und vor allem ohne "Nebenwirkungen".

Durch meine Unerfahrenheit habe ich es im letzten Post noch nicht erkannt, vielen Dank Herr Raabe
  Mit Zitat antworten Zitat
Mike_

Registriert seit: 26. Mär 2008
98 Beiträge
 
Delphi 2007 Professional
 
#10

AW: TForm anzeigen obwohl Terminate bei TForm OnCreate

  Alt 15. Jan 2011, 12:53
Da sich jeder die Mühe gemacht hat eine Antwort zu schreiben.
Habe der Fairness und des Lerneffektes wegen jede Lösung ausprobiert.
Hallo,

OnActivate musst du nehmen.
Vor deinen eigenen Methoden noch ein Application.ProcessMessages.

Das Programm beendest du dann über PostMessage(Handle, WM_CLOSE, 0, 0);
Das ging super einfach.
Im FormActivate Event habe ich nur (Vor dem Code):

OnActivate := NIL;
Application.ProcessMessages;

schreiben müssen.

Super dass es einen solchen Befehl gibt, AutoIt hat auch so etwas, bei Delphi kam ich gar nicht darauf.

Benutze einfach die Komponente TApplicationEvents und dort das Event OnIdle.

Dort prüfst du ob du schon nach einem Update gesucht hast und startest dann die Update-Prüfung.

Das Event wird zum ersten Mal dann ausgeführt, wenn die Anwendung eben nix zu tun hat, also mit dem ganzen Erstellungsgeraffel am Ende ist und alle Formulare erzeugt und angezeigt wurden.

Noch besser ist es allerdings die Updateprüfung in einen Thread auszulagern, falls es mal wieder länger dauert mit der Prüfung
Das klappt richtig klasse und war innerhalb ein paar Sekunden getan !

Reicht es, im OnIdle Event das Programm mit Application.Terminate zu beenden oder bringt PostMessage(Handle, WM_CLOSE, 0, 0) irgendwelche mir unbekannten Vorteile ?

Danke für zahlreichen Antworten in der kurzen Zeit !

Anmerkung:
(Der Updater ist ausgelagert, es ist nicht im "Hauptprogramm" enthalten)

@haentschman
Deine Methode ist quasi das "selbst erstellen eines OnIdle Ereignisses, welches ich mit dem EventManager erstellt habe.
Daher wollte ich, wie sagt man hier im Forum "Das Rad nicht neu erfinden"

@Uwe Raabe
Es wird ein Updater gestartet, bevor die "Hauptapplikation" gestartet wird.
Dieser Updater wurde aber nicht angezeigt bzw. nur ohne das TImage welches ich gesetzt hatte, darum ging es hier.
Danke für deine Antwort, allerdings empfinde ich es mit einem Time als "programmiertechnisch suboptimal" (Siehe Methode oben EventHandler).

Geändert von Mike_ (15. Jan 2011 um 16:01 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 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