Page 1 of 2 1 2 LastLast
Results 1 to 15 of 16

Thread: Wanneer gebeurt wat?

  1. #1

    Wanneer gebeurt wat?

    Wederom een vraag van een beginner.

    Wanneer ik in Form.OnActivate test of een bepaalde map of database bestaat, dan zet ik het resultaat daarvan in een memo dat ik in Form.OnCreate creeerde. Maar ik merk dat dat memo gevuld met het antwoord veel later en ineens, en gevuld met het antwoord getoond wordt. Ik test dat door NA het tonen van het antwoord een Windows.Beep(500, 800) te plaatsen. Dat geeft wat vertraging. Het antwoord is al bekend, en naar het memo geschreven. Maar het memo is nog niet zichtbaar. En dat had ik wel verwacht.

    Als e.e.a. probeer te volgen dan zie ik dat na Application.CreateForm wel een form en een memo getekend wordt, maar na Application.Run is het memo gevuld met het antwoord.

    Kortom, het werkt wat anders dan wat ik dacht. Misschien druk ik me met bovenstaande wat ongelukkig uit.

    Mijn vraag: Graag zou ik eerst een form en een memo creeren, en daarna pas het resultaat van een onderzoek in dat memo zetten. Wat doe ik verkeerd?

  2. #2
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,195
    Componenten worden geupdate, maar de refresh naar het scherm wordt meestal pas getriggered nadat het event is afgelopen.

    Als je dat dus frustreert door een pauze te forceren, dan zal de refresh dus pas na de pauze zichtbaar zijn.

  3. #3
    Waarom zou je niet alles in formcreate doen?
    (OnActivate kan ook meerdere keren voorkomen)

    The Birth, Life and Death of a Delphi Form
    https://www.thoughtco.com/life-cycle...i-form-1058011

    Tevens is het normaal dat resultaat pas later komt. In feite pas wanneer de componenten opnieuw gepaint worden.

    Als het echt de bedoeling is dat je eerst een lege memo ziet en het resultaat erna komt, kun je ook een postmessage naar je eigen form doen. Die wordt dan pas afgehandeld nadat alle andere events gedaan zijn (dus nadathet form op het scherm staat). Je zou daar zelfs een delay in kunnen bouwen.

  4. #4
    Thanks, ik ga dat doornemen en even laten bezinken. Mijn punt is eigenlijk dat nu 1 tabel ingelezen wordt bij het starten van het programma. Dat gaat vliegensvlug. Maar in deze tabel staan 25 Items, en daarmee worden de bijbehorende 25 tabellen gegenereerd. Dat gaat ook nog vlug. Maar dan komt het, (ik moet dat wel nog maken), die 25 tabellen moeten ook gevuld worden. En 25x vlug dat gaat denk ik even duren. (een aantal tellen). En dat is nog maar het begin. Er komen mogelijk meerdere databases, maar zeker meer tabellen. Al die tijd ziet de gebruiker niets op het scherm verschijnen. Dat lijkt me niet juist. Ik kan wel een MessageBox of iets laten verschijnen maar dat lijkt me zo knullig. Vandaar dat ik liever een voortgangsindicator laat zien. Voorlopig is dat een memo. Gewoon omdat ik dat zelf handig vind. Later kan ik er misschien een ProgressBar van maken of zo.

  5. #5
    I7 7700K 32Gb Win10 Pro Wok's Avatar
    Join Date
    Dec 2002
    Location
    Alkmaar
    Posts
    1,986
    Als je zoveel tabellen wilt maken, is een memorytabel te over wegen, maar aan de andere kant, waarom zou je zoveel tabellen willen maken?
    On the fly gaat meestal sneller, lees ongemerkter, dus maak ze op het moment als je ze nodig heb, en sla ze op in een database, dan hoef je ze de volgende keer niet meer te maken.
    Als het wisselende gegevens zijn moet je je afvragen of een tabel het juiste medium is om ze te maken. Een array werkt dan vaak prettiger.
    10.3.3, Delphi2010, of Lazarus 2.0.8

  6. #6
    Mijn programma haalt koersen van aandelen binnen. Te beginnen in Nederland, met de AEX dat zijn 25 aandelen die 25 tabellen genereren. Daarnaast is er ook nog AMX, AScX, Lokaal en overig. Dan zijn er nog buitenlandse beurzen. Maar daar ben ik nog niet aan toe gekomen. Dit alles wordt in een Database opgeslagen. Wanneer ik precies zou weten wat ik wil maken, dan is dat makkelijker. Maar het is nu wat aftasten. Maar in het begin zijn al die tabellen nog leeg. En die de eerste keer vullen duurt het langst. Hoewel dat naar mijn mening ook best wel snel gaat. Maar het valt me op dat ik een met tekst gevuld memo pas te zien krijg nadat de tabel al geladen is. En dat had ik niet verwacht En zodoende ben ik met een Windows.Beep gaan spelen om op de gewenste plek wat vertraging te krijgen. Zodoende had ik beter inzicht of iets nu al wel of niet gedaan was. Daarbij valt het op dat een tabel al geladen is terwijl ik nog geen form zie. En dat dient onderzocht te worden.

    Inmiddels heb ik de verhelderende link van Rik gelezen, en kom tot de conclusie dat mijn programma aangepast moet worden.
    Last edited by Duiker; 22-Sep-20 at 10:19.

  7. #7
    Ik ben er uit.
    In Form.OnCreate genereer ik 1 tabel indien dat nodig is. Pas als de gebruiker het aandeel aanklikt wat hij wil zien, dan wordt de bijbehorende tabel bijgewerkt. Als de tabel helemaal leeg is dan duurt dat nu eenmaal wat langer. Als het wat langer duurt, dan is dat een eenmalige gebeurtenis.

    Wederom bedankt voor het meedenken.

  8. #8
    Hoe vul je die memo? Als je daar regel voor regel aan toevoegt (Memo.Lines.Add), kan dat nogal traag zijn, omdat elke toevoeging vertaald wordt naar een stroom messages naar het onderliggende windows control.

    Het is dan beter om een losse string samen te stellen, bijvoorbeeld met een TStringBuilder, of in een TStringList, en die daarna aan de memo toe te kennen (Memo.Text := StringList.Text).
    1+1=b

  9. #9
    De memo wordt inderdaad gevuld met Memo.Lines.Add. Maar dat is het probleem niet. Het memo werd gevuld vertoond. En dat kan eigenlijk niet.

  10. #10
    Snap ik, maar ik dacht dat als alles gewoon heel snel zou gaan, dat dat dan misschien geen probleem zou zijn
    1+1=b

  11. #11
    Het blijft knagen.

    Delphi Code:
    1. procedure TMainForm.Button1Click(Sender: TObject);
    2. var StartDate, EndDate, NewDate : String;
    3.     Teller_1, Teller_2 : byte;
    4.     myDate : TDateTime;
    5.     Dag, Maand, Jaar : integer;
    6. begin
    7.   StartDate := '200001';
    8.  
    9.   myDate := Now;
    10.   Dag    := DayOfTheMonth(myDate);
    11.   Maand  := MonthOfTheYear(myDate);
    12.   Jaar   := YearOf(myDate);
    13.  
    14.   EndDate := IntToStr(Jaar);
    15.  
    16.   Label24.Caption := DateToStr(myDate);
    17.   Label25.Caption := 'Huidige dag: '   + IntToStr(Dag);
    18.   Label26.Caption := 'Huidige maand: ' + IntToStr(Maand);
    19.   Label27.Caption := 'Huidige jaar: '  + IntToStr(Jaar);
    20.   Label28.Caption := 'StartDate: ' + StartDate;
    21.   Label29.Caption := 'EndDate: ' + EndDate;
    22.  
    23.   MessageForm.Visible := true;
    24.   MessageForm.Memo1.Lines.Add('Dit is een test.');
    25.  
    26.   NewDate := StartDate;
    27.   for Teller_1 := 0 to 20 do
    28.   begin
    29.     for Teller_2 := 0 to 11 do
    30.     begin
    31.       NewDate := IntToStr(StrToInt(StartDate) + Teller_2);
    32.       MessageForm.Memo1.Lines.Add(NewDate);
    33.     end;
    34.     MessageForm.Memo1.Lines.Add('');
    35.     StartDate := IntToStr(StrToInt(StartDate) + 100);
    36.   end;
    37.  
    38. end;

    Het MessageForm komt eerder in beeld dan dat de labels van een Caption worden voorzien. Dit MessageForm is al eerder gecreeerd maar is alleen onzichtbaar. Maak ik het MesageForm.Visible := false dan zie je doordat er geen vertraging is, dat de Labels direct van een Caption worden voorzien. Het probleem ontstaat dus omdat het MessageForm zichtbaar is.

    Dat begrijp ik niet. Kan iemand me dat misschien uitleggen?

    The Birth, Life and Death of a Delphi Form
    https://www.thoughtco.com/life-cycle...i-form-1058011


    Dit geeft mij geen uitleg hierover.
    Last edited by Duiker; 25-Sep-20 at 11:55.

  12. #12
    voeg toe aan regel 22 Refresh

    Als je de eerdere reacties opnieuw leest dan staat het daar al prima in uitgelegd waarom eea gebeurt

  13. #13
    Inderdaad Miep. Dat werkt wonderbaarlijk.

    Het komt dus omdat zoals marcov zegt, dat de refresh van het scherm pas na het event komt.
    Last edited by Duiker; 25-Sep-20 at 12:04.

  14. #14
    Ja, en alleen de refresh van de labels. Andere componenten zouden e.v. wel direct aangepast kunnen zijn.
    Als je bijvoorbeeld een Self.Memo1.Lines.Add('a') hebt dan wordt die wel direct geupdate.
    Maar een Self.Label1.Caption := 'a'; wordt pas bij de volgende form-refresh geupdate (die je dus kunt forcen).

  15. #15
    Self.Label1.Caption := 'a';
    Er vind nu geen refresh plaats omdat dat pas aan het einde van de procedure gebeurd. Dit komt omdat het label nergens op staat te wachten. Ik veronderstel dat een label als een statisch iets bedoeld is.

    Self.Memo1.Lines.Add('a');
    Er vind nu wel een refresh plaats. Dat komt omdat het Memo staat te wachten tot er wat gebeurd. Na het schrijven naar de memo is de event klaar, en komt er dus een refresh. En staat deze weer te wachten op een volgende gebeurtenis.

    Zeg ik dat zo goed?

    Nu had ik bijna mijn volgende vraag al klaar.
    Een button staat ook te wachten op input. Zojuist heb ik geprobeerd de caption van een button aan te passen. En Jawel! Deze paste zich zoals verwacht meteen aan. Nog meer probeersels: Een panel staat ook nergens op te wachten. En dus wordt de caption niet meteen aangepast. Dat klopt.

    Zou ik een Label wel op een event kunnen laten wachten? Onzinnig misschien, maar kan het?

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •