Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизНайти вернее окно (форму) среди нескольких одинаковых Найти похожие ветки
← →
Дмитрий Белькевич (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.065 c