Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Найти вернее окно (форму) среди нескольких одинаковых


Дмитрий Белькевич ©   (2012-08-16 14:04:00) 

У приложения есть несколько одинаковых форм (созданных в реалтайме). Стиль форм - fsNormal. Нужно найти самую верхнюю форму (по z order) из них.


Алибабай   (2012-08-20 21:40:00) [1]

function TopForm(AClass: TFormClass): TForm;
var
 i: integer;
begin
 for i := 0 to Screen.FormCount - 1 do
 begin
   Result := Screen.Forms[i];
   if Result is AClass then
     Exit;
 end;
 Result := nil;
end;


Дмитрий Белькевич   (2012-08-19 20:53:00) [2]

Спасибо :)


Дмитрий С   (2012-08-19 13:34:00) [3]

var FC: TFormClass;

...
FC := TForm14;

WindowClassName(Wnd) = FC.ClassName :)


Дмитрий Белькевич   (2012-08-19 12:19:00) [4]

Сделал так:


function TForm1.GetTopForm14: TForm;
var
Wnd: THandle;

function WindowClassName(Wnd: HWND): string;
var
 Buffer: array [0..255] of char;
begin
 SetString(Result, Buffer, GetClassName(Wnd, Buffer, SizeOf(Buffer) - 1));
end;

begin
Result := nil;
Wnd := GetTopWindow(0);
while (Wnd <> 0) do
begin
 if WindowClassName(Wnd) = 'TForm14' then
  Exit(TForm(FindControl(Wnd)));
 Wnd := GetNextWindow(Wnd, GW_HWNDNEXT);
end;
end;


Вопрос. Можно ли как-то найти форму по классу, а не по названию класса?


Дмитрий Белькевич   (2012-08-17 16:19:00) [5]


> ну и?


Элементарно, Ватсон :) Спасибо, нужно больше отдыхать :)


AV   (2012-08-17 13:49:00) [6]

ну и?

GetTopWindow - верхнее, если оно in SET - выход
repeat
GetNextWindow,  если оно in SET - выход
until Кончились окна

SET =

> найти все формы такого класса (это знаю как сделать)


Дмитрий Белькевич   (2012-08-17 13:40:00) [7]

>т.е. вторую сверху?

Уточняю :) окон может быть много разных (в приложении 40 разных форм, что там юзер пооткрывал и где какие окна по мониторам будут расположены - я заранее не знаю). Знаю только, что может быть открыто несколько одинаковых форм одного класса (TForm14) одновременно. Они могут быть открыты как на одном мониторе, так и на разных. Нужно найти все формы такого класса (это знаю как сделать) и найти самую 'верхнюю' из них (это не знаю).

Спасибо за ответы и прошу прощения за неполную постановку задачи сразу.


AV   (2012-08-16 14:43:00) [8]


> Дмитрий Белькевич   (16.08.12 14:29) [2]

т.е. вторую сверху?
тогда, Anatoly Podgoretsky ©   (16.08.12 14:30) [3]
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633509%28v=vs.85%29.aspx


Anatoly Podgoretsky   (2012-08-16 14:30:00) [9]

Если же все таки окна то

GetTopWindowfunction to search all child windows of a parent window and return the handle of the child window that is highest in Z order.

И GetNextWindow function для прохода по списку


Дмитрий Белькевич   (2012-08-16 14:29:00) [10]


> Screen.ActiveForm ?


Уточняю. Ни одна форма из них не активна. Что бы понять, как это выглядит.
В системе два монитора. На одном мониторе - активная форма (главная форма программы). На втором мониторе - 2-3, или больше, одинаковых форм. Нужно найти самую верхнюю из них.


AV   (2012-08-16 14:15:00) [11]

Screen.ActiveForm ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо