Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сервер и форма


Purgen ©   (2006-03-02 22:23:00) 

Добрый вечер!!!

procedure TForm1.TCPServerExecute(AThread: TIdPeerThread);
var
 str:SArray;
 cd:TCopyDataStruct;
 index,i:integer;
 tempform:TForm2;
begin
 split(str,AThread.Connection.ReadLn(),'|');
 index:=-1;
  tempform:=TForm2.Create(nil);
 for i:=0 to 255 do
   if connectlist[i]<>nil then
     if connectlist[i].ip=str[0] then
       index:=i;
 if index<0 then begin
    tempform.Show;
   end
 else begin
   cd.lpData:=PChar(str[1]+'|'+str[2]+'|'+str[3]);
   cd.cbData:=length(str[1]+'|'+str[2]+'|'+str[3])+1;
   sendmessage(connectlist[index].handle,WM_COPYDATA,0,LParam(@cd));
   SetActiveWindow(connectlist[index].handle);
 end;
end;


Это "кусок" сетевого чата:
короче при получении сообщения должна создаться форма для разговора (Класс TForm2). Почему-то именно в ЭТОМ обработчике событий она не создается. Появляются очертания окошка и все виснет...Если просто кнопку сделать, в обработчике onClick то тоже самое будет превосходно выполнятся!!! Спрашивается можно ли вообще в обработчике OnExecute сервера IdTCPServer (от Indy) создать эту форму???


Purgen   (2006-03-03 08:13:00) [1]

Спасибо...Че нить-то придумаем...


Джо   (2006-03-03 02:31:00) [2]

> [4] Eraser ©   (03.03.06 01:59)
> в 9 версии в TIdPeerThread присутствует метод Synchronize
> :-)
> а вот в 10 от потоков, якобы, ушли ... там надо извращаться
> )

Не в курсе был насчет этого, спасибо.
---

2 Purgen  
А, вообще-то, можно и так: посылать из OnExecute заранее известное сообщение (SendMessage) свой форме (на которой находится TCPServer), а в обработчике этого сообщения уже и выполнять создание другой формы. Но лучше все-таки синхронизировать в доп. потоке, кажется. И разберись с тем, что сказал [4] Eraser, согласуй это со своей версией Indy.


Eraser   (2006-03-03 01:59:00) [3]


> Джо ©   (02.03.06 22:50) [1]

в 9 версии в TIdPeerThread присутствует метод Synchronize :-)
а вот в 10 от потоков, якобы, ушли ... там надо извращаться )


Джо   (2006-03-02 23:37:00) [4]

> [2] Purgen   (02.03.06 23:04)
> А как тодыть мне осуществить задуманное???

Да как-нибудь извратиться :)
Например, в OnExecute создавать и запускать специальный поток (наследник TThread), задача которого — в собственном методе создавать форму, причем метод этот вызывать из Synchronize.
---
Встречный вопрос: а при чем здесь конференция "WinAPI"?


Purgen   (2006-03-02 23:04:00) [5]

А как тодыть мне осуществить задуманное???


Джо   (2006-03-02 22:50:00) [6]

> Спрашивается можно ли вообще в обработчике OnExecute сервера
> IdTCPServer (от Indy) создать эту форму???

Не желательно :0) OnExecute выполняется НЕ в основном потоке, синхронизация с основным потоком в нем НЕ производится.


Наверх

Титульная страница Поиск, карта сайта Написать письмо