Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi fehler globale variable/lokale variable (https://www.delphipraxis.net/122298-fehler-globale-variable-lokale-variable.html)

ToXiC 13. Okt 2008 14:29


fehler globale variable/lokale variable
 
ich habe folgendes problem:
ich habe den unten beigelegten code aus dem netz & habe ihn leicht abgeändert.
nun wollte ich die globalen variablen lokalisieren, da sie nur ein einer einzige proceudre verwendet werden.
das programm lässt sich ohne weiteres kompilieren, spuckt jedoch nach abshcluss der kompilierung eine fehlermeldung der form aus:

http://img3.imagebanana.com/img/bhd7...humb/error.PNG

sinnlose zeichenketten.
sobald man ok bestätigt folgt eine weitere solche fehlermeldung, was sich entlos fortsetzt.

eigentlich ist es nicht relevant, ob die die variablen letztendlich global oder lokal anlege, doch ich würds schon gern verstehn^^.



Delphi-Quellcode:
unit Unit1;
...
  private
  Reciving: boolean;
  DataSize: integer;
  Data: TMemoryStream;
...


procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  s, sl: string;
  TmpJpg : TJPEGImage;
begin
  s:= Socket.ReceiveText;
  TmpJpg := TJPEGImage.Create;
  if not Reciving then
  begin
    SetLength(sl, StrLen(PChar(s))+1); // +1 for the null terminator
    StrLCopy(@sl[1], PChar(s), Length(sl)-1);
    DataSize:= StrToInt(sl);
    Data:= TMemoryStream.Create;
    Delete(s, 1, Length(sl));
    Reciving:= true;
  end;
  try
    Data.Write(s[1], length(s));
    if Data.Size = DataSize then
    begin
      Data.Position:= 0;
      TmpJpg.LoadFromStream(Data);
      Image2.Picture.Assign(TmpJpg);
      Data.Free;
      TmpJpg.Free;
      Reciving:= false;
      Socket.Close;
    end;
  except
    Data.Free;
    TmpJpg.Free;
  end;
end;

shmia 13. Okt 2008 16:22

Re: fehler globale variable/lokale variable
 
Die gezeigten Variablen dürfen nicht lokal für die Methode ClientSocket1Read sein, da sie ihren Wert nicht verlieren dürfen.
ClientSocket1Read wird nicht nur einmal sondern unter Umständen mehrmals ausgerufen.
Grund: die Daten können in mehrere Netzwerkpaketen verpackt sein -> mehrere Aufrufe.
Ob die ganzen Daten in einem Rutsch oder verteilt auf mehrere Pakete kommen, darauf hast du keinen Einfluss, denn das regelt Windows und auch der Datensender.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 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