![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Найти вернее окно (форму) среди нескольких одинаковых
Дмитрий Белькевич © (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 ?