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

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

Дано Х {3} кнопок при нажатию на любую из них выдается окно и тол


СОС ©   (2003-01-14 05:34:00) 

ько одно! Т.е. при нажатии на первой кнопке вывелось окно с заголовком 1. Если я его не закрыл то повторное нажатие на первой кнопке сделает активным мне это окно а не создаст новое. Новое создается только в том случае если окно не создано. СОздаваться окно должно динамически, сворачиваться на панель задачь. Сам вроде все заделал но есть загвоздка не знаю как отследить в массиве кнопок что форма была закрыта?


СОС   (2003-01-14 14:55:00) [1]

Спасибо! Примерно об этом думал.
Сейчас реализовал все вот так - {еще требовалось передать несколько параметров форме} - заоплнил в форме мои параметры + передал @соего элемента в массиве на ОнДестрое - его делаю 0.
Все заработало.
ЗЫ. Конечно надо было полностью освобождать форму после закрытия.
Почему спрашивал - интересно было наиболее оптимальное правильное решение в основном из-за ресурсов винды.
Еще раз спасибо!


Alx2   (2003-01-14 07:47:00) [2]

>СОС (14.01.03 06:12)
Сначала заполни массив нулями.
Потом просто show (если форма закрыта, но не уничтожена).
Если же форму все-таки уничтожаешь, то из события OnDestroy уничтожаемой формы обнуляй соотв. элемент массива (найти его можно, например, так:

for k := 0 to 2 do
if fff[k]=Self then
begin
fff[k] := Nil;
break;
end;
)

Либо из того же события информируй главную форму о том, что "караул, убивают". А главная форма обнулит соотв. элемент массива. Глагол "информируй" можно реализовать с помощью посылки сообщения. Например:
Application.MainForm.Perform(wm_user,<Некоторое уникальное значение>,Integer(Self)) - в событии OnDestroy убиенной формы

В главной же форме реализуй метод
procedure CleanArrayItem(Var MSG : TMessage); message wm_user;

procedure TForm1.CleanArrayItem(var MSG: TMessage);
Var k : integer;
begin
if Msg.WParam = <Некоторое уникальное значение>
then
for k := 0 to 2 do
if Integer(fff[k])=MSG.LParam then
begin
fff[k] := Nil;
break;
end;

end;

Некоторое преимущество последнего: массив fff можно хранить внутри класса главной формы, что более соответствует парадигме ООП.


СОС   (2003-01-14 06:12:00) [3]

Я заводил массив это из основной формы
type
....
TFields=record
Fr :TfSendFile; //это как раз указатель на экземпляр новых форм ТАМ уже описано caFree на ОнКлозе
end;

var
Form1: TForm1;
FFF:array[0..2] of TFields; //это массив куда я пихаю вот таким методом...
...

procedure TForm1.ButtonClick(Sender: TObject);
var
i:byte;
begin
i:=(Sender as TButton).Tag;
with fff[i] do begin
if (not Assigned(Fr)) then begin
fr:=TfSendFile.Create(nil);
end;
try
Fr.Show;
except
Application.MessageBox(PChar("пРОБЛЕМА :("), "


Думкин   (2003-01-14 05:50:00) [4]

Когда окно закрывается - можно уведомить об этом кнопки, но ты еще подумай.


Наверх

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