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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 063

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

Приветствую, уважаемые эксперты!
Есть код с использованием формы и IdTCPServer, как татой код можно реализовать без формы?

Приложение:
  1. procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
  2. var
  3. stream: TFileStream;
  4. kod: string;
  5. begin
  6.  
  7. kod:=AContext.Connection.Socket.ReadLn;
  8.  
  9. if kod='666' then
  10. begin
  11. AContext.Connection.Socket.WriteLn('6661');
  12. AContext.Connection.Disconnect;
  13. end;
  14.  
  15. if kod='999' then
  16. begin
  17.  
  18. stream := TFileStream.Create('C:1.reg',fmOpenRead );
  19. AContext.Connection.Socket.Write(stream,0,True);
  20. AContext.Connection.Disconnect;
  21. stream.Free;
  22. end;
  23. end;


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

Вопрос задал: gm44 (статус: Посетитель)
Вопрос отправлен: 19 апреля 2010, 16:39
Состояние вопроса: открыт, ответов: 0.


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

Всего сообщений: 16; последнее сообщение — 20 апреля 2010, 13:56; участников в обсуждении: 2.
Вадим К

Вадим К (статус: Академик), 19 апреля 2010, 17:14 [#1]:

Создать TIdTcpServer динамически? и прицепить один обработчик?
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 19 апреля 2010, 17:16 [#2]:

Да именно это мне и нужно!
gm44

gm44 (статус: Посетитель), 19 апреля 2010, 17:17 [#3]:

Вопрос в том как это сделать.?
Вадим К

Вадим К (статус: Академик), 19 апреля 2010, 17:28 [#4]:

по моему, это же классика.
h:TIdTCPThread;
...
h := TIdTCPThread.Create(nil);
h.OnExecute := IdTCPServer1Execute;

и это вочти все.
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 19 апреля 2010, 17:39 [#5]:

А можно по конкретней или примерчик можно? А то я не сталкивался с создадаием обработчиков к динамическим
gm44

gm44 (статус: Посетитель), 19 апреля 2010, 17:41 [#6]:

Очень нужно...
Вадим К

Вадим К (статус: Академик), 19 апреля 2010, 17:43 [#7]:

гугл дает тоны кода.
искать по пример кнопки и OnClick
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 19 апреля 2010, 18:04 [#8]:

Погуглил про создание TIdTcpServer динамически, там одни вопросы без ответов. Как создать знают а как сделать к нему обработчик не чего вразумительного не отвечают.
Вадим К

Вадим К (статус: Академик), 19 апреля 2010, 18:10 [#9]:

я же написал, гуглить как создать обоработчик для кнопки, а там по аналогии.
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 20 апреля 2010, 12:57 [#10]:

Вадим К, посмотри пожалуйста, что я делаю не так?
Компилятор ругается на строку
procedure IdTCPServer1Execute(AContext: TIdContext);
пишет Unsatisfied forward or external declaration: 'TTCPServer.IdTCPServer1Execute'

 type
  TTCPServer = class
  private
    IdTCPServer: TIdTCPServer;
    procedure IdTCPServer1Execute(AContext: TIdContext);
  protected
 
  public
    constructor Create; reintroduce;
    destructor Destroy; override;
  end;
 
constructor TTCPServer.Create;
begin
IdTCPServer := TIdTCPServer.create( nil ) ;
IdTCPServer.DefaultPort:=6001;
IdTCPServer.ListenQueue:=15;
IdTCPServer.MaxConnections:=0;
IdTCPServer.TerminateWaitTime:=5000;
IdTCPServer.OnExecute:=IdTCPServer1Execute;
IdTCPServer.Active:=true;
end;
 
procedure IdTCPServerExecute(AContext: TIdContext);
begin
.........
end;
 
destructor TTCPServer.Destroy;
begin
  IdTCPServer.free;
  inherited destroy;
end;
 
begin
TTCPServer.Create;
end;
Вадим К

Вадим К (статус: Академик), 20 апреля 2010, 13:09 [#11]:

Если бы создавали автоматом (Нажав Ctrl+Shift+C на определении класса), то сразу поняли ошибку.
вместо
procedure IdTCPServerExecute(AContext: TIdContext);
begin
.........
end;
надо писать
procedure TTCPServer.IdTCPServerExecute(AContext: TIdContext);
begin
.........
end;
Чувствуется?
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 20 апреля 2010, 13:29 [#12]:

Спасибо!
Вадим К

Вадим К (статус: Академик), 20 апреля 2010, 13:32 [#13]:

правда, судя по коду, программа работать не будет:) она будет сразу закрываться.
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 20 апреля 2010, 13:43 [#14]:

Будет - будет, ни куда не денится :-)
просто я не весь код написал, чтоб не загромождать...
Там еще присутствует :
var
msg: TMsg;
begin
TTCPServer.Create;
while (GetMessage(msg, 0, 0, 0)) do
begin
translatemessage (msg) ;
dispatchmessage (msg);
end;
Вадим К

Вадим К (статус: Академик), 20 апреля 2010, 13:49 [#15]:

строка
TTCPServer.Create;
сама по себе тоже плохо. Деструктор автоматом не будет вызван. Это не с++/java.

Второе, а зачем приложение, которое работает в фоне, обработка сообщений, которые ему и так не придут?

Я бы вставил туда ожидание мютекса, который создается и захватывается в конструкторе TTCPServer. А освобождается, когда TTCPServer решит, что хватит, отработал (например, он может получить специальную команду по TCP).
Галочка "подтверждения прочтения" - вселенское зло.
gm44

gm44 (статус: Посетитель), 20 апреля 2010, 13:56 [#16]:

Тоже хороший вариант, только придется с кодом не много пошаманить.

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

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