Avatar billede kokoko Nybegynder
18. april 2001 - 23:48 Der er 7 kommentarer og
1 løsning

Destroy objekt ved event...

først lige et lille uddrag af min kode:

  TDCC = class(TComponent)
  private
    FSocket: TServerSocket;
    procedure DoClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
  end;

..

constructor TDCC.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FSocket    := TServerSocket.Create(Self);
  with FSocket do
    begin
      OnClientConnect:=DoClientConnect;
      OnClientError:=DoClientError;
      OnClientRead:=DoClientRead;
      OnClientDisconnect:=DoClientDisconnect;
    end;
  ...
end;

destructor TDCC.Destroy;
begin
  FSocket.Free;
  inherited Destroy;
end;

procedure TDCC.DoClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin

end;

Mit problem er altså at jeg vil have TDCC objektet destroyed ved OnClientDisconnect eventen... jeg synes jeg har prøvet alt muligt, men det er endnu ikke lykkedes.. nogen forslag?
Avatar billede nico26 Nybegynder
19. april 2001 - 03:09 #1
Fra delphis hjælp

You should never explicitly free a component within one of its own event handlers, nor should you free a component from an event handler of a component the component owns or contains. For example, you should avoid freeing a button in its OnClick event handler. Nor should you free the form that owns the button from the button\'s OnClick event.
Avatar billede pellelil Nybegynder
19. april 2001 - 09:23 #2
Send evt. din egen meddelelse til den Form der ejer componentet, og lad så denne free\'e den:

Nedenstående viser hvordan du tilføjer \"din egen meddelelse\" til en class (husk:  \"USES MESSAGES\"):
<SNIP>
const
  WM_DisconnectClient := WM_User + 1;

type
  TEnEllerAndenForm = Class(TForm)
  //...
    public
    Procedure WMDisconnectClient(var Msg: TMessage); message WM_DisconnectClient;
  end;

//...
Procedure TEnEllerAndenForm .WMDisconnectClient(var Msg: TMessage);
var
  DCC : TDCC; 
begin
  DCC := TDCC(Msg.WParam);
  if DCC <> Nil then DCC.Free;
end;
<SNIP>

Når du så vil free\'e din client evt. i din DoClientDisconenct så kunne du skrive flg:
<SNIP>
procedure TDCC.DoClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  PostMessage(EnEllerAndenForm.Handle, WMDisconnectClient, LongInt(self), 0);
end;
</SNIP>

Som alternativ til PostMessage findes der også en der hedder SendMessage. Forskellen ligger i at PostMessage blot placere meddelelsen i meddelelses køen hvorefter programmet forsætter, hvor imod SendMessage ikke fortsætter før meddelelsen er udført. I dit tilfælde SKAL du bruge PostMessage da du netop IKKE må dispose dit object før du har afsluttet den meddelelse du p.t. er ved at udføre (nemlig din DoClientDisconnect).
Avatar billede martinlind Nybegynder
19. april 2001 - 10:05 #3
Hvis du bruger NetMasters comp. så skynd dig at skift til INDY, det er meget bedre comp. og med source. www.delphi-jedi.org

/Martin
Avatar billede kokoko Nybegynder
19. april 2001 - 12:48 #4
Pellelil: Jeg kan ikke bare bruge EnEllerAndenForm.Handle som første parameter i Postmessage så kommer der en fejl..

Jeg mener dog der er en eller anden function som kan give mig formens handle.. noget du kan hjælpe med?

på forhånd tak!
Avatar billede pellelil Nybegynder
19. april 2001 - 13:26 #5
Jeg ved ikke hvilke forms du har i dit program. Du skal således sende meddelelsen \"med PostMessage\" til \"EN ELLER ANDEN FORM\" som du har, og det er denne form der så skal være i stand til at behande meddelelsen. Jeg viste blot et eksempel på hvordan det kunne gøres (i så fald du havde haft en der hed TEnEllerAndenForm)
Avatar billede kokoko Nybegynder
19. april 2001 - 14:13 #6
jeps ved ved jeg... jeg tror også det virker.. bortset fra at jeg ikke bare kan skrive f.eks. EnEllerAndenForm.Handle som første parameter i PostMessage for så kommer delphi med en fejl..

mit problem er altså at jeg skal finde den forms handle på en anden måde? .. jeg mener der er en eller anden function til dette?
Avatar billede pellelil Nybegynder
19. april 2001 - 14:16 #7
Du skal naturligvis have en variable der peger på din form.
Avatar billede delphi Nybegynder
19. april 2001 - 16:11 #8
Standard formen i et nyt Delphi program hedder Form1.
I eksemplet skal du så skrive (hvis du altså vil lukke Form1) Form1.Handle

Alle Delphi forms har deres handle som property\'en \'Handle\'.  Du skal således ikke ned i noget API snavs (ud over altså PostMessage i sig selv) for at finde en funktion der giver dig din handle.

I dit eksempel ser det ud til at du vil lukke en form af typen TDCC.  Din form hedder således (sandsynligvis) \'DCC\'.

Håber det hjalp

Peter
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester