AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Komponenten initialisieren

Ein Thema von blablab · begonnen am 10. Nov 2012 · letzter Beitrag vom 11. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2   
Perlsau
(Gast)

n/a Beiträge
 
#1

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 12:41
Es gibt dann ein Problem, wenn die Form nicht aktiviert wird. Ist allerdings wohl mehr theoretisch, denn um das zu bewerkstelligen, muss man die Create-Parameter der Form entsprechend anpassen
BTW Bei OnShow sind alle Units da, aber die Form u.U. noch nicht sichtbar und das macht teilweise Probleme
Dann lieg ich wohl doch nicht so falsch mit meiner Gewohnheit, notwendige Initialisierungen in FormActivate zu belassen ...

Ich kann's jetzt gerade nicht ausprobieren, weil auf meinem Entwicklungsrechner gerade ein Virenscan läuft, den ich nicht unterbrechen möchte – aber soweit ich mich erinnere, lassen sich auch Datenbank-Komponenten im Datenmodul nicht fehlerlos zum OnCreate-Zeitpunkt initialisieren.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 13:14
OnCreate (alt), OnCreate (neu), OnShow und OnActivte...



OnCreate (OldCreateOrder) wurde direkt im TForm.Constructor ausgelöst, also kurz nachdem die Form erstellt und die DFM geladen wurde

OnCreate (NewCreateOrder) wird im TFormAfterConstruction ausgelöst, also nachdem alles erstellt wurde
(eigentlich sollte man hier alles initialisieren, außer es gibt wirklich Probleme)

OnShow wird kurz vor dem Anzeigen ausgeführt, aber unmittelbar vor dem ersten OnActivate, wenn die Form mit Visible=True erstellt/geladen wurde

OnActivte wird jedesmal ausgeführt, wenn die Form den Eingabefokus bekommt und wenn die Form schon sichtbar ist. Es kann unter Umständen stören, wenn sich wärend des Arbeitens (Form bekommt Fokus) und auch wärend des Ladens (kurz danach, aber optisch dazugehörend) sich die Form nochmals verändert.

OnTimer, der im OnCreate aktiviert und beim ersten Aufruf wieder deaktiviert wird: entweder "kurz" nach dem OnActivate und auch, wenn die Form nicht sichtbar ist, aber nachdem definitiv alles geladen wurde (außer jemand pfuscht mit Application.ProcessMessages rum)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Nov 2012 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 14:43
Mit folgendem Ansatz kann man ziemlich sicher sein, daß das Form sichtbar ist und der Init-Code nur einmal aufgerufen wird.

Delphi-Quellcode:
const
  WM_INITIALIZE = WM_USER + 1;

type
  TForm177 = class(TForm)
    procedure FormCreate(Sender: TObject);
  protected
    procedure WMInitialize(var Message: TMessage); message WM_INITIALIZE;
  public
  end;

...

procedure TForm177.FormCreate(Sender: TObject);
begin
  ...
  PostMessage(Handle, WM_INITIALIZE, 0, 0)
  ...
end;

procedure TForm177.WMInitialize(var Message: TMessage);
begin
  inherited;
  { hier Initialisierungscode }
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#4

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 15:32
"ziemlich":

Es kommt fast auf's Selbe raus, wie mit einem Timer ... pfuscht jemand mit Application.ProcessMessages rum, war's das.
(und glaub mir, das kommt häufiger vor, als man denkt ... EurekaLog, DevExpress usw.)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (10. Nov 2012 um 15:34 Uhr)
  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
 
#5

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 15:34
@uwe Manchmal frage ich mich warum solche Dinge in der VCL nicht von Haus aus drin sind. An zuviel Code kann es nicht liegen, wohl eher daran, dass dort einigen Entwickler in der Schule Singen und Klatschen wichtiger war
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
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 20:40
@uwe Manchmal frage ich mich warum solche Dinge in der VCL nicht von Haus aus drin sind. An zuviel Code kann es nicht liegen, wohl eher daran, dass dort einigen Entwickler in der Schule Singen und Klatschen wichtiger war
Gut möglich
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#7

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 21:38
Die Frage ist eher, warum sich nich alle Komponenten ordentlich initialisieren, dann wären Umwege nicht nötig.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 22:44
OnCreate (NewCreateOrder) wird im TFormAfterConstruction ausgelöst, also nachdem alles erstellt wurde
(eigentlich sollte man hier alles initialisieren, außer es gibt wirklich Probleme)
Wenn ich innerhalb von OnCreate eine Procedure im Datenmodul aufrufe, löst das eine Zugriffsverletzung aus. Deshalb hatte ich wohl alles in OnActivate gemacht.

OnShow wird kurz vor dem Anzeigen ausgeführt, aber unmittelbar vor dem ersten OnActivate, wenn die Form mit Visible=True erstellt/geladen wurde
Nun habe ich den Aufruf der Verbindungs-Funktionen in OnShow verlagert – und es tut! Vorteil: Der schleppende Aufbau der Form (enthält DBGrid, das beim Programmstart so sortiert wird, wie es beim letzten Programmende war) ist nicht mehr sichtbar. Danke, Himitsu.

OnActivte wird jedesmal ausgeführt, wenn die Form den Eingabefokus bekommt und wenn die Form schon sichtbar ist. Es kann unter Umständen stören, wenn sich wärend des Arbeitens (Form bekommt Fokus) und auch wärend des Ladens (kurz danach, aber optisch dazugehörend) sich die Form nochmals verändert.
Da hast du allerdings recht, weshalb ich ja auch ein Flag verwendete, das dafür sorgte, daß OnActivate nur einmal aufgerufen wird. Jetzt kann ich mir das sparen

Jetzt muß ich mir nur noch einen Splash-Screen einbauen, um die 3 Sekunden bis zur Anzeige zu überbrücken ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#9

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 22:54
Das Datenmodul wird aber auch vor der Form erstellt und nicht danach?
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#10

AW: Komponenten initialisieren

  Alt 10. Nov 2012, 23:00
Das Datenmodul wird aber auch vor der Form erstellt und nicht danach?
Nein, im Projekt-Quellcode wird das Datenmodul erst nach der Form erstellt. Erstelle ich das Datenmodul vor der Mainform, kann ich auf das Datenmodul aus dem OnCreate der Mainform heraus zugreifen. Der Projekt-Quellcode war mir völlig aus dem Sinn. Danke.

Übrigens: Ich habe eben festgestellt, das OnActivate nicht bei jedem Fokus-Erhalt aufgerufen wird. Tatsächlich konnte ich es nicht bewerkstelligen, daß ein ShowMessage in OnActivate angezeigt wird außer beim Programmstart. Soweit ich mich erinnere, wird OnActivate außer beim Programmstart nur nach der Rückkehr aus einem nicht modal angezeigten Programmfenster ausgelöst ... Wenn ich lediglich mit Alt-Tab den Fokus auf ein anderes Programm lege und wieder zurück zum Projekt-Programm, passiert gar nichts ...

Geändert von Perlsau (10. Nov 2012 um 23:09 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:53 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