Форум: "KOL";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];
ВнизПрограммирование многооконного приложения для WinCE Найти похожие ветки
← →
Татьяна (2008-01-28 14:26) [0]1.Как сделать, чтобы все формы выходили во весь экран. Как сделать, чтобы форму нельзя было переместить на экране, потянув за верхнюю границу.Свойства DefaultSize и DefaultPosition = true у всех форм.
2. Как сделать, чтобы приложение не запускалось дважды.JustOne не получилось использовать, выходит ошибка при компилировании.
← →
mdw © (2008-01-28 15:52) [1]
> 1.Как сделать, чтобы все формы выходили во весь экран.
Имеется в виду, чтобы не было верхней и нижней строк Windows (кнопка пуск и строка меню)? Если да, поищите по форуму отвечал недавно.
> Как сделать, чтобы форму нельзя было переместить на экране,
> потянув за верхнюю границу.Свойства DefaultSize и DefaultPosition
> = true у всех форм.
DefaultSize и DefaultPosition = true должно быть достаточно.
> 2. Как сделать, чтобы приложение не запускалось дважды.JustOne
> не получилось использовать, выходит ошибка при компилировании.
У меня примерно так:
При старте приложения:
initialization
TestApp;
procedure TestApp;
const AppClass = {$ifndef wince}"obj_App"{$else}"App"{$endif};
var W: HWND;
ClassName, S: KOLString;
CopyData: TCopyDataStruct;
begin
SetLength(S, 100);
SetLength(ClassName, 100);
W:= FindWindow(AppClass, nil);
while W <> 0 do begin
GetClassName(W, PKOLChar(ClassName), 100);
GetWindowText(W, PKOLChar(S), 100);
if PKOLChar(ClassName) = AppClass then begin
PKOLChar(S)[9]:= #0;
if PKOLChar(S) = "mdvReader" then Break;
end;
W:= GetWindow(W, GW_HWNDNEXT);
end;
if W <> 0 then begin
S:= ParamStr(1);
CopyData.dwData:= 09121972;
if ParamCount > 0 then begin
CopyData.cbData:= (Length(S)+1)*SizeOf(KOLChar);
CopyData.lpData:= PKOLChar(S);
end
else begin
CopyData.cbData:= 0;
CopyData.lpData:= nil;
end;
SendMessage(W, WM_COPYDATA, 0, Integer(@CopyData));
Halt(1);
end;
end;
У Апплета проверяем:
function TTextOutForm.KOLAppletMessage(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:= False;
case Msg.message of
WM_COPYDATA:
if PCopyDataStruct(Msg.lParam).dwData = 09121972 then begin
SetForegroundWindow(Applet.Handle);
Applet.ProcessMessages;
if PCopyDataStruct(Msg.lParam).lpData <> nil then OpenFile(PKOLChar(PCopyDataStruct(Msg.lParam).lpData));
Result:= True;
end;
end;
end;
Это для случая если нужно еще и данные передать приложению.
А если просто активизировать, то в
procedure TestApp;
....
if W <> 0 then begin
//вместо
{ S:= ParamStr(1);
CopyData.dwData:= 09121972;
if ParamCount > 0 then begin
CopyData.cbData:= (Length(S)+1)*SizeOf(KOLChar);
CopyData.lpData:= PKOLChar(S);
end
else begin
CopyData.cbData:= 0;
CopyData.lpData:= nil;
end;
SendMessage(W, WM_COPYDATA, 0, Integer(@CopyData));
}
//пишем
SetForegroundWindow(Ц);
Halt(1);
end;
....
end;
← →
YuriyM © (2008-02-08 13:10) [2]Подскажите что делаю не так. Код процедуры вставил в Unit1, в секции initialization прописал TestApp. При запуске каждый раз новая копия.
procedure TestApp;
const AppClass = {$ifndef wince}"obj_App"{$else}"App"{$endif};
var W: HWND;
ClassName, S: KOLString;
begin
SetLength(S, 100);
SetLength(ClassName, 100);
W:= FindWindow(AppClass, nil);
ShowMessage(Int2Str(W)); // Поставил для проверки W=0
while W <> 0 do begin
GetClassName(W, PKOLChar(ClassName), 100);
GetWindowText(W, PKOLChar(S), 100);
if PKOLChar(ClassName) = AppClass then begin
PKOLChar(S)[9]:= #0;
if PKOLChar(S) = "mdvReader" then Break;
end;
W:= GetWindow(W, GW_HWNDNEXT);
end;
if W <> 0 then begin
SetForegroundWindow(W);
Halt(1);
end;
end;
← →
Yury Sidorov (2008-02-08 13:29) [3]В KOL-CE есть JustOneActivate для ограничения запуска одного экземпляра приложения и активации его при запуске второго экземпляра.
← →
Yury Sidorov (2008-02-08 13:31) [4]Кстати, это уже обсуждалось тут:
http://delphimaster.net/view/11-1196634700/
← →
YuriyM © (2008-02-08 13:42) [5]
> В KOL-CE есть JustOneActivate для ограничения запуска одного
> экземпляра приложения и активации его при запуске второго
> экземпляра.
Большое спасибо за ответ. Еще у меня получилось так:
procedure TestApp;
var
W: HWND;
begin
W:= FindWindow(nil, "Proba");
if W<>0 then
begin
SetForegroundWindow(W);
Halt(1);
end;
end;
← →
Compiler © (2008-02-08 13:47) [6]Я всегда использую
CreateSemaphore(nil, 0, 1, "My_Program");
if (GetLastError = ERROR_ALREADY_EXISTS) then begin
Halt(0);
end;
P.S. Вариантов масса
← →
Yury Sidorov (2008-02-08 14:12) [7]
> Я всегда использую
> CreateSemaphore(nil, 0, 1, "My_Program");
> if (GetLastError = ERROR_ALREADY_EXISTS) then begin
> Halt(0);
> end;
>
> P.S. Вариантов масса
Это просто защита от повторного запуска. А вопрос стоял в активации уже работающего приложение при попытке повторного запуска...
← →
Compiler © (2008-02-08 14:31) [8]> Yury Sidorov (08.02.08 14:12) [7]
+SetForegroundWindow(FindWindow(nil, "Заголовок программы"));
← →
имя (2008-02-28 04:02) [9]Удалено модератором
← →
имя (2008-05-04 19:13) [10]Удалено модератором
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2009.12.27;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c