Results 1 to 7 of 7

Thread: Handle waarde in de constructor compleet anders dan verderop in het programma

  1. #1
    mnemonics
    Guest

    Handle waarde in de constructor compleet anders dan verderop in het programma

    Hallo,

    In mijn applicatie wil ik een aantal handles meegeven aan een object (observer voor windows berichten op te vangen).
    De observer wordt aangemaakt in de constructor van mijn main form en daar geef ik bijv. de handle van een panel (aan de observer) mee die op de main form staat.
    Nu blijkt dat in de constructor de handle van de panel compleet anders is dan wanneer ik de handle later opvraag in het programma.

    Iemand een idee wat hiervan de reden kan zijn?

  2. #2
    Quote Originally Posted by mnemonics View Post
    De observer wordt aangemaakt in de constructor van mijn main form ...
    Je doet dit dus in een overridden Create constuctor van je form en niet in de OnCreate event (FormCreate) ???
    Weet je zeker dat op dat moment het panel al aangemaakt is?

    Als je inderdaad de overridden Create gebruikt dan neem ik aan dat je deze handelingen na de inherited aanroep doet.

  3. #3
    mnemonics
    Guest
    Het gebeurd idd via de create welke override is en inherited wordt aangeroepen (in het begin).

    Ter voorbeeld
    constructor TMijnForm.Create(AOwner:TComponent);
    begin
    inherited;
    Observer := TObserver.create;
    Observer.handles.hControl := Panel.handle;
    end;

    Debugger erop los gegooid de waardes vergeleken.
    Krijg bijna het idee de handle nog niet geinitialiseerd is in de constructor.

    Momenteel heb ik het maar even een andere aanpak gekozen (d.m.v. pointers)
    wat dan weer wel werkt.

  4. #4
    Ik heb het in jouw voorbeeld even getest en bij mij is de Handle van een TPanel in de constructor wel gelijk aan de Handle tijdens het runnen.
    Code:
    constructor TMijnForm.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      showmessage(inttostr(Panel1.Handle));
    end;
    
    procedure TMijnForm.Button1Click(Sender: TObject);
    begin
      showmessage(inttostr(Panel1.Handle));
    end;
    Weet je zeker dat je er niet iets anders fout gaat?

    Ik neem aan dat de constructor wel meer doet dan alleen dit anders kun je dit ook in een OnCreate-event doen zonder de override. Je zou natuurlijk kunnen proberen de Observer.Create wel in de FormCreate te doen maar het mag niks uitmaken omdat de FormCreate gedaan wordt in de inherited Create.

  5. #5
    mnemonics
    Guest
    Ik heb stap voor stap zitten debuggen dus ben er wel overtuigd van.
    Misschien dat in deze stadium de handles nog niet gezet zijn voor de componenten op het formulier (hoewel ik dat ten zeerste in twijfel trek).

    Maar met pointers gaat het wel prima en is voor dit doeleinde meer dan genoeg, biedt zelfs nog wat extra mogelijkheden.
    Zolang het maar niet ten kosten van de netheid/structuur v.d. code gaat hou ik het bij deze aanpak.

  6. #6
    Klopt. De handles worden pas gemaakt als het scherm wordt getoond. Op dat moment worden alle parameters voor de handle bepaald en wordt er een window gemaakt.

    Als je de handle voor die tijd opvraagt, dan zal de VCL het maken van het window forceren, maar de kans is groot dat er dan het dan later nog een keer gebeurt.

    Daarbij worden window handles vaak gemaakt en gesloopt. Een border van een scherm veranderen kan volgens mij al zorgen voor nieuwe handles voor het form en elk wincontrol dat er op staat. Een handle opvragen en opslaan heeft dus niet zoveel nut op deze manier.

    Als je doel is om messages heen en weer te sturen, gebruik dan AllocateHWND, zodat je zelf een onzichtbare handle krijgt die goed voor dat doel geschikt is.
    1+1=b

  7. #7
    mnemonics
    Guest
    Voor het ontvangen van berichten gebruik idd AllocateHWND (zit al in de base class verwerkt), ik sla niks met handles op alleen bijv. een toegekende id aan de observer.
    Verder heb ik het een en ander al aangepast en vraag pas de handle pas op als er daadwerkelijk een messages gepost/send wordt, dat werkt nu prima.

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
  •