![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Криво работает окно в dll при вызове из VCL exe [D7, WinXP]
parovoZZ © (2006-05-13 13:50:00)В ресурсах dll создал окно (в секции DIALOG), но при вызове оттуда работает криво: не двигается за шапку, все элементы съехали вниз, при потере фокуса обратно он не возвращается, хотя кнопки нажимаются, текст вводится. Может там надо создать своё родительское окно, а не передавать в качестве родителя хендл главной формы exe?
function LoginProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : integer; stdcall; export;
begin
case Msg of
WM_COMMAND :
case wParam of
OK_Button :
begin
SendMessage (Handle, WM_LOGIN, WM_OK, 0);
DestroyWindow (DlgHandle);
end;
Cancel_Button :
begin
DestroyWindow (Handle);
end;
end;
WM_SYSCOMMAND :
case wParam of
SC_Close :
begin
DestroyWindow (Handle);
end;
end;
end;
Result := DefWindowProc (DlgHandle, Msg, wParam, lParam);
end;
parovoZZ (2006-05-15 19:55:00) [21]Не открывается ссылка, хоть тресни. Пишет ошибку - невозможно создать объект сервером там чего-то. Завтра на работе попробую.
begin...end (2006-05-15 11:09:00) [22]> parovoZZ © (14.05.06 23:43) [18]
А с этим быть так: по нажатию кнопки "ОК" внутри диалоговой процедуры получать тексты edit'ов и запоминать их во внешних переменных, которые будут доступны после того, как DialogBox завершится.
А ещё лучше всё-таки починить ослика и зайти по ссылке в [15]. Потому что Вы ещё не задали ни одного вопроса, на который там не было бы ответа.
n0name (2006-05-15 10:46:00) [23]
> Стоит вызвать PostInfo <см выше> , DlgHandle обнуляется.
Ты же нигде не присваеваешь DlgHandle ничего?
Странно, проверь код.
parovoZZ (2006-05-15 09:19:00) [24]Стоит вызвать PostInfo <см выше> , DlgHandle обнуляется.
n0name (2006-05-15 07:54:00) [25]
> Но... может быть, лучше всё же проверить?
Блин, я был не прав.
> В таком виде он отваливается за пределами оконной функции
Это как отваливается?
parovoZZ (2006-05-14 23:43:00) [26]А как тогда быть с этим:
procedure PostInfo (var edLogin, edPassword : string); stdcall;
var
Text : array [0..20] of Char;
begin
GetDlgItemText (DlgHandle, Login_Edit, Text, 20);
edLogin := Text;
GetDlgItemText (DlgHandle, Password_Edit, Text, 20);
edPassword := Text;
end;
Не зная хендла я не смогу прочитать данные.
begin...end (2006-05-14 22:00:00) [27]> parovoZZ © (14.05.06 21:49) [16]
> Тогда совсем не понятно, как брать Handle DialogBox
За пределами диалоговой процедуры DialogProc он и не нужен -- когда DialogBox завершится, диалог уже закроется. А в DialogProc дескриптор диалога приходит как параметр каждый раз, когда она вызывается системой для обработки сообщения. Что же ещё нужно-то?
> на ссылке ослик виснет
Это какой-то неправильный ослик. У меня не виснет...
parovoZZ (2006-05-14 21:49:00) [28]Тогда совсем не понятно, как брать Handle DialogBox :
DlgHandle := DialogBox (hInstance, 'LOGIN', MainHandle, @LoginProc);
В таком виде он отваливается за пределами оконной функции
на ссылке ослик виснет, в опере не открывается
begin...end (2006-05-14 18:58:00) [29]> parovoZZ
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/dialogboxes/usingdialogboxes.asp
begin...end (2006-05-14 18:52:00) [30]> parovoZZ © (14.05.06 18:39) [13]
> WM_Destroy
?
> Но что ставить вместо знака вопроса?
То, что должна возвратить функция DialogBox.
parovoZZ (2006-05-14 18:39:00) [31]Если я правильно понял, то надо делать так:
WM_Destroy : EndDialog (DlgHandle, {?});
Но что ставить вместо знака вопроса?
begin...end (2006-05-14 18:17:00) [32]> n0name (14.05.06 18:02) [11]
> конечно.
Я Вам завидую -- у меня этого сделать не получается.
Но... может быть, лучше всё же проверить ?
It is sent to the window whose enabled state is changing. This message is sent before the EnableWindowfunction returns, but after the enabled state (WS_DISABLED style bit) of the window has changed.
n0name (2006-05-14 18:02:00) [33]конечно.
WM_ENABLE
WPARAM wParam
LPARAM lParam;
Parameters
wParam
Specifies whether the window has been enabled or disabled. This parameter is TRUE if the window has been enabled or FALSE if the window has been disabled.
lParam
This parameter is not used.
Return Value
begin...end (2006-05-14 14:05:00) [34]> n0name (14.05.06 12:56) [9]
В смысле? Вы можете задизаблить окно, послав ему WM_ENABLE?
n0name (2006-05-14 12:56:00) [35]
> Это следствие, а не причина. Тогда уж EnableWindow.
Разница не велика.
begin...end (2006-05-14 09:51:00) [36]> parovoZZ © (14.05.06 01:26) [6]
> Теперь вопрос, как его сделать аналогично ShowModal ?
DialogBox ?
> n0name (14.05.06 09:45) [7]
> Можешь ещё попробовать WM_ENABLE.
Это следствие, а не причина. Тогда уж EnableWindow.
n0name (2006-05-14 09:45:00) [37]SendMessage(hParent, WM_CANCELMODE, 0, 0);
Можешь ещё попробовать WM_ENABLE.
parovoZZ (2006-05-14 01:26:00) [38]Ура!!!
function LoginProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : boolean; stdcall; export;
так надо делать в случае с CreateDialog ()
Теперь вопрос, как его сделать аналогично ShowModal ? А то ничего не помогает - всё равно доступна форма родителя.
parovoZZ (2006-05-13 21:57:00) [39]LoadLibrary, далее нахожу точку входа и понеслась. Но проблема в том, как из VCL приложения вызвать API dll. По ходу дела надо тама цикл обработки сообщений организовать с диспетчером сообщений. А то не двигается окно, хоть тресни. MessageBox, мать его ити, работает же как-то.
Dstr (2006-05-13 20:57:00) [40]А ты используешь DLL по LoadLibrary и либа тупо загружается со всеми диалогами,такая система,да?