![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Project/Options/Forms [D6, Win95/98]
AL2002 © (2002-10-18 17:21:00)Есть AutoCreate и есть AvailableForms
при автосоздании они создаются и невидимы.
При авейелэбл прога делает эксепшн при слове Form1.Show.
Как эти формы всё-таки показывать и ныкать, чтоб они все вместе память не занимали? Т.е., чтобы они были в списке Available Forms, но можно было их показывать и ликвидировать, когда надо, а потом снова показывать.
AL2002 (2002-10-24 21:43:00) [1]>Результат: работает всё.
>А что такое "ничего"?
Кароче. Всё работает. Не надо никаких апдейтов.
Если (спасибо тебе, Рыжик) форма не существует, то она создаётся, а если уже существует, то показывается и ныкается, а не удаляется.
Рыжик, ты Мастер.
Рыжик (2002-10-23 15:03:00) [2]
> makdi (23.10.02 14:55)
Результат: работает всё.
А что такое "ничего"?
makdi (2002-10-23 14:55:00) [3]> Рыжик
> Да ну?!
Попробуй, о результатах сообщи
Рыжик (2002-10-23 14:43:00) [4]
> makdi (23.10.02 14:18)
> Form2.Update; // без него покажется форма, НО ни чего работать
> не будет!
Да ну?!
makdi (2002-10-23 14:18:00) [5]А не проще было бы сделать так:
Application.CreateForm(TForm2,Form2)
Form2.Show;
Form2.Update; // без него покажется форма, НО ни чего работать не будет!
.....
а в конце
Form2.Hide;
Form2.Free;
Ресурсы освобождаются полностью
Рыжик (2002-10-23 08:48:00) [6]Ни чего не понимаю...
Хочешь сказать, что у тебя работает вот это:
procedure TForm1.Button1Click(Sender: TObject);???????
begin
Form1.Free;
end;
Или кнопка всё-таки на какой-то другой форме? А то как-то не правдоподобно...
В любом случае так можно делать, только если логика программы гарантирует, что в момент вызова Application.CreateForm(TForm2,Form2) формы Form2 не существует. Но будь готов к тому, что пройдёт время, ты про всё это забудешь, программа сильно изменится, - и будешь потом мучительно искать, почему-же программа жрёт память.
Лучше делать так:
if Form2=nil then Application.CreateForm(TForm2,Form2);
или так:
if Form2<>nil then
begin
Form2.Free;
Application.CreateForm(TForm2,Form2);
end;
AL2002 (2002-10-22 17:11:00) [7]>2Рыжик Aka Restart
Я нахожусь на форме1. Нажимаю кнопку.
> Form1.Free;
> Application.CreateForm(TForm2,Form2);
> Form2.Show;
И появляюсь на форме2.
И наоборот.
Нормально?
Рыжик (2002-10-22 14:27:00) [8]Пардон, это я была ;)
Restart (2002-10-22 14:24:00) [9]Ой, нет!
> Form1.Free;
> Application.CreateForm(TForm2,Form2);
> Form2.Show;
Может имелось в виду Form2.Free? А то, если Form2 уже есть, то у тебя получиться что создаётся ещё одна, а старая так и будет присутствовать среди Application.Components. И уничтожиться только при закрытии приложения.
Restart (2002-10-22 14:14:00) [10]
> AL2002 © (22.10.02 11:43)
Нормально. Освобождаются.
Application.CreateForm(TForm2,Form2) ~ Form2:=TForm2.Create(Application)
Snake (2002-10-22 12:09:00) [11]Action=caFree - это уничтожение формы при закрытии. Как правило, применяется в диалогах и MDI-формах.
AL2002 (2002-10-22 11:43:00) [12]
> Action=caFree
Это что?
Рыжик, а если я делаю как я писал в AL2002 © (21.10.02 14:42)то это нормально. Ресурсы освобождаются?
Рыжик (2002-10-21 15:56:00) [13]AutoCreated - формы, которые создаются при запуске приложения.
Available Forms - формы, которые не создаются автоматически, их нужно создавать самому, прежде чем использовать.
Если формы AutoCreated, то чтобы их небыло видно при запуске программы поставь им Visible = false. Потом когда надо форму показать, делаешь Show или Visible=true. Дальше чтобы форму можно было показывать снова, при закрытии её надо не уничтожать, а прятать (OnClose, Action:=caHide). В этом случае форма всегда будет оставаться в памяти, но зато все изменения сделанные с формой будут сохраняться при её следующем показе.
Либо можно создавать форму при первом к ней обращении, а потом прятать: Available, caHide (оно по-умолчанию). Тогда перед показом формы следует проверить её на nil и если надо создать MyForm:=TMyForm.Create(Application);
Чтобы форма не висела в памяти, её надо сделать Available и на OnClose устанавливать Action=caFree. Затем, когда надо показать форму - создавать её заново.
AL2002 (2002-10-21 14:42:00) [14]А по другому сделал.
Я делаю
Form1.Free;
Application.CreateForm(TForm2,Form2);
Form2.Show;
и наоборот:
Form2.Free;
Application.CreateForm(TForm1,Form1);
Form1.Show;
Так нормально?
Pat (2002-10-18 20:27:00) [15]>телепатических способностях
теле Patических способностях :-)))))
>Постоянный Exception
Расставь брейкпоинты, посмотри на какой строчке...
Anatoly Podgoretsky (2002-10-18 19:31:00) [16]Должно если правильно написано, вот вызов и создание сейчас написаны правильно, вот только begin в данном случае лишний
Потом ты ссылаешь на Exception и не приводишь какой, видимо сильно уверен в нащих телепатических способностях
AL2002 (2002-10-18 19:12:00) [17]>Pat © (18.10.02 19:05)
Я там что-то наваял, типа:
with TForm1.Create(Self) do begin
Show;
Она-то показалась, но ни одна функция не работала. Постоянный Exception. Но ведь должно же работать! :(
Pat (2002-10-18 19:05:00) [18]Если не хочешь создавать ее руками - перемести ее в Autocreated
AL2002 (2002-10-18 18:54:00) [19]>Pat © (18.10.02 18:37)
А как сделать, чтобы форма, та, что в Availables, создалась и работала?
Pat (2002-10-18 18:37:00) [20]AutoCreate - автоматически создаваемые
AvailableForms - доступные формы для вашего проекта. Их надо создавать:
MyForm:=TMyForm.Create(self)
....
MyForm.Free
Насчет self - отдельная история...Если поставить вместо self, например, application, то эта форма будет уничтожена при закрытии приложения. А вообще народ говорит, что правило хорошего тона - self :-))