Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.25;
Скачать: CL | DM;

Вниз

Как обрабатывать сообщения в КОЛ проге, если она без формы.   Найти похожие ветки 

 
nester ©   (2004-02-26 02:22) [0]

Написал прогу, в которой нет формы, просто тупо последовательность комманд. Использую в проге KOLHTTPPROT - это ICSсовская компонента адаптированая под кол. В ней таймаут работает через посылку сообщений(POSTMESSAGE) иза того что у меня нет формы - сообщения не обрабатываются и естественно таймаут никогда не наступает а прога проста подвисает. Подскажите как сделать чтобы сообщения обрабатывались


 
mdw ©   (2004-02-26 10:30) [1]

А создай Applet-тоже окно и запусти его. Вот и будет цикл обработки обработки собщений.


 
SPeller ©   (2004-02-26 11:29) [2]

Можно создать любое невидимое окно только лишь для приёма и обработки сообщений. _NewControl без родителя - и вперёд.


 
nester ©   (2004-02-26 13:16) [3]

Не, товарищи, ну мы же программисты, ну зачем мне форма если она мне не нужна? а делаю я так уже:
 Applet:= NewApplet("f");
 Th:= NewThread;
 Th.OnExecute:= TOnThreadExecute(MakeMethod(nil, @ThExecute));
 Th.Resume;
 while true do
 begin
   Applet.ProcessMessages;
   sleep(10);
 end;
Не помогает


 
savva ©   (2004-02-26 13:30) [4]

а Run(Applet) кто делать будет? И к тому же я че то не наблюдаю где же ты все таки обрабатываешь сообщения?
Назначь обработчик сообщений

applet.OnMessage:=TOnMessage(MakeMethod(nil,@ProcessMesages)); // назначаем новый обработчик сообщений

и потом лови их
// обработка сообщений
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
   case Msg.message of
    WM_<что-то твое> : begin
       ShowMessage("Неужели работает??!!");
     end;
   end;
 result:=false;
end;


и наслаждайся.


 
nester ©   (2004-02-26 13:36) [5]

а-а-а-а-а-а, даже так?
Мне нужно чтобы были обработчики по умолчанию которые.
Лично обрабатывать мне не надо, нужно просто чтобы срабатывали основные. Я вот и думал что Applet.ProcessMessages этим и займется в цикле. SAVVA в вашем примере тогда похоже мне нужно сделать
Либо
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
result:=true;
end;
или
function ProcessMesages(Dummy : pointer; var Msg: TMsg; var Rslt: Integer ): Boolean;
begin
inherited true;
end;

Какой из этих способов сработает чтобы обработчики по умолчанию вызывались?
Заранее благадарю


 
savva ©   (2004-02-26 13:53) [6]

Только вся беда в том, что после Run(Applet) начинается обработчик сообщений по умолчанию (то бишь больше ни одной строки из твоего кода, стоящего после Run не будет выполнено до закрытия аплета). Вывод напрашивается сам собой: организовать альтернативную обработку сообщений, дабы стартовать свою работу. Что собственно и было показано в предыдущем примере.

ЗЫ. По поводу твоего result:=true; см. http://kol.mastak.ru/FAQ.htm#1


 
nester ©   (2004-02-26 14:01) [7]

Сорри, я наверно не привел весь код, поэтому не понятно.

 Applet:= NewApplet("f");
 Th:= NewThread;
 Th.OnExecute:= TOnThreadExecute(MakeMethod(nil, @ThExecute));
 Th.Resume;
 Run(applet);

Собсна мой треад в начале запустился и работает, а потом я только запускаю аплет, так вот не работает.
Щас попробую applet.OnMessage присвоит с result:= false;
Но блин мне казалось, что если OnMessage не перекрывать - то обработчики сами собой вызовуться по умолчанию


 
nester ©   (2004-02-26 14:03) [8]

Да, в треде я создаю экземплаяр PHTTPProt.
Так вот он там когда наступает таймаут - посылает сам себе сообщение и выходит из цикла, так вот сообщение до него не доходит в таком варианте, если делать все нормально с формой, то работает, но блин, нафиг мне форма то?


 
savva ©   (2004-02-26 14:07) [9]

ты бы весь код сюда привел - было б понятнее

> нафиг мне форма то?

Для обработки сообщений:) Отнесись к этому философски (тем более что особой разницы в быстродействии/размере приложения заметно не будет)


 
nester ©   (2004-02-26 14:16) [10]

Допривожу код остального к [7]

function ThExecute(Dummy:Pointer; Sender: PThread): Integer;
begin
   s:= CheckForUpdate;
end;
function CheckForUpdate:string;
var
  s, body: string;
begin
  try
     body:= GetUrl(servername + updatefilename);
     s:= trim(body);
     if length(s) > 0 then
        if (s[1] <> "#") and (pos("=", s)>0) then
    result:= s;
  finally
  end;
end;
function Stream2String(Stream : PStream): string;
var
s: string;
begin
setlength(result, Stream.Size);
Stream.Position:= 0;
Stream.Read(result[1], Stream.Size);
end;

function GetUrl(url: string): string;
var
stream: PStream;
begin
//get txt or HTML file and return string
Stream := NewMemoryStream;
GetHTTP(url, Stream);
result:= Stream2String(Stream);
Stream.Free;//Destroy;
end;

function GetHTTP(url: string; var Stream: PStream; const ContentRangeBegin: integer = 0): boolean;
var
HttpCli1:PHttpCli;
begin
  HttpCli1:=NewHttpCli(nil);
  if ContentRangeBegin > 1000 then
  begin
     HttpCli1.ContentRangeBegin:= Int2Str(ContentRangeBegin - 1000);
     Stream.Position:= ContentRangeBegin - 1000;
  end;
  try
    HttpCli1.Agent:= "Mozilla/3.0 (compatible)";
    HttpCli1.Accept:= "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
    HTTPCli1.URL:= url;
    HttpCli1.RcvdStream:= Stream;
    HttpCli1.Get; //Вот тут и зависает зараза
    result:= true;
 except
 end;
 HttpCli1.Free;
end;


Вот собсвенно и код, там где комментарий что зависает - это вызов метода этого айсиэса, посмотрел его исходники описание см [8]


 
savva ©   (2004-02-26 14:19) [11]

первое что я могу посоветовать на вскидку (так как у меня нету ICS) - сделай HttpCli1:=NewHttpCli(Applet);


 
nester ©   (2004-02-26 14:29) [12]

Не, не помогло, ладно забил я на это, сделал невидимую форму для обработки, и екзешник стал на 7 кил тяжелее, ХРеново.


 
savva ©   (2004-02-26 14:30) [13]

еще один совет - сделай форму без использования апплета. не знаю как поможет, но все таки  попробовать стоит


 
SPeller ©   (2004-02-26 16:31) [14]

Ты вы народ, чё извращаетесь?

Создаете тред, в нём примерно следующее:

MyCtl := _NewControl( .. );
MyCtl.OnMessage := MyMessageHandler;
while not AppletTerminated do
begin
 WaitMessage;
 MyCtl.ProcessMessages;
end;

В обработчике MyMessageHandler обрабатываете нужные сообщения, а все остальные просто игнорируете. И нахрена вам аплет с формой сдались?? )


 
savva ©   (2004-02-26 16:36) [15]

у него засада другого плана (ему не нужено его собственный обработчик сообщений, как я понял): в компоненте ожидание таймаута реализовано через сообщение. Когда нету окошка - сам компонент не может свое сообщение обработать. Возможно я ошибаюсь..


 
SPeller ©   (2004-02-26 19:35) [16]


> ему не нужено его собственный обработчик сообщений, как
> я понял

Тогда пусть обработчик компонента вешает на OnMessage если ему это надо. Хотя, скорее всего, в самом HTTP-компоненте уже есть окно (по крайней мере большинство так делают). Тогда затык в другом месте может быть. В любом случае чтобы работало нужна правильная выборка сообщений. Для каждого потока своя! ProcessMessages обязательно нужно использовать, или перекопированный аналог.


 
nester ©   (2004-02-27 15:30) [17]

Господа, нашел ошибку, в общем ошибка еще глубже, она в самой компоненте.Эта компонента от ICS, которую ктото перелапатил под КОЛ. Переделаная HTTPCli  не всегда верно обрабатывает ошибки 404 и таймаут. Автор переделаной версии попросту закомментировал все raise. На сайте КОТ лежит вот делаю глупую работу - взял последнюю версию от ICS и сам его перелопачиваю теперь. Точнее предпоследнюю - последняя еще бета


 
nester ©   (2004-02-27 15:57) [18]

Пропу прощение. не все он заккоментировал raise, а както выборочно



Страницы: 1 вся ветка

Текущий архив: 2004.07.25;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
1-1089290412
Дмитрий 2004
2004-07-08 16:40
2004.07.25
как организовать поиск в диапазоне 2 дат?


1-1089795574
din
2004-07-14 12:59
2004.07.25
Подскажите пожалуйста какие нужны библиотеки


14-1088707894
mvgfirst
2004-07-01 22:51
2004.07.25
У кого какой КПК и кто как применяет (по работе)


3-1088360583
Zlod3y
2004-06-27 22:23
2004.07.25
Что быстрее BDE, ODBC или ADO?


14-1089295635
gn
2004-07-08 18:07
2004.07.25
патент на тело:ни шагу без некрасофта