Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Как правильно (!) создать форму?


Автор: Тутанхамец 22.10.2006, 09:01
Хочу написать маленькую прогу, которая создает формы и контролы кодом. Начал с создания формы.  

Код

program Project1;

uses
  Forms, Unit1 in 'Unit1.pas' {Form1};

{$R *.res}
var
  MyForm:TForm;
begin
 // Application.Initialize;
  MyForm:=TForm.Create(Application);
  MyForm.Width:=100;
  MyForm.Height:=100;
//  Application.Run;
  MyForm.showmodal;
  MyForm.Free;
end.


Вопрос. Насколько правильно я это делаю? Нужны ли вызовы Initialize и  Run? Если нужны, то перед showmodal или после?

И есть ли способы сделать это лучше? 

Заранее благодарен. 


Автор: Matematik 22.10.2006, 10:30
Код

MyForm := nil
try
  MyForm :=TForm.Create(Application);
  MyForm.Width:=100;
  MyForm.Height:=100;
  MyForm.showmodal;
finally
  MyForm.Free;
end

все

Автор: digs 22.10.2006, 10:45
Matematik
Ну и конструкция!
если уверен, что TForm.Create ошибок не даст, надо ставить эту строку до try, а если есть вероятность ошибки, тогда то что в finally... ну сам понимаешь

Автор: Matematik 22.10.2006, 11:07
Цитата(digs @  22.10.2006,  11:45 Найти цитируемый пост)
тогда то что в finally... ну сам понимаешь 

не понимаю

Автор: DarlkElfTen 22.10.2006, 11:17
Код

MyForm := nil
try
  MyForm :=TForm.Create(Application);
  MyForm.Width:=100;
  MyForm.Height:=100;
  MyForm.showmodal;
finally
  MyForm.Free;
end


Цитата

MyForm :=TForm.Create(Application);
-создание формы

Цитата

finally
  MyForm.Free;

это ведь если она создана можно вызывати?
=> он сказал, что  нада делатьпримерно так

Код

MyForm := nil
MyForm :=TForm.Create(Application);
try
  MyForm.Width:=100;
  MyForm.Height:=100;
  MyForm.showmodal;
finally
  MyForm.Free;
end

Автор: digs 22.10.2006, 11:48
Matematik
Что тут не ясного? Если TForm.Create даст ошибку, то в разделе finally будет конструкция nil.Free

Автор: Тутанхамец 22.10.2006, 12:14
Спасибо всем, про try я как-то не подумал.

А MyForm:=nil обязательно? Если TForm.create выполнится, то в MyForm будет форма. Если не выполнится, то nil. Или я не прав?

Автор: DarlkElfTen 22.10.2006, 12:38
не понял
а при взове nill.free  не будет аксес вуалэишн ???
если будет то  в моем посте правильный кодеГ)

Автор: Alexeis 22.10.2006, 12:44
Цитата(Тутанхамец @  22.10.2006,  12:14 Найти цитируемый пост)
MyForm:=nil

Нужно для того, чтобы знать выделена ли память под форму или нет. Если выделена, то ее нужно освободить, если нет, нельзя освобождать иначе будет ошибка "Access violation read adress nnnn...."

Добавлено @ 12:46 
Цитата(DarlkElfTen @  22.10.2006,  12:38 Найти цитируемый пост)
а при взове nill.free  не будет аксес вуалэишн ???

Не так! 
TForm.free;

Добавлено @ 12:51 
код VCL
Код

procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;

Автор: DarlkElfTen 22.10.2006, 12:51
дык, так в итог у формы нилл !!!!!!!!

Автор: digs 22.10.2006, 13:26
Цитата(DarlkElfTen @  22.10.2006,  12:38 Найти цитируемый пост)
не понял
а при взове nill.free  не будет аксес вуалэишн ???
если будет то  в моем посте правильный кодеГ)

У тебя все нормально. Я говорил про конструкцию:

Код

MyForm := nil    
try    
  MyForm :=TForm.Create(Application);    
  ...
finally    
  MyForm.Free;    
end

Автор: Тутанхамец 22.10.2006, 14:01
Всё. Понял. Спасибо.

Автор: Bose 23.10.2006, 12:28
только лучше не  
Код

MyForm.Free;    


а

Код

MyForm.Release;    


в данном случае, форма не закроется раньше чем обработает все сообщения(если не ошибаюсь)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)