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

Вниз

Программирование многооконного приложения для 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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1257412567
kyn66
2009-11-05 12:16
2009.12.27
Сохранение параметров программы одним числом


11-1209885307
SPeller
2008-05-04 11:15
2009.12.27
KOLTIFF.ImageAsBitmap экспортирует неправильный битмап


15-1256496465
palva
2009-10-25 21:47
2009.12.27
Какой-то тупой развод


15-1256236718
Kolan
2009-10-22 22:38
2009.12.27
Статья на хабаре про Делфи «создание и уничтожение объектов...»


2-1257847652
Alex_C
2009-11-10 13:07
2009.12.27
По Handle окна найти окно