Einzelnen Beitrag anzeigen

supermuckl

Registriert seit: 1. Feb 2003
1.340 Beiträge
 
FreePascal / Lazarus
 
#1

Dereferenzieren in IndyDemo vergessen ?

  Alt 14. Jun 2004, 20:28
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..
Das echte Leben ist was für Leute...
... die im Internet keine Freunde finden!
  Mit Zitat antworten Zitat