Форум: "Основная";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
ВнизСворачивание/разворачивание форм. Найти похожие ветки
← →
Дельфятник (2002-08-13 16:04) [0]По нажатию кнопки у меня сворачиваются все формы кроме двух и вызывается форма CopyForm. После того, как она закрыта, я хочу развернуть все окна, которые были свёрнуты, а этого почему-то не получается. Делаю я так:
Сворачивание:
procedure TInputForm.OpenClick(Sender: TObject);
var i: Word;
begin // Событие OnClick на TBitBtn
for i:=0 to Screen.FormCount-1 do
begin
Screen.Forms[i].Tag:=0;
if (Screen.Forms[i].Name<>"MainForm") and (Screen.Forms[i].Name<>"Fm_main") and
Screen.Forms[i].Visible and (Screen.Forms[i].WindowState<>wsMinimized) then
begin
Screen.Forms[i].WindowState:=wsMinimized;
Screen.Forms[i].Tag:=1
end
end
end;
Разворачивание:
procedure TCopyForm.FormHide(Sender: TObject);
var i: Word;
begin
for i:=0 to Screen.FormCount-1 do if (Screen.Forms[i].Name<>"MainForm") and
(Screen.Forms[i].Name<>"Fm_main") and Screen.Forms[i].Visible then
begin
if Screen.Forms[i].Tag=1 then
Screen.Forms[i].WindowState:=wsNormal;
Screen.Forms[i].Tag:=0
end
end;
MainForm и Fm_main - это, как все наверное уже догадались, имена форм, которые не должны сворачиваться. Проблема состоит в том, что после закрытия формы CopyForm не разворачиваются ни одна форма. Если убрать условие if Screen.Forms[i].Tag=1 then, то разворачиваются все свёрнутые формы, а не только те, которые были свёрнуты перед вызовом CopyForm. Понятно, что можно просто разворачивать все свёрнутые формы, но это не то, чего я пытаюсь добиться.
Почему-то когда программа доходит до условия if Screen.Forms[i].Tag=1 then то у всех форм Tag=0, хотя перед вызовом CopyForm у развёрнутых окон присваивался Tag:=1. При этом Tag"и других форм в других частях программы не меняются.
← →
dmtr (2002-08-13 17:49) [1]Попробуй в процедуре разворотки исправить
Screen.Forms[i].Visible на Screen.Forms[i].Visible = False
← →
Дельфятник (2002-08-14 09:16) [2]Вы хотите сказать, что надо разворачивать невидимые формы?
Я смотрел в отладчике, что программа заходит внутрь конструкции begin .. end, но никогда не выполняется условие if Screen.Forms[i].Tag=1 then.
← →
Дельфятник (2002-08-14 09:39) [3]Да, я забыл написать, что сразу после сворачивания форм идёт вызов CopyForm.ShowModal, то есть процедура TInputForm.OpenClick имеет вид:
procedure TInputForm.OpenClick(Sender: TObject);
var i: Word;
begin // Событие OnClick на TBitBtn
for i:=0 to Screen.FormCount-1 do
begin
Screen.Forms[i].Tag:=0;
if (Screen.Forms[i].Name<>"MainForm") and (Screen.Forms[i].Name<>"Fm_main") and
Screen.Forms[i].Visible and (Screen.Forms[i].WindowState<>wsMinimized) then
begin
Screen.Forms[i].WindowState:=wsMinimized;
Screen.Forms[i].Tag:=1
end
end;
CopyForm.ShowModal
end;
Ещё я изменил процедуру разворачивания (что, впрочем, не помогло).
procedure TCopyForm.FormHide(Sender: TObject);
var i: Word;
begin
for i:=0 to Screen.FormCount-1 do if Screen.Forms[i].Visible then
begin
if Screen.Forms[i].Tag=1 then
Screen.Forms[i].WindowState:=wsNormal;
Screen.Forms[i].Tag:=0
end
end;
← →
Smithson (2002-08-14 12:49) [4]ты знаешь...
Из интереса прогнал твои куски - у меня работает. Delphi 5.5
← →
dmtr (2002-08-14 12:54) [5]Напиши процедуру разворачивания в событие OnClose для CopyForm.
У меня сработало.
← →
Дельфятник (2002-08-14 13:40) [6]2 Smithson: У меня Win2000 и Delphi 5.0 (Build 5.62).
2 dmtr: пробовал, не работает.
В общем, проблема в следующем: при сворачивании формы её Tag"у присваивается единица, а когда доходит до разворачивания, то у всех форм Tag"и оказываются равными нулю. При этом Tag"и форм нигде больше не используются и не меняются. Прям мистика какая-то.
← →
Skier (2002-08-14 14:11) [7]>Дельфятник
> У меня Win2000 и Delphi 5.0 (Build 5.62).
>................
> Прям мистика какая-то.
Ну ежели мистика, может тебе стоит Delphi
пропачить, чтобы было Delphi 5.0 (Build 6.18) ?
← →
Дельфятник (2002-08-14 14:31) [8]Короче. Я завёл TStringList, в который запихиваю имена сворачиваемых форм. А потом только их и разворачиваю. Всё замечательно работает. Но всё равно, всем спасибо.
← →
dmtr (2002-08-14 14:50) [9]Я проверил Tag до и после минимизации. Да, действительно Tag становится равным 0 сразу после минимизации формы. Но не смотря на это у меня все работает нормально.
Попробуй так. У меня работает.
procedure TInputForm.OpenClick(Sender: TObject);
var i: Word;
begin // Событие OnClick на TBitBtn
for i:=0 to Screen.FormCount-1 do
if (Screen.Forms[i].Name<>"MainForm") and (Screen.Forms[i].Name<>"Fm_main") and Screen.Forms[i].Visible then
Screen.Forms[i].WindowState:=wsMinimized;
CopyForm.ShowModal
end;
procedure TCopyForm.FormHide(Sender: TObject);
var i: Word;
begin
for i:=0 to Screen.FormCount-1 do
Screen.Forms[i].WindowState:=wsNormal;
end;
← →
Дельфятник (2002-08-14 15:23) [10]dmtr>Да, действительно Tag становится равным 0 сразу после минимизации формы
Во-первых, я пробовал вместо нуля и единицы ставить другие значения - не помогало.
Во-вторых, я пробовал не только
Screen.Forms[i].Tag:=1;
Screen.Forms[i].WindowState:=wsMinimized;
но и вариант
Screen.Forms[i].WindowState:=wsMinimized;
Screen.Forms[i].Tag:=1
который, вообще-то исправляет Tag после минимизации формы.
Но всё равно для меня это уже неактуально, поскольку я сделал это с использованием TStringList.
← →
dmtr (2002-08-14 15:29) [11]>Дельфятник
Зачем тебе TStringList. Попробуй код, который я предложил.
← →
Дельфятник (2002-08-14 15:38) [12]2 dmtr: Ваш вариант, во-первых, разворачивает все формы, хотя мне надо чтобы разворачивались только те, которые были свёрнуты автоматически.
А во-вторых, у меня есть форма, у которой WindowState=wsMaximized. Это, конечно, можно обойти доавлением соответствующего условия, но первого замечания это не снимает.
← →
dmtr (2002-08-14 15:44) [13]>Дельфятник
Странно. У меня разворачиваются окна, свернутые только в этом потоке(тобиш что свернул, то и развернул)
← →
Дельфятник (2002-08-14 16:13) [14]В своей программе я не создаю потоков.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c