Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dereferenzieren in IndyDemo vergessen ? (https://www.delphipraxis.net/24053-dereferenzieren-indydemo-vergessen.html)

supermuckl 14. Jun 2004 19:28


Dereferenzieren in IndyDemo vergessen ?
 
hi
bin gerade am netzwerk coden und hab nun eine frage

hab n tut wo pointer erklärt werden und da steht das man die pointer dereferenzieren muss.. also mit ^ am ende des pointers
bevor man dem was zuweisen kann oder auslesen kann..
es steht auch drin das delphi das auch ohne ^ kann aber wieso steht das dann so im tut drin? ( also mit ^ )

tutcode:

Delphi-Quellcode:
  GetMem(FormP, SizeOf(TMultipleForm)); { --> reserviert an der Adresse von FormP den Speicher für die Form}
  FormP^ := TMultipleForm.Create(Self); // --> erzeugt die Form
  FormP^.Caption := FormP^.Caption + IntToStr(Liste.Items.Count + 1);
  FormP^.Label1.Caption := LabelText.Text;
  FormP^.OnHide := ListeClick; { --> beim verstecken des Fensters muss ja die Button-Aufschrift aktualisiert werden...}
  FormListe.Add(FormP); // --> fügt den Pointer zur Liste hinzu
  Liste.Items.Add('Form' + IntToStr(Liste.Items.Count + 1));
in den indy demos ( tcpserver ) sieht das onConnect so aus:

Delphi-Quellcode:
procedure TServerFrmMain.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;

begin
  GetMem(NewClient, SizeOf(TClient));

  NewClient.DNS        := AThread.Connection.LocalName; // wieso nicht NewClient^.DNS := ... ??
  NewClient.Connected  := Now;
  NewClient.LastAction := NewClient.Connected;
  NewClient.Thread     :=AThread;

  AThread.Data:=TObject(NewClient);

  try
    Clients.LockList.Add(NewClient);
  finally
    Clients.UnlockList;
  end;

  Protocol.Lines.Add(TimeToStr(Time)+' Connection from "'+NewClient.DNS+'"');
end;
wieso wird bei der delphi demo auf die dereferenzierungs zeichen verzichtet ? der code funzt ja.. ist es echt so das das delphi automatisch dereferenziert ? weil wie oben zu sehen in dem tut ist es ja explizit "manuell" dereferenziert worden o_O

die 2. frage ist.. wieso krieg ich bei der ersten zeile code ( newclient.dns ... ) einen error ( speicherzugriff ) wenn ich GetMem verwende und wenn ich New(newclient) verwende funzt es einwandfrei ? ( wenn ich bei getmem einen breakpoint setze und dem ding ein wenig zeit gebe dann tut es aber auch mit getmem !! ??? )

komische sache..

Luckie 14. Jun 2004 19:33

Re: Dereferenzieren in IndyDemo vergessen ?
 
Es ist eben optional. Delphi weiß, was du vor hast und kompiliert entsprechend.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz