Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.04;
Скачать: CL | DM;

Вниз

Project/Options/Forms   Найти похожие ветки 

 
AL2002 ©   (2002-10-18 17:21) [0]

Есть AutoCreate и есть AvailableForms

при автосоздании они создаются и невидимы.
При авейелэбл прога делает эксепшн при слове Form1.Show.

Как эти формы всё-таки показывать и ныкать, чтоб они все вместе память не занимали? Т.е., чтобы они были в списке Available Forms, но можно было их показывать и ликвидировать, когда надо, а потом снова показывать.


 
AL2002 ©   (2002-10-18 18:06) [1]

Я тут нарыл, что надо использовать метод Create. Только ей ещё и АOwner какой-то нужен. Как её создать, блин?

Рыжик, где ты? :((


 
Pat ©   (2002-10-18 18:37) [2]

AutoCreate - автоматически создаваемые
AvailableForms - доступные формы для вашего проекта. Их надо создавать:
MyForm:=TMyForm.Create(self)
....
MyForm.Free

Насчет self - отдельная история...Если поставить вместо self, например, application, то эта форма будет уничтожена при закрытии приложения. А вообще народ говорит, что правило хорошего тона - self :-))


 
AL2002 ©   (2002-10-18 18:54) [3]

>Pat © (18.10.02 18:37)
А как сделать, чтобы форма, та, что в Availables, создалась и работала?


 
Pat ©   (2002-10-18 19:05) [4]

Если не хочешь создавать ее руками - перемести ее в Autocreated


 
AL2002 ©   (2002-10-18 19:12) [5]

>Pat © (18.10.02 19:05)
Я там что-то наваял, типа:
with TForm1.Create(Self) do begin
Show;

Она-то показалась, но ни одна функция не работала. Постоянный Exception. Но ведь должно же работать! :(


 
Anatoly Podgoretsky ©   (2002-10-18 19:31) [6]

Должно если правильно написано, вот вызов и создание сейчас написаны правильно, вот только begin в данном случае лишний

Потом ты ссылаешь на Exception и не приводишь какой, видимо сильно уверен в нащих телепатических способностях


 
Pat ©   (2002-10-18 20:27) [7]

>телепатических способностях
теле Patических способностях :-)))))
>Постоянный Exception
Расставь брейкпоинты, посмотри на какой строчке...


 
AL2002 ©   (2002-10-21 14:42) [8]

А по другому сделал.
Я делаю
Form1.Free;
Application.CreateForm(TForm2,Form2);
Form2.Show;

и наоборот:
Form2.Free;
Application.CreateForm(TForm1,Form1);
Form1.Show;

Так нормально?


 
Рыжик ©   (2002-10-21 15:56) [9]

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-22 11:43) [10]


> Action=caFree

Это что?


Рыжик, а если я делаю как я писал в AL2002 © (21.10.02 14:42) то это нормально. Ресурсы освобождаются?


 
Snake ©   (2002-10-22 12:09) [11]

Action=caFree - это уничтожение формы при закрытии. Как правило, применяется в диалогах и MDI-формах.


 
Restart   (2002-10-22 14:14) [12]


> AL2002 © (22.10.02 11:43)

Нормально. Освобождаются.
Application.CreateForm(TForm2,Form2) ~ Form2:=TForm2.Create(Application)



 
Restart   (2002-10-22 14:24) [13]

Ой, нет!
> Form1.Free;
> Application.CreateForm(TForm2,Form2);
> Form2.Show;


Может имелось в виду Form2.Free? А то, если Form2 уже есть, то у тебя получиться что создаётся ещё одна, а старая так и будет присутствовать среди Application.Components. И уничтожиться только при закрытии приложения.


 
Рыжик ©   (2002-10-22 14:27) [14]

Пардон, это я была ;)


 
AL2002 ©   (2002-10-22 17:11) [15]

>2Рыжик Aka Restart
Я нахожусь на форме1. Нажимаю кнопку.
> Form1.Free;
> Application.CreateForm(TForm2,Form2);
> Form2.Show;
И появляюсь на форме2.

И наоборот.

Нормально?


 
Рыжик ©   (2002-10-23 08:48) [16]

Ни чего не понимаю...
Хочешь сказать, что у тебя работает вот это:
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;


 
makdi   (2002-10-23 14:18) [17]

А не проще было бы сделать так:
Application.CreateForm(TForm2,Form2)
Form2.Show;
Form2.Update; // без него покажется форма, НО ни чего работать не будет!
.....
а в конце
Form2.Hide;
Form2.Free;
Ресурсы освобождаются полностью


 
Рыжик ©   (2002-10-23 14:43) [18]


> makdi (23.10.02 14:18)


> Form2.Update; // без него покажется форма, НО ни чего работать
> не будет!

Да ну?!


 
makdi   (2002-10-23 14:55) [19]

> Рыжик
> Да ну?!

Попробуй, о результатах сообщи


 
Рыжик ©   (2002-10-23 15:03) [20]


> makdi (23.10.02 14:55)

Результат: работает всё.
А что такое "ничего"?


 
AL2002 ©   (2002-10-24 21:43) [21]

>Результат: работает всё.
>А что такое "ничего"?
Кароче. Всё работает. Не надо никаких апдейтов.
Если (спасибо тебе, Рыжик) форма не существует, то она создаётся, а если уже существует, то показывается и ныкается, а не удаляется.

Рыжик, ты Мастер.



Страницы: 1 вся ветка

Текущий архив: 2002.11.04;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.013 c
1-11156
AlexeyMir
2002-10-24 14:12
2002.11.04
Hint на Scrole


14-11410
bobby
2002-10-12 18:54
2002.11.04
Как задать брекпоинт


1-11149
volph777
2002-10-24 12:26
2002.11.04
конвертирование даты


1-11186
Xia
2002-10-24 16:32
2002.11.04
bitmap.handle и loadbitmap


14-11411
me2
2002-10-14 14:15
2002.11.04
Где взять оболочку (IDE) для FreePascal?