Delphi: App inicializace - nejlepší praktiky / přístup

hlasů
3

Běžím do toho pravidelně, a jsem jen hledal nejlepší praxe / přístupu. Mám databáze / aplikace s datamodule obsahem, a chtějí oheň databáze / datové soubory při startu w / o nutnosti „aktivní při běhu“ nastavena na hodnotu true v době návrhu (místo databáze se liší). Také spustit web „Check for updates“ rutina při spuštění aplikace nahoru.

Vzhledem k tomu, TForm sekvence událostí, a výsledky z různých pokusů a omylů, jsem v současné době pomocí tohoto přístupu:

Používám „Globals“ rekord v hlavním formuláři uložit všechny globální Vars, jeden prvek, který hlásil Globals.AppInitialized (boolean) a nastavte ji na hodnotu FALSE v sekci Inicializace hlavního formuláře.

Na OnShow případě hlavního formuláře (všechny formy jsou vytvořeny poté), I test Globals.AppInitialized; jestli je to nepravdivé, jsem běžet můj „inicializace“ věci, a pak dokončit nastavením Globals.AppInitialized: = true.

Zdá se, že funguje docela dobře, ale je to nejlepší přístup? Hledá pochopení od druhých zkušeností, nápadů a názorů. TIA ..

Položena 20/12/2008 v 00:13
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
10

I obecně vždy vypnout automatické vytváření všech forem KROMĚ pro hlavní formulář a možná primární datamodule.

Jeden trik, který jsem se naučil, co můžete udělat, je přidat své datamodule do projektu, aby mohla auto-vytvářet a vytvářet před vašima hlavního formuláře. Pak, když se vytvoří váš hlavní forma, onCreate pro datamodule bude již spuštěn.

Pokud vaše aplikace má nějaký kód říci, nastavit fokus ovládacího prvku (něco, co nelze dělat na tvorbu, protože jeho „ještě není vidět“), pak vytvořit uživatelský zprávu a pošlete ji do formuláře ve svém OnCreate. Tato zpráva by měla (bez záruky) zpracování, jakmile se smyčka formy zpráva zpracována. Například:

const
  wm_AppStarted = wm_User + 101;


type
  Form1 = class(tForm)
    :
    procedure wmAppStarted(var Msg:tMessage); message wm_AppStarted;
  end; 

// in your oncreate event add the following, which should result in your wmAppStarted event firing.
PostMessage(handle,wm_AppStarted,0,0);

Já si nemyslím, že v jednom okamžiku, že tato zpráva nebyla nikdy zpracovaný, ale podstata této výzvy je, že je přidána do fronty zpráv, a je-li fronta plná, pak je „klesla“. Stačí být vědomi toho, že okrajový případ existuje.

Odpovězeno 20/12/2008 v 04:42
zdroj uživatelem

hlasů
7

Možná budete chtít přímo zasahovat do zdroje projektu (.dpr souboru) po výzvách vytváření formy a před Application.Run. (Nebo ještě dříve v případě).

To je, jak jsem obvykle zvládnout takový inicializační věci:

...
Application.CreateForm(TMainForm, MainForm);    
...
MainForm.ApplicationLoaded; // loads options, etc..
Application.Run;
...
Odpovězeno 20/12/2008 v 01:37
zdroj uživatelem

hlasů
3

Nevím, jestli je to užitečné, ale někteří z mých aplikací nemají jakoukoli formu auto vytvořil, tedy nemají MainForm v IDE.

První tvar vytvořený s objektu Application jako jeho vlastník se automaticky stane MainForm. Tak jsem se jen automaticky vytvořit jednu datamodule jako nakladačem a nechat tenhle rozhodnout, které datamodules vytvořit kdy a který tvoří vytvořit v jakém pořadí. Tento datamodule má při spuštění a vypnutí metodu, která se označuje jako „závorkách“ kolem Application.Run v DPR. Způsob ShutDown dává trochu větší kontrolu nad procesu vypínání.

To může být užitečné, když jste vytvořili různé „mainforms“ pro různé případy použití vaší aplikace, nebo můžete použít některé konfigurační soubory pro výběr různých mainforms.

Odpovězeno 20/12/2008 v 12:00
zdroj uživatelem

hlasů
2

K dispozici je ve skutečnosti není takový pojem jako „globální proměnné“ v Delphi. Všechny proměnné jsou rozsahem k jednotce, kde se nacházejí i jiné jednotky, které používají tuto jednotku.

Jen aby AppInitialized a inicializační věci jako součást svého datového modulu. V podstatě mají jednu třídu (nebo datamodule) rozhodovat všechny vaše non-UI věci (něco jako One-Ring, s výjimkou ne všechno zlo a tak.)

Případně můžete:

  • Nazvěme to z úvodní obrazovky.
  • Udělej to během přihlašovací
  • Spustit „Zkontrolovat aktualizace“ v pozadí nit - nenuťte je aktualizovat právě teď . To něco jako Firefox dělá.
Odpovězeno 20/12/2008 v 01:26
zdroj uživatelem

hlasů
1

I použít primární datový modul pro kontrolu, zda je připojení k DB je v pořádku, a pokud tomu tak není, ukázat vlastní formulář složky, která se nastavení připojení k db a potom načte hlavní forma:

Application.CreateForm(TDmMain, DmMain);

  if DmMain.isDBConnected then
    begin
      Application.CreateForm(TDmVisualUtils, DmVisualUtils);
      Application.CreateForm(TfrmMain, frmMain);
    end;

  Application.Run;
Odpovězeno 08/05/2009 v 13:32
zdroj uživatelem

hlasů
1

Nejsem si jistý, že jsem pochopit, proč potřebujeme globální proměnné? V současné době píšu všechno moje Delphi aplikace bez jediné globální proměnné. Dokonce i když jsem je používat, jsem nikdy neměl víc než pár za použití.

Takže možná budete muset nejprve přemýšlet, proč jste vlastně potřebují.

Odpovězeno 20/12/2008 v 00:39
zdroj uživatelem

hlasů
0

Jeden trik používám je umístit TTimer v hlavním formuláři, nastavte čas na něco jako 300ms a provádět jakoukoli inicializaci (dB přihlášení, síťový souborový kopie atd.) Spuštění aplikace vyvolá hlavní formulář okamžitě a umožňuje každému inicializace ‚věci‘ se stane. Uživatelé nemají spuštění více instancí myšlení „Oh..I neměl DBL-cvak ... udělám to znovu ..“

Odpovězeno 21/12/2008 v 14:42
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more