[Delphi] bestaat er zoiets als form.oncreated ?

Pagina: 1
Acties:

  • Glacier
  • Registratie: Juli 2000
  • Niet online
Voor een applicatie ben ik nu bezig met een remember login functie, zodat de gebruiker niet elke keer zijn/haar login gegevens hoeft in te voeren, maar gewoon automatisch wordt ingelogd.

Maar nu het probleem: nadat een user handmatig inlogt, wordt het huidige panel verborgen en wordt een ander panel met de controls van de applicatie, zichtbaar gemaakt. Maar bij het auto login gebeuren kan dat dus niet, aangezien die wordt aangeroepen in het onactivate event (ik krijg dan de error cannot change visible on onshow or onhide).

Dus ben eigenlijk op zoek naar een event wat pas launcht als alles gedrawd en gemaakt is, zodat ik geen probleem meer heb met het veranderen van panelx.visible :)

Andere suggesties voor het oplossen van dit probleem hoor ik uiteraard ook graag :P

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het form zichzelf een windows message laten sturen door middel van PostMessage. Deze afvangen in het form en dan pas je inlog ding doen. Overigens is er een AfterConstruction method die aangeroepen wordt na de OnCreate, maar ook daar heb je in dit geval niets aan.

We adore chaos because we like to restore order - M.C. Escher


  • klinz
  • Registratie: Maart 2002
  • Laatst online: 07-03 16:48

klinz

weet van NIETS

OnFormShow? En anders moet je inderdaad LordLarry's methode hanteren.

  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 13-06-2025

BoomSmurf

Am-Ende!

In het OnShow event is meestal ook nog niets getekend... LordLarry's manier is the way to go.

  • klinz
  • Registratie: Maart 2002
  • Laatst online: 07-03 16:48

klinz

weet van NIETS

BoomSmurf schreef op woensdag 26 oktober 2005 @ 12:05:
In het OnShow event is meestal ook nog niets getekend...
Wat bedoel je in dit geval met 'meestal'? Soms wel?

Verwijderd

Wat als je andersom redeneert? Dus in de IDE het 2e panel visible maken, en alleen het login panel laten zien als er nog niet ingelogged is.

  • hilbren
  • Registratie: Augustus 2000
  • Laatst online: 14-02 07:39
ik ben op dit moment ook naar iets dergelijks.
ik weet wel dat er iets bestaat als WaitForSingleEvent.

(ps ik zoek iets om m'n code een bepaalde tijd op idle te kunnen zetten en te wachten tot er 1 maal een bepaald event is afgehandeld en dan verder gaat)

Verwijderd

Het hangt er een beetje vanaf wat je aan het doen bent. Normaliter hoeft wat jij wilt niet vanwege de event-driven structuur. Kijk dus eerst of het echt nodig is je code te laten idlen, dat klinkt wel heel erg als procedureel coden, wat in Delphi niet de manier is.

Maar goed, ook in OO kan het voorkomen dat je wilt wachten totdat een thread klaar is. Daar zijn genoeg functies voor, zoek maar eens in de Delphi help naar threads. Onderschat de Delphi helpfunctie niet, het kan soms wat langer zoeken zijn maar eigenlijk staat alles er wel in.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 26-04 20:15

Tomatoman

Fulltime prutser

@Glacier:
Wat vaak de oplossing is, is OnActivate van het main form zodanig te implementeren dat hij 1x wordt uitgevoerd voor initialisaties en daarna niet meer. Een real-world voorbeeld:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.FormActivate(Sender: TObject);
begin
  OnActivate := nil;  // Prevents these initializations to occur more than once

{ En dan nu wat code die per programma verschilt. UpdateDBActions, 
  GetMyDocumentsFolder en OpenDB zijn mijn eigen brouwsels. }
  UpdateDBActions;                         // wat data-aware actions updaten
  SetCurrentDir(GetMyDocumentsFolder);     // current directory instellen
  ForceCurrentDirectory := True;
  if ParamCount > 0 then                   // command-line parameters verwerken
    OpenDB(ParamStr(1), False);            // database openen
end;


@hilbren:
Win32 API functies zoals WaitForSingleObject kunnen weliswaar gebruikmaken van (Win32 API) event objects, maar dat zijn heel andere dingen dan de events die Delphi gebruikt. Haal die twee vooral niet door elkaar, normaliter zul je event objects nooit gebruiken. Een korte beschrijving van wat event objects zijn:
An event object is a synchronization object whose state can be explicitly set to signaled by use of the SetEvent function.
Waarschijnlijk is de oplossing voor jou dat je een aparte thread maakt met behulp van TThread. Dit is geen gemakkelijk onderwerp, daarvoor zul je eerst wat in een Delphi naslagwerk over multithreading moeten lezen.

Een goede grap mag vrienden kosten.


Verwijderd

Zoek eens op internet naar het Loaded event ( is normaliter hidden,. maar kan overridden worden ), misschien dat je daar iets aan hebt.

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 26-04 20:15

Tomatoman

Fulltime prutser

Loaded treedt net als OnCreate op voordat het form visible wordt, zodat het meestal dezelfde problemen geeft als OnCreate. Bovendien werkt Loaded alleen voor forms die gestreamd worden (opgeslagen zijn) in de executable - als je CreateNew gebruikt in plaats van Create wordt Loaded nooit aangeroepen.

Een goede grap mag vrienden kosten.


Verwijderd

Glacier schreef op dinsdag 25 oktober 2005 @ 23:27:
... wordt het huidige panel verborgen en wordt een ander panel met de controls van de applicatie, zichtbaar gemaakt. Maar bij het auto login gebeuren kan dat dus niet, aangezien die wordt aangeroepen in het onactivate event (ik krijg dan de error cannot change visible on onshow or onhide).

Dus ben eigenlijk op zoek naar een event wat pas launcht als alles gedrawd en gemaakt is, zodat ik geen probleem meer heb met het veranderen van panelx.visible :)


Andere suggesties voor het oplossen van dit probleem hoor ik uiteraard ook graag :P
De logica van je applicatie veranderen, want in oncreate moet dit gewoon lukken en dan is ook nog niet alles gedrawd.

Delphi geeft niet voor niets de melding: cannot change visible on onshow or onhide.
Pagina: 1