Текущий архив: 2006.10.15;
Скачать: CL | DM;
ВнизКриво работает окно в dll при вызове из VCL exe Найти похожие ветки
← →
Polevi © (2006-05-23 09:43) [40]нефиг сук пилить на котором сидишь
← →
Leonid Troyanovsky © (2006-05-23 18:57) [41]
> parovoZZ © (23.05.06 09:22) [39]
> Ну ладно, обсуждение плавно перешло в перебранку.
Вот скажи, нах мне браниться с совершенно незнакомым человеком? Допустим, мой тон может быть резок, но, позволь, я ж не могу
позволить гордить всякую чушь совершенно безапелляционно.
Если, конечно, мыслительные мышцы атрофированы, то я - пас.
Т.е., пожалуйте-с, по существу, бо домысливать что-либо
в конце рабочего дня мне влом.
--
Regards, LVT.
← →
parovoZZ © (2006-05-28 23:38) [42]Ну вообщем отказался от сообщений из dll. Сделал так:
library OJDialog;
uses
Messages,
Windows;
const
OK_Button = 101;
Cancel_Button = 102;
Login_Edit = 103;
Password_Edit = 104;
var
MainHandle,
DlgHandle, _DlgHandle : THandle;
_result : byte;
edLogin, edPassword : ShortString;
{$R Login.Res}
procedure GetInfo (Handle : THandle);
var
Text : array [0..20] of Char;
begin
GetDlgItemText (Handle, Login_Edit, Text, 20);
edLogin := Text;
GetDlgItemText (Handle, Password_Edit, Text, 20);
edPassword := Text;
end;
procedure Centering (Handle : THandle);
var
Rect : TRect;
iWidth, iHeight : word;
begin
GetWindowRect (Handle, Rect);
iWidth := Rect.right - Rect.left;
iHeight := Rect.bottom - Rect.top; //öåíòðîâêà äèàëîãà
Rect.left := (GetSystemMetrics (SM_CXSCREEN) - iWidth) Div 2;
Rect.top := (GetSystemMetrics (SM_CYSCREEN) - iHeight) Div 2;
MoveWindow (Handle, Rect.left, Rect.top, iWidth, iHeight, False);
SetForegroundWindow (Handle);
end;
function ConnectShowProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : boolean; stdcall;
begin
result := WordBool (0);
case Msg of
WM_ShowWindow : begin
Centering (DlgHandle);
end;
WM_Destroy : begin
//EndDialog (DlgHandle, DlgHandle);
//DlgHandle := 0;
Exit;
end;
end;
end;
procedure ConnectShow; stdcall
begin
DlgHandle := CreateDialog (hInstance, "ConnectShow", MainHandle, @ConnectShowProc);
end;
function LoginProc (DlgHandle: THandle; Msg, wParam, lParam: Integer) : boolean; stdcall;
begin
result := WordBool (0);
case Msg of
WM_COMMAND :
case wParam of
OK_Button :
begin
GetInfo (DlgHandle);
DestroyWindow (DlgHandle);
_result := IDOK;
end;
Cancel_Button :
begin
DestroyWindow (DlgHandle);
_result := IDCANCEL;
end;
end;
WM_SYSCOMMAND :
case wParam of
SC_Close :
begin
DestroyWindow (DlgHandle);
_result := IDCLOSE;
end;
end;
WM_ShowWindow : begin
Centering (DlgHandle);
end;
WM_Destroy : begin
EndDialog (DlgHandle, _DlgHandle);
_DlgHandle := 0;
Exit;
end;
end;
end;
procedure Execute (aMainHandle : THandle); stdcall;
begin
MainHandle := aMainHandle;
end;
function Login : byte; stdcall;
begin
_DlgHandle := DialogBox (hInstance, "LOGIN", MainHandle, @LoginProc);
//_DlgHandle := CreateDialog (hInstance, "LOGIN", MainHandle, @LoginProc);
result := _result;
end;
procedure PostInfo (var aLogin, aPassword : ShortString); stdcall;
begin
aLogin := edLogin;
aPassword := edPassword;
end;
procedure Destroy; stdcall;
begin
DestroyWindow (DlgHandle);
end;
Exports
Execute name "Execute",
Login name "Login",
PostInfo name "PostInfo",
ConnectShow name "ConnectShow",
Destroy name "Destroy";
end.
Вызываем примерно так:Application.Initialize;
Application.Title := "Operative Journal";
Application.CreateForm (TDMd, DMd);
MainHandle := Application.Handle;
LoadDll (MainHandle);
repeat
DataModule.Destroy;
if not DMd.Login (MainHandle) then exit;
until DMd.Authorization = true;
Application.CreateForm (TMainForm, MainForm);
DataModule.Destroy;
UnloadDll;
Application.Run;
При первом нажатии Cancel в окне авторизации (окно создаётся в теле функции Login) приложение завершает работу и выпадает Access Violatin (из-за чего?). Если нажать ОК не вводя при этом логина, то показывается окно хода подключения (вызов функции ConnectShow), после чего из отдельной dll выскакивает мессага об ошибке подключения. Далее, подтверждаем мессагу об ошибке и снова появляется окно авторизации. А вот если теперь нажать на Cancel, то приложение завершается без вопросов. Почему так?
← →
parovoZZ © (2006-05-29 20:26) [43]
repeat
DataModule.Destroy;
if not DMd.Login (MainHandle) then
begin
Application.Run;
exit;
end;
until DMd.Authorization = true;
Всё заработало. Век живи, век учись. VCL, чтоб его.
Страницы: 1 2 вся ветка
Текущий архив: 2006.10.15;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.049 c