Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 535

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Я пишу программу для общения в сети.
У меня 2 вопроса по моей программе.
1. Когда я отправляю написанный текст на другой компьютер в сети, то этот текст доходит до адресата. Когда 2-й раз отправляю текст на этот же компьютер или уже другой, то у меня выскакивает ошибка. Описание данной ошибки: Project mess.exe raised exception class EidClosedSocket with message 'Disconnected'. Process stoped. Use step or run to continue. Как избавиться от этой ошибки?
2. Подскажите как передать имя компьютера, на другой компьютер при передаче сообщения. За ранее буду благодарен.

Приложение:
  1. unit mes;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. IdIrcServer,IdIRC, Sockets, WinSock, IdTCPClient, IdTCPServer, StdCtrls,
  8. IdBaseComponent, IdComponent, IdTCPConnection;
  9. type
  10. TForm1 = class(TForm)
  11. Edit1: TEdit;
  12. Edit2: TEdit;
  13. Button1: TButton;
  14. Label1: TLabel;
  15. Label2: TLabel;
  16. Label3: TLabel;
  17. ComboBox1: TComboBox;
  18. Memo1: TMemo;
  19. IdIRC1: TIdIRC;
  20. IdIRCServer1: TIdIRCServer;
  21. procedure FormCreate(Sender: TObject);
  22. procedure Button1Click(Sender: TObject);
  23. procedure ComboBox1Click(Sender: TObject);
  24. procedure IdIRCServer1CommandAway(Thread: TIdPeerThread; Parm: String);
  25. procedure Edit1KeyPress(Sender: TObject; var Key: Char);
  26. private
  27. { Private declarations }
  28. public
  29. { Public declarations }
  30. end;
  31.  
  32. var
  33. Form1: TForm1;
  34. wVerReq: WORD;
  35. wsaData: TWSAData;
  36. i: pchar;
  37. h: PHostEnt;
  38. c: array[0..128] of char;
  39. a: string;
  40. q: integer;
  41. mem:string;
  42. implementation
  43.  
  44. {$R *.dfm}
  45.  
  46.  
  47. procedure TForm1.FormCreate(Sender: TObject);
  48. begin
  49. wVerReq := MAKEWORD(1, 1);
  50. WSAStartup(wVerReq, wsaData);
  51. //Ïîëó÷åíèå õîñò êîìïà
  52. GetHostName(@c, 128);
  53. h := GetHostByName(@c);
  54. a := h^.h_Name;
  55. i := iNet_ntoa(PInAddr(h^.h_addr_list^)^);
  56. Edit2.Text:=i;
  57. WSACleanup;
  58. Form1.ComboBox1.Text:=Form1.ComboBox1.Items[0];
  59. end;
  60.  
  61. procedure TForm1.Button1Click(Sender: TObject);
  62. begin
  63. Form1.IdIRC1.Connect;
  64. mem:=Edit1.Text;
  65. Memo1.Lines.Add(''+Edit1.Text);
  66. Form1.IdIRC1.SetAwayMessage(Edit1.Text);
  67. Form1.IdIRC1.Disconnect;
  68. Edit1.Clear;
  69. end;
  70.  
  71. procedure TForm1.ComboBox1Click(Sender: TObject);
  72. begin
  73. Form1.IdIRC1.Host:=Form1.ComboBox1.Text;
  74. end;
  75.  
  76. procedure TForm1.IdIRCServer1CommandAway(Thread: TIdPeerThread;
  77. Parm: String);
  78. begin
  79. Memo1.Lines.Add('Ïîëó÷åíî ñîîáùåíèå:' +Parm);
  80. Memo1.Font.Color:=clblue;
  81. end;
  82.  
  83. procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
  84. begin
  85. if Key=#13 then
  86. Form1.Button1.Click;
  87. end;
  88.  
  89. end.


Курцетов И.А. Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Курцетов И.А. (статус: Посетитель)
Вопрос отправлен: 27 апреля 2007, 08:18
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Denisss

Судя по описанию Indy, Вам следует проверять на подключенность к серверу IRC, прежде чем делать какие-либо действия (см. приложение).

PS
Приложение, конечно, не оч., но показывает принцип действия.

PPS
Как вариант, все это можно заменить на try .. except, но лучше все же проверять наличие соединения.
Еще как один вариант, можно вставить код

mem:=Edit1.Text;
Memo1.Lines.Add(''+Edit1.Text);
Form1.IdIRC1.SetAwayMessage(Edit1.Text);
Form1.IdIRC1.Disconnect;
Edit1.Clear;

в событие OnConnect, тогда проверок на соединение делать не обязательно.

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. begin
  3. with Form1.IdIRC1 do
  4. begin
  5.  
  6.  
  7. if not Connected then
  8. Connect;
  9. mem:= Edit1.Text;
  10. Memo1.Lines.Add(mem);
  11.  
  12.  
  13.  
  14. if Connected then
  15. begin
  16. SetAwayMessage(mem);
  17. Disconnect;
  18. Edit1.Clear;
  19. end // if
  20.  
  21.  
  22. else
  23.  
  24.  
  25.  
  26.  
  27.  
  28. end; // with
  29. end;


Ответ отправил: Denisss (статус: 2-ой класс)
Время отправки: 27 апреля 2007, 15:24
Оценка за ответ: 4

Комментарий к оценке: Спасибо, заработало только в событии OnConnect, а по написанному вами коду, почему то не хочет совершать соединение.

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:49
Выполнено за 0.03 сек.