Kod z kompendium dotyczący INDY i UDP – kompiluje się, ale działa nieprawidłowo

Odpowiedz Nowy wątek
2018-12-12 23:16
0

Męczę się nad przykładem: INDY

wszystko się ładnie kompiluje i uruchamia ale w memo1 nie pojawiają się wpisane dane w edit1.
Czy ktoś sprawdzał ten kod u siebie ?

edytowany 1x, ostatnio: furious programming, 2018-12-13 01:09

Pozostało 580 znaków

2018-12-13 00:21
0

kodu nie sprawdzałem, może zapora blokuje transmisję danych

EDT
teraz widzę że w przykładzie wszystko chodzi na 'localhoscie' więc to pewnie nie zapora

edytowany 2x, ostatnio: grzegorz_so, 2018-12-13 00:24

Pozostało 580 znaków

2018-12-13 05:36
0

No raczej nie zapora ale coś windows jdnak krzyknął i trzeba było zezwolić na dostęp ale jednak nie działa. Możliwe że jeszcze trzeba ustawić/przestawić jakieś właściwości dla obiektów clienta i serwera?

Pozostało 580 znaków

2018-12-13 08:29
1

żeby mieć pewność, że to nic związanego z danym kompem/systemem - wklej jako załącznik do posta wersję EXE, odpalimy u nas i zobaczymy, jak się aplikacja zachowuje. Powinno rzucić to jakieś nowe światło na temat ;)


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2018-12-13 09:10
0

OK teraz nie mam komputera z delphi, wieczorem dopiero będę mógł to zrobić ale sprawdzałem na innym kompie i też nie działało.

Pozostało 580 znaków

2018-12-13 10:05
1

Dobra, zrobiłem u siebie małe testy i ... u mnie działa :D

Pierwsza sprawa - jakiej wersji Delphi oraz Indy używasz? Bo u mnie (Delphi 10.2 Tokyo oraz Lazarus 1.8.4) parametry zdarzenia OnUDPRead są inne, niż w podanym przykładzie. Co zresztą nie jest dziwne, bo podany tutorial jest sprzed 13 lat...

Jak podeślesz wieczorem EXE'ka to będę mógł sprawdzić, czy Twoja wersja u mnie czy działa.

Podczas testów musiałem wyłączyć antyvira i firewalla, bo co chwila narzekały, po pozwoleniu na działanie apka śmigała, aczkolwiek 2 razy miałem totalne zwiechy systemu, które się skończyły hard-resetem. Nie wiem z czego to wynikało, aczkolwiek wczoraj wieczorem Win10 mi się zaktualizował do nowej wersji i może to mieć jakiś związek... Na ogół jest tak, że jak wyłączając system mam komunikat o aktualizacji, to następnego dnia czeka na mnie kilka niespodzianek...

Poniższy kod u mnie działa bezproblemowo. Jak pewnie zauważyłeś - inaczej wygląda obsługa OnUDPRead - została dostosowana do aktualnej wersji Indy. Nie pamiętam szczegółów, ale chyba przesiadka z wersji 9 na 10 INDY to była mała rewolucja, a kod podany w przykładzie jest raczej pisany zgodnie ze starym standardem.

Zauważ też, że procedura do zdarzenia OnStatus nie zostaje wywołana. Szczerze mówiąc nie chce mi się teraz tematu zgłębiać, póki co można to wywalić, aplikacja działa tak, jak sobie życzyłeś :) Kompiluje się zarówno na Delphi, jak i na Lazarusie.

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, IdUDPServer, IdBaseComponent,
  IdComponent, IdUDPBase, IdUDPClient, Vcl.StdCtrls, IdGlobal, IdSocketHandle;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Button1: TButton;
    IdUDPClient1: TIdUDPClient;
    IdUDPServer1: TIdUDPServer;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure IdUDPServer1Status(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: string);
    procedure IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  IdUDPClient1.Host := '127.0.0.1';
  IdUDPClient1.Send(Edit1.Text);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit1.Clear;
  Memo1.Clear;
  IdUDPClient1.Port := 36000;
  IdUDPServer1.DefaultPort := 36000;
  IdUDPServer1.Active := true;
end;

procedure TForm1.IdUDPServer1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: string);
begin
  Memo1.Lines.Add(AStatusText);
  showmessage('status');
end;

procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
  const AData: TIdBytes; ABinding: TIdSocketHandle);
var
  sText: string;
begin
  Memo1.Lines.Add(ABinding.PeerIP);
  SetString(Stext, PAnsiChar(@AData[0]), Length(AData));
  Form1.Memo1.Lines.Add(sText);
end;

end.

That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 4x, ostatnio: cerrato, 2018-12-13 10:37

Pozostało 580 znaków

2018-12-13 10:41
1

Żeby nie robić zamieszania, dodałem "moje" wersje EXE w osobnym poście.
Weź odpal je u siebie i sprawdź, czy działają. Jak pisałem wcześniej - sprawdzone, u mnie obie działają na 100%. Jeśli u Ciebie nie pójdą, to znaczy, że wina leży po stronie systemu, a nie samej aplikacji.


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say
edytowany 1x, ostatnio: cerrato, 2018-12-13 10:42

Pozostało 580 znaków

2018-12-13 12:21
1

No to uruchomiłem ten exe i wszystko działa, moj nie działa niestety czyli coś mam nie tak. Inaczej też na ten program reaguje windows w moim wyskoczyło tylko jedno okno a w tym dwa.

Pozostało 580 znaków

2018-12-13 12:23
1

Za bardzo nie rozumiem co oznacza, że wyskoczyło jedno albo dwa okna, ale podejrzewam, że chodzi o jakieś komunikaty z firewalla/antywirusa. Być może w jednym przypadku wyskoczył tylko windowsowy wbudowany firewall, a w drugim masz jeszcze jakieś dodatkowe narzędzie pilnujące porządku w systemie.
W każdym razie - skoro działa, to sprawdź jeszcze w domu, a następnie postaraj się skompilować u siebie kod, który wkleiłem chwilę wcześniej. Zobaczymy, co z tego wyniknie :D


That game of life is hard to play
I'm gonna lose it anyway
The losing card I'll someday lay
So this is all I have to say

Pozostało 580 znaków

2018-12-13 12:39
0

No muszę jeszcze raz przepatrzeć wszystko może to tylko jakaś drobnostka jest. Tylko nie widzę pliku źródłowego żeby porównać.

Pozostało 580 znaków

2018-12-13 13:20
4

Może głupie pytanie ale były na tym forum takie przypadki więc zapytam. Kod skopiowałeś z tego przykładu czy wpisałeś do odpowiednich zdarzeń? Bo jeśli jest kod zdarzenia bez podpięcia w komponencie to nie ma prawa zadziałać.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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