Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi IdUDPServer: Problem unter Delphi 2005??? (https://www.delphipraxis.net/46632-idudpserver-problem-unter-delphi-2005-a.html)

romber 28. Mai 2005 18:42


IdUDPServer: Problem unter Delphi 2005???
 
Hallo!

Ich habe vorher Delphi 7 benutzt. So habe ich normalerweise UDP-Packete (IdUDPServer, Indy 9) empfangen:

Delphi-Quellcode:
procedure TfrmMain.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
  ABinding: TIdSocketHandle);
var
 sText: string;
begin
 AData.Position := 0;
 SetLength(sText, AData.Size);
 AData.ReadBuffer(sText[1], AData.Size);
 Memo1.Lines.Add(sText)
end;
Wenn ich diese Kode in Delphi 2005 (Indy 10) ausführen möchte, kommt die Meldung: [Fehler] Unit1.pas(59): E2003 Undefinierter Bezeichner: 'TBytes'. Die Deklaration

Delphi-Quellcode:
type TBytes = array of Byte
hat auch nichts gebracht. Den Datentyp wird zwar erkannt, aber es scheitert wieder an

Delphi-Quellcode:
ADate.Position := 0
[Fehler] Unit1.pas(881): E2018 Record, Objekt oder Klassentyp erforderlich.

Was soll das alles? Was mache ich jetzt?

Thorben77 29. Mai 2005 00:03

Re: IdUDPServer: Problem unter Delphi 2005???
 
Also bei meinen neuner Indies ist der Parameter AData im OnUDPRead-Event vom Typ TStream. (Oder haste dich nur vertippt? :stupid: :wink: )

Die Procedure müsste dann so aussehen:

Delphi-Quellcode:
procedure IdUDPServerUDPRead(Sender: TObject; AData: TStream; // <-- siehe da
  ABinding: TIdSocketHandle);
var
  Text: string;
  StrStream: TStringStream;
begin
  StrStream := TStringStream.Create('');
  try
    StrStream.CopyFrom(AData, AData.Size);
    Text := StrStream.DataString;
  finally
    StrStream.Free;
  end;
end;
Weiß aber nicht, ob sich das bei den Indys 10 geändert hat :gruebel: .


Mfg

Thorben

romber 29. Mai 2005 12:58

Re: IdUDPServer: Problem unter Delphi 2005???
 
Bei mir steht definitiv TBytes drin, wenn ich die IdUDPServerRead-Procedure erstelle. Noch Ideen, woran es liegen könnte?

romber 30. Mai 2005 08:31

Re: IdUDPServer: Problem unter Delphi 2005???
 
Habe nur ich so was oder wie? Hatte niemand das Problem auch? Kann mir niemand halfen?

Brisi 31. Mai 2005 21:13

Re: IdUDPServer: Problem unter Delphi 2005???
 
nein dieses problem dürfte anscheinend seit indy 10 bestehen

in deren hilfe steht noch TStream und im Sourcecode der indy files steht das mit TidBytes (definiert auf TBytes) drinnen!

ich bin ja eher der praktische programmierer ... ehemals ansi-c auf einem digital unix server ;_)

daher mein 2minuten lösungsansatz und beispiel (verbesserungswürdig aber es geht):

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, StdCtrls, [b]idGlobal, idSocketHandle[/b], IdUDPClient;

// in the idGlobal is das TBytes definiert
// in der idSocketHandle das TidSocketHandle

type
  TForm1 = class(TForm)
    IdUDPServer1: TIdUDPServer;
    Memo1: TMemo;
    Edit1: TEdit;
    Button1: TButton;
    IdUDPClient1: TIdUDPClient;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
  ABinding: TIdSocketHandle);
var sText : String;
begin
  // dirty but working for wordfiles too ;_)
  sText := String(AData);
  Memo1.Lines.Add(sText);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdUDPClient1.Active := false;
  IdUDPClient1.Active := true;
  IdUDPClient1.Broadcast(Edit1.Text, 7080);
end;

end.
[edit=alcaeus]Delphi-Tags eingefuegt. Beim naechsten Mal bitte selbst machen, danke :) Mfg, alcaeus[/edit]

romber 1. Jun 2005 21:26

Re: IdUDPServer: Problem unter Delphi 2005???
 
So, ich habe gerade eine UDP-Demo (Indy 10) von Indy-Seite heruntergeladen.
Man fügt IdGlobal, IdSocketHandle dem Uses-Abschnitt hinzu, dann in OnUDPServerRead mit

Delphi-Quellcode:
BytesToString(AData)
die TBytes einfach in String konvertieren. Die Funktion BytesToString ist im Unit "IdGlobal" definiert.

Somit ist das Problem gelöst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr.

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