Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать активной подчиненное окно?? / 9 сообщений из 9, страница 1 из 1
11.11.2002, 13:52
    #32066458
balbes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Есть программа (не моя) в ней несколько окон (Form), так вот при загрузке программы они все появляюся на экране, но активной всегда остается главная форма. Как сделать чтобы после загрузки программы активной становилась подчиненная форма (Form2).
...
Рейтинг: 0 / 0
11.11.2002, 16:10
    #32066560
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Привет. Найди окно с помощью FindWindow и пошли ему сообщение (то ли WM_ACTIVATE, то ли WM_SHOWWINDOW)
...
Рейтинг: 0 / 0
11.11.2002, 18:51
    #32066649
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Можно так, как написал Gold. Это с использованием Windows API. A можно переключить главную форму на Form2 в меню Project->Options или вызвать метод Form2.BringToFront. И все дела.
...
Рейтинг: 0 / 0
11.11.2002, 19:00
    #32066650
Gold
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Дак он же пишет, что прога не его => исходников, наверное, нету :)
...
Рейтинг: 0 / 0
12.11.2002, 09:34
    #32066757
balbes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Привет Gold

Читал я как то давненько в книге по Делфи 4 о такой штуке, но как тогда до меня ничего не дошло так и теперь для меня это загадка.....

Если можно то по подробнее опиши как найти окно с помощью FindWindow??? и далее с помощью чего (и где найти это чего) мне послать это сообщение WM_ACTIVATE??? - буду очень благодарен.....

В принципе если постараться то исходник я могу достать но......
Попробовал на пустых окошках сделать то, что советует
hDrummer
1."Можно переключить главную форму на Form2 в меню Project->Options" - нельзя т.к. - она главная на ней все элементы управления....
2. "Вызвать метод Form2.BringToFront" - Это интересно, но где??... в каком месте ??....

Даже вот просто допустим, что у нас две формы одна главная и должна ей остаться, а вторая для ввода данных ....
и куда мы засандаливаем метод "Form2.BringToFront"

Я его куда только не совал и FormCreate, и FormShow, всеравно Form1 остается активной......
...
Рейтинг: 0 / 0
12.11.2002, 10:56
    #32066806
Groove
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Вот что написано в Русской справке по WinAPI

Функция FindWindowГруппа ссылок: Окна

Описание:
function FindWindow(ClassName, WindowName: PChar): HWnd;

Находит pодительское окно веpхнего уpовня с совпадающими ClassName и WindowName. Не осуществляет поиск дочеpних окон.

Паpаметpы :
ClassName: Имя класса окна (заканчивающееся пустым символом, nil - если все классы).
WindowName: Текстовый заголовок окна или 0, если все окна.

Возвpащаемое значение :
Описатель окна; 0 - если такого окна нет.

Пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
...
if FindWindow(nil, 'My program Window') <> 0  then showmessage ('Заголок моего окна есть');
...
if findwindow('TMyProgramForm', nil) <> 0  then showmessage ('Класс моего окна есть');
...
pc:='Название окна';
asm
  push pc
  push ''
  call findwindow
  mov wnd,eax
end;
...


ВОТ ЕЩЕ ПРИМЕР ПРИМЕНЕНИЯ

Как определить работает ли уже данное приложение или это первая его копия?



Для Delphi 1. Каждый экземпляр программы имеет ссылку на свою предыдущую копию - hPrevInst: hWnd. Ее можно проверить перед созданием приложения и при необходимости отреагировать соответствующим образом. Если запущена только одна копия, то эта ссылка равна нулю.
Пример:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
procedure TForm1.FormCreate(Sender: TObject); 
begin 
  {Проверяем есть ли указатель на 
		предыдущую копию приложения}
  IF hPrevInst <>  0  THEN BEGIN 
    {Если есть, то выдаем сообщение и выходим}
    MessageDlg('Программа уже запущена!', mtError, 
		[mbOk],  0 ); 
    Halt; 
  END; 
  {Иначе - ничего не делаем 
		не мешаем созданию формы)}
end;

P.S. Для выхода необходимо использовать Halt, а не Close, как хотелось бы, так как форма еще не создана и закрывать нечего. 
Есть и другой способ - по списку загруженных приложений 

procedure TForm1.FormCreate(Sender: TObject);
VAR
 Wnd : hWnd;
 buff : ARRAY[ 0 ..  127 ] OF Char;
Begin
 Wnd := GetWindow(Handle, gw_HWndFirst);
 WHILE Wnd <>  0  DO BEGIN
  IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, 
		gw_Owner) =  0 )
  THEN BEGIN
   GetWindowText (Wnd, buff, sizeof (buff ));
   IF StrPas (buff) = Application.Title THEN 
   BEGIN
    MessageDlg('Приложение уже загружено', 
		mtWarning, [mbOk],  0 );
    Halt;
   END;
  END;
  Wnd := GetWindow (Wnd, gw_hWndNext);
 END;
End;
...
Рейтинг: 0 / 0
12.11.2002, 11:00
    #32066810
Groove
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Большое сорри, последний пример не в тему :-)))
НАДО ВОТ ЭТОТ ПРИМЕР:

Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том, что программа уже запущено, приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения - найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку :
SetForegroundWindow(Wnd);
Например так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
program Project0;
uses
  Windows,  // !!!
  Forms,
  Unit0 in 'Unit0.pas' {Form1};
var
  Handle1 : LongInt;
  Handle2 : LongInt;
{$R *.RES}
begin
  Application.Initialize;
  Handle1 := FindWindow('TForm1',nil);
  if handle1 =  0  then
    begin
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end
  else
    begin
      Handle2 := GetWindow(Handle1,GW_OWNER);
       //Чтоб заметили :)
      ShowWindow(Handle2,SW_HIDE); ShowWindow
		(Handle2,SW_RESTORE); 
      SetForegroundWindow(Handle1); // Активизируем
    end;
end.
...
Рейтинг: 0 / 0
12.11.2002, 11:21
    #32066818
hDrummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Ну, я смотрю исходники всё же есть.

Тогда можно так извратиться: кинуть на форму таймер, написать в событии onTimer такой код:

Код: plaintext
1.
2.
3.
form2.show;
form2.setfocus или form2.bringToFront
timer1.Enabled:=false


он 1 раз при запуске отработает - и адью...
...
Рейтинг: 0 / 0
12.11.2002, 12:28
    #32066862
balbes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать активной подчиненное окно??
Огромное спасибо Groove
Умные цитаты буду разбираться.........

hDrummer
поклон тебе до самого плинтуса, простенько и со вкусом пока оставил так, там будет видно.....

ВСЕМ ОГРОМНОЕ СПАСИБО
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как сделать активной подчиненное окно?? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]