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

Вниз

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

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

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


 
AV ©   (2012-08-16 14:15) [1]

Screen.ActiveForm ?


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


> Screen.ActiveForm ?


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


 
Anatoly Podgoretsky ©   (2012-08-16 14:30) [3]

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

GetTopWindow function 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 для прохода по списку


 
AV ©   (2012-08-16 14:43) [4]


> Дмитрий Белькевич   (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


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

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

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

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


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

ну и?

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

SET =

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


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


> ну и?


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


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

Сделал так:


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-19 13:34) [9]

var FC: TFormClass;

...
FC := TForm14;

WindowClassName(Wnd) = FC.ClassName :)


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

Спасибо :)


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

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;



Страницы: 1 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.065 c
15-1335422333
Дмитрий С
2012-04-26 10:38
2013.03.22
Кадр из 112 серии интернов.


15-1348691402
Юрий
2012-09-27 00:30
2013.03.22
С днем рождения ! 27 сентября 2012 четверг


2-1338043406
Глеб
2012-05-26 18:43
2013.03.22
дельфи и хмл


2-1335889883
PacMan
2012-05-01 20:31
2013.03.22
TThread копирование файла в 2-х потоках


2-1340112867
lavren
2012-06-19 17:34
2013.03.22
Новый пользователь AD