![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сворачивание/разворачивание форм. [D5, Win2k]
Дельфятник © (2002-08-13 16:04:00)По нажатию кнопки у меня сворачиваются все формы кроме двух и вызывается форма 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"и других форм в других частях программы не меняются.
Дельфятник (2002-08-14 16:13:00) [1]В своей программе я не создаю потоков.
dmtr (2002-08-14 15:44:00) [2]>Дельфятник
Странно. У меня разворачиваются окна, свернутые только в этом потоке(тобиш что свернул, то и развернул)
Дельфятник (2002-08-14 15:38:00) [3]2 dmtr: Ваш вариант, во-первых, разворачивает все формы, хотя мне надо чтобы разворачивались только те, которые были свёрнуты автоматически.
А во-вторых, у меня есть форма, у которой WindowState=wsMaximized. Это, конечно, можно обойти доавлением соответствующего условия, но первого замечания это не снимает.
dmtr (2002-08-14 15:29:00) [4]>Дельфятник
Зачем тебе TStringList. Попробуй код, который я предложил.
Дельфятник (2002-08-14 15:23:00) [5]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 14:50:00) [6]Я проверил 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 14:31:00) [7]Короче. Я завёл TStringList, в который запихиваю имена сворачиваемых форм. А потом только их и разворачиваю. Всё замечательно работает. Но всё равно, всем спасибо.
Skier (2002-08-14 14:11:00) [8]>Дельфятник
> У меня Win2000 и Delphi 5.0 (Build 5.62).
>................
> Прям мистика какая-то.
Ну ежели мистика, может тебе стоит Delphi
пропачить, чтобы было Delphi 5.0 (Build 6.18) ?
Дельфятник (2002-08-14 13:40:00) [9]2 Smithson: У меня Win2000 и Delphi 5.0 (Build 5.62).
2 dmtr: пробовал, не работает.
В общем, проблема в следующем: при сворачивании формы её Tag"у присваивается единица, а когда доходит до разворачивания, то у всех форм Tag"и оказываются равными нулю. При этом Tag"и форм нигде больше не используются и не меняются. Прям мистика какая-то.
dmtr (2002-08-14 12:54:00) [10]Напиши процедуру разворачивания в событие OnClose для CopyForm.
У меня сработало.
Smithson (2002-08-14 12:49:00) [11]ты знаешь...
Из интереса прогнал твои куски - у меня работает. Delphi 5.5
Дельфятник (2002-08-14 09:39:00) [12]Да, я забыл написать, что сразу после сворачивания форм идёт вызов 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;
Дельфятник (2002-08-14 09:16:00) [13]Вы хотите сказать, что надо разворачивать невидимые формы?
Я смотрел в отладчике, что программа заходит внутрь конструкции begin .. end, но никогда не выполняется условие if Screen.Forms[i].Tag=1 then.
dmtr (2002-08-13 17:49:00) [14]Попробуй в процедуре разворотки исправить
Screen.Forms[i].Visible на Screen.Forms[i].Visible = False