Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Вниз
Проблемы с AllocateHWnd Найти похожие ветки
← →
Chlavik (2003-10-06 19:07) [0]Привет... У меня вот такая вот ситуция... Есть такой класс TFTPUpload наследник от моего другого класса (TUploadThrd)- наслденика TThread Так вот код TFTPUpload
TFtpUpload = class(TUploadThrd)
private
FOnUploadfinished:TUploadEvent;
FOnUploadStarted:TUploadEvent;
FOnErrorMsg:TErrorMsgEvent;
FOnUploadMsg:TUploadMsgEvent;
FOnReqUpdate:TUploadEvent;
FOnUploadStoped:TUploadEvent;
FOnReconnected:TUploadRecEvent;
FOnConnected:TUploadEvent;
FOnDisConnected:TUploadEvent;
Procedure FOnEvent(var Message: TMessage);
destructor Destroy; override;
public
constructor Create;
property OnUploadfinished:TUploadEvent read FOnUploadfinished write FOnUploadfinished;
property OnUploadStoped:TUploadEvent read FOnUploadStoped write FOnUploadStoped;
property OnUploadStarted:TUploadEvent read FOnUploadStarted write FOnUploadStarted;
property OnReqUpdate:TUploadEvent read FOnReqUpdate write FOnReqUpdate;
property OnUploadMsg:TUploadMsgEvent read FOnUploadMsg write FOnUploadMsg;
property OnErrorMsg:TErrorMsgEvent read FOnErrorMsg write FOnErrorMsg;
property OnReconnected:TUploadRecEvent read FOnReconnected write FOnReconnected;
property OnConnected:TUploadEvent read FOnConnected write FOnConnected;
property OnDisConnected:TUploadEvent read FOnDisConnected write FOnDisConnected;
constructor TFtpUpload.Create;
begin
Inherited Create;
Self.RecepHWND:=AllocateHWnd(FOnEvent);
end;
//******************************************************************************
destructor TFtpUpload.Destroy;
begin
DeallocateHWnd(Self.RecepHWND);
Inherited Destroy;
end;
//******************************************************************************
procedure TFtpUpload.FOnEvent(var Message: TMessage);
begin
case Message.Msg of
CM_ErrorMsg:
if Assigned(FOnErrorMsg) then FOnErrorMsg(nil,String(Message.WParam),
TUplErrorMsgType((Pointer(Message.LParam))^));
CM_StatusMsg:
if Assigned(FOnUploadMsg) then FOnUploadMsg(nil,String(PChar(Message.WParam)),
TUploadMsgType((Pointer(Message.LParam))^));
CM_UplStoped:
if Assigned(FOnUploadStoped) then FOnUploadStoped(TUploadThrd(Message.wParam));
CM_ReqUpdate:
if Assigned(FOnReqUpdate) then FOnReqUpdate(TUploadThrd(Message.wParam));
CM_UplStarted:
if Assigned(FOnUploadStarted) then FOnUploadStarted(TUploadThrd(Message.wParam));
CM_UplFinished:
if Assigned(FOnUploadFinished) then FOnUploadFinished(TUploadThrd(Message.wParam));
CM_Reconnected:
if Assigned(FOnReconnected) then FOnReconnected(TUploadThrd(Message.wParam),Message.LParam);
CM_Connected:
if Assigned(FOnConnected) then FOnConnected(TUploadThrd(Message.wParam));
CM_DisConnected:
if Assigned(FOnDisConnected) then FOnDisConnected(TUploadThrd(Message.wParam));
end;
Message.Result := 0;
end;
TUploadThrd шлют месаги на RecepHWND и FOnEvent генерит нужное событие.. Всё пашет.. :) Но поле того как класс иничтожился точнее когда выполнился DeallocateHWnd то что то происходит с главным окном проги (постоянно вылетают Acces Violation) Помойму Освобождается его Handle. Но какое отношение имеет одно к другому .. Исключения появляются при сврачивании или просто клике на пиктограму проги... Что может быть? Просто раньше всё пахало но просто TUploadThrd слал месаги на наследник TwinControl...
← →
Chlavik (2003-10-06 19:10) [1]Вот только что выдало при закрытии окна Exception "Недопутимый дескриптор окна" Хоть это и тупо но Как мой класс мог повлиять на хэндл окна проги...
← →
Chlavik (2003-10-06 21:15) [2]А самое интересное что если все эти ивенты отключить от от процедур главного окна
//Upload.OnUploadStarted:=OnUploadStarted;
// Upload.OnUploadFinished:=OnUploadFinished;
//Upload.OnUploadMsg:=OnUploadMsg;
// Upload.OnErrorMsg:=OnErrorMsg;
// Upload.OnReqUpdate:=OnReqUpdate;
// Upload.OnUploadStoped:=OnUploadInterrupted;
// Upload.OnReconnected:=OnUploadReconnected;
// Upload.OnConnected:=OnUploadConnected;
// Upload.OnDisConnected:=OnUploadDisConnected;//}
то всё пашет нормально ...
и если хоть одну чтрочку этого кода раскомментировать то тот же глюк
← →
Chlavik (2003-10-06 21:26) [3]А может нельзя так делать? Может мне Evnts всё таки Events сделать Как отдельный класс? только не предлагайте Synchronize ...
Приятно со всеми пообщатся :)
← →
Юрий Федоров (2003-10-06 21:57) [4]>>TUploadThrd шлют месаги
Все таки как шлет ?Post
илиSend
?
← →
Serginio1 (2003-10-06 22:31) [5]Попробуй перед уничтожением окна сделать PeekMessage. Вероятно есть необработанные сообщения.
← →
Chlavik (2003-10-06 23:25) [6]
> Post или Send ?
SendMessageTimeOut
← →
Chlavik (2003-10-07 00:28) [7]И не обработанных месаг нету...
Я решил эту проблему так
{ TUpldEvents }
constructor TUpldEvents.Create;
begin
inherited Create;
FHandle:=AllocateHWnd(FOnEvent);
end;
destructor TUpldEvents.Destroy;
begin
DeallocateHWnd(FHandle);
inherited;
end;
procedure TUpldEvents.FOnEvent(var Message: TMessage);
begin
case Message.Msg of
CM_ErrorMsg:
if Assigned(FOnErrorMsg) then FOnErrorMsg(TUploadThrd(Message.WParam),String(Message.WParam),
TUplErrorMsgType(Message.LParam));
CM_StatusMsg:
if Assigned(FOnUploadMsg) then FOnUploadMsg(TUploadThrd(Message.WParam),String(PChar(Message.WParam)),
TUploadMsgType(Message.LParam));
CM_UplStoped:
if Assigned(FOnUploadStoped) then FOnUploadStoped(TUploadThrd(Message.WParam));
CM_ReqUpdate:
if Assigned(FOnReqUpdate) then FOnReqUpdate(TUploadThrd(Message.WParam));
CM_UplStarted:
if Assigned(FOnUploadStarted) then FOnUploadStarted(TUploadThrd(Message.WParam));
CM_UplFinished:
if Assigned(FOnUploadFinished) then FOnUploadFinished(TUploadThrd(Message.WParam));
CM_Reconnected:
if Assigned(FOnReconnected) then FOnReconnected(TUploadThrd(Message.WParam),Message.LParam);
CM_Connected:
if Assigned(FOnConnected) then FOnConnected(TUploadThrd(Message.WParam));
CM_DisConnected:
if Assigned(FOnDisConnected) then FOnDisConnected(TUploadThrd(Message.WParam))
else DefWindowProc(FHandle,Message.Msg,Message.WParam,Message.LParam);
end;
Message.Result := 0;
end;
Так пашет просто после создания TUploadThrd я создаю TUpldEvents и его хэндл передаю в первый класс и уничтожаю в OnTerminate ... Но всё таки тот код более компактен и не понятно почему он не пашет
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.01 c