Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сворачивание/разворачивание форм. [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо