Текущий архив: 2003.01.23;
Скачать: CL | DM;
Вниз
Дано Х {3} кнопок при нажатию на любую из них выдается окно и тол Найти похожие ветки
← →
СОС (2003-01-14 05:34) [0]ько одно! Т.е. при нажатии на первой кнопке вывелось окно с заголовком 1. Если я его не закрыл то повторное нажатие на первой кнопке сделает активным мне это окно а не создаст новое. Новое создается только в том случае если окно не создано. СОздаваться окно должно динамически, сворачиваться на панель задачь. Сам вроде все заделал но есть загвоздка не знаю как отследить в массиве кнопок что форма была закрыта?
← →
Думкин (2003-01-14 05:50) [1]Когда окно закрывается - можно уведомить об этом кнопки, но ты еще подумай.
← →
СОС (2003-01-14 06:12) [2]Я заводил массив это из основной формы
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("пРОБЛЕМА :("), "
← →
Alx2 (2003-01-14 07:47) [3]>СОС (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 14:55) [4]Спасибо! Примерно об этом думал.
Сейчас реализовал все вот так - {еще требовалось передать несколько параметров форме} - заоплнил в форме мои параметры + передал @соего элемента в массиве на ОнДестрое - его делаю 0.
Все заработало.
ЗЫ. Конечно надо было полностью освобождать форму после закрытия.
Почему спрашивал - интересно было наиболее оптимальное правильное решение в основном из-за ресурсов винды.
Еще раз спасибо!
Страницы: 1 вся ветка
Текущий архив: 2003.01.23;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.007 c