Przesyłanie rekordów

0

Witam,

W programie uzywam komponentow TClientSocket i TServerSocket. Podczas odbierania rekordow wyslanych przez klienta na serwer, probuje je dodac do Memo1, ale wyswietla sie blad po stronie serwera (Accer violation)

Kod klienta

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ClientSocket1: TClientSocket;
    btnPolacz: TButton;
    btnWyslij: TButton;
    Label1: TLabel;
    procedure btnPolaczClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnWyslijClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
   TMojRekord = record
      msg: String;
   end;
var
MojRekord:TMojRekord;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnPolaczClick(Sender: TObject);
begin
ClientSocket1.Active:=true;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
MojRekord.msg:='Jakas tam tresc';
Label1.Caption:=MojRekord.msg;
end;

procedure TForm1.btnWyslijClick(Sender: TObject);
begin
ClientSocket1.Socket.SendBuf(MojRekord,SizeOf(MojRekord));
end;

end.
 

i kod serwera:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls;

type
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
   TMojRekord = record
      msg: String;
   end;
var
MojRekord:TMojRekord;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
Socket.ReceiveBuf(MojRekord, SizeOf(MojRekord));
Memo1.Lines.Add(MojRekord.msg);
end;

end.

Jezeli ktos wie co zrobilem zle to prosze o pomoc.

0

Sprawdź sobie co Ci zwróci SizeOf(MójRekord) - niezależnie co do niego zapiszesz, będą to 4 bajty, gdyż String w rzeczywistości jest wskaźnikiem.

Możesz albo zadeklarować rozmiar Stringa na sztywno (np String[25]) albo każdorazowo przed wysłaniem rekordu wysyłać info o rozmiarze wysyłanych danych, aby serwer wiedział ile ma odebrać.

0

Wielkie dzieki... pomoglo [browar] Ustawilem strnga na sztywno no i teraz si normalnie dodaje do Memo i nie ma bledu ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1