![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
создать клон формы с компонентами
Rentgen © (2007-01-11 15:09:00)Всем привет!
Как можно создать клон созданной в DesignTime формы с компонентами и событиями?
может способ общедоступный какой есть?
BDS2006
Win2003
Anatoly Podgoretsky (2007-01-16 23:11:00) [1]> vidiv (16.01.2007 22:40:18) [18]
метод Free не увивает сам себя, он вообще никого не убивает, этим занимается деструктор Destroy
vidiv (2007-01-16 22:52:00) [2]А я против этого не возражаю. Я возражаю, что против того, что объект не может убивать сам себя
Palladin (2007-01-16 22:48:00) [3]
> [18] vidiv ©
при чем тут метод Free? я тебе говорю как правильно уничтожить объект формы при ее закрытии или по определенному событию... учитывая это можно не заботиться об обязательном явном вызове Free. объект уничтожится при закрытии. это очень удобно когда количество и время жизни некоторых окон приложения неизвестны.
vidiv (2007-01-16 22:40:00) [4]
> и они правы
а как же метод Free ?? Он как раз убивает сам себя, причем сам не является деструктором.
Palladin (2007-01-16 22:17:00) [5]
> но некоторые борцы за справедливость утверждают, что нельзя
> убивать объект собственным же обработчиком
и они правы, и если нужно уничтожить объект формы на событии OnClose формы "борцы за справедливость" включают в код этого события строчку
Action:=caFree;
vidiv (2007-01-16 21:44:00) [6]
> frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку.
> ..
какж ему догадаться, что за зверь такой, двойные кавычки =)
vidiv (2007-01-16 21:41:00) [7]
> Rentgen © (16.01.07 13:23) [13]
Мальчик?? А Мальчик? Оно тебе надо? Откуда? зачем? Меньше знаешь — дольше живешь =)
ЗЫ:Чтоб мой пост не удалили, скажу по теме:
var form:TForm2;
form := TForm2.Create(nil); // вместо nil можно указать хозяина формы...
form.label1.caption := 'Привет, Мальчик!'; // и компилятор знает, надо же
form.show();
только непонятно, где и когда ты будешь убивать форму, а ведь это надо будет сделать.
Можно при событии onclose убить форму (self.free), но некоторые борцы за справедливость утверждают, что нельзя убивать объект собственным же обработчиком. Да и к тому же тебе придется както отличить форму созданную тобой, от формы созданной автоматически.
И еще замечание: поскольку у твоей, вновь созданной, формы параметр name будет такойже как и у автоматически созданной формы, могут возникнуть траблы ;)
evvcom (2007-01-16 16:11:00) [8]Удалено модератором
Rentgen (2007-01-16 13:23:00) [9]Удалено модератором
Плохиш (2007-01-16 13:23:00) [10]
> frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку...
Ессно..., но не на то место, где ты поставил (?)
Elen (2007-01-16 13:22:00) [11]
> frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку.
Точно?
> в данной ситуации IDE Delphi видимо не знает, про lbStatus;
а где описан TfrmReader?
Rentgen (2007-01-16 13:12:00) [12]Елки палки...
вспомнил грабли то...
как мне свойства Компонентов на Созданной форме то менять?
procedure TfrmMain.FilesListDblClick(Sender: TObject);
var
frm:TfrmReader;
begin
frm:=TfrmReader.Create(Application);
frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку...
end;
в данной ситуации IDE Delphi видимо не знает, про lbStatus;
хотя может я незнаю чего то...
evvcom (2007-01-12 09:34:00) [13]> [8] Rentgen © (12.01.07 08:01)
> не nil, а Form2
Тогда будь готов к тому, что при убийстве Form2 твоя frmNew тоже неожиданно убьется. Обычно для формы передают Application.
Rentgen (2007-01-12 08:01:00) [14]не nil, а Form2
Rentgen (2007-01-12 08:00:00) [15]Всем спасибо!
чрезCreateя пробовал.
:) оказывается тупо тупил.
делал так:
var
f:TForm;
begin
f := TForm.Create(nil);
f.Show;
end;
т.е. я не указывалTForm2;
блин...
GrayFace (2007-01-12 02:09:00) [16]Rentgen © (11.01.07 15:16) [1]
Если посмотреть код TCustomForm.Create:
GlobalNameSpace.BeginWrite;
try
CreateNew(AOwner);
if (ClassType <> TForm) and not (csDesigning in ComponentState) then
begin
Include(FFormState, fsCreating);
try
if not InitInheritedComponent(Self, TForm) then
raise EResNotFound.CreateFmt(SResNotFound, [ClassName]);
finally
Exclude(FFormState, fsCreating);
end;
if OldCreateOrder then DoCreate;
end;
finally
GlobalNameSpace.EndWrite;
end;
То видно, что он вызывает CreteNew и делает кое-что еще. Это кое-что - загрузка .dfm-файла из ресурсов, при этом создаются все лейблы и т.п. Это если они созданы в Design-Time - просто замени CreateNew на Create.
Функции клонирования в VCL нет, есть возможность записи и чтения объектов из потока. Если надо скопировать свойства, измененные в Design-Time и компоненты, созданные в Design-Time, то
Form2:=TForm1.CreateNew(Application);
with TMemoryStream.Create do
try
WriteComponent(self);
Position:=0;
ReadComponent(Form2);
finally
Free;
end;
Здесь, как раз, нужен CreateNew, т.к. состояние формы мы читаем сами.
RASkov (2007-01-12 00:20:00) [17]procedure Form2.Button1Click();
var
frmNew:TForm2;
...
frmNew:= TForm2.Create(nil);
frmNew.ShowModal;
FreeAndNil(frmNew);
Alkid (2007-01-11 16:19:00) [18]Нет, не орех. Просто товарищ не понимает объектно-ориентированного программирования и как его форма с ним соотносится.
Автору топика:
Форма - это класс, который может иметь много экземпляров. Один создаётся по умолчанию и ты его видишь. Но могут быть и другие экземпляры.
Поучи объектно-ориентированное программирование и поймёшь глубинный смысл сказнного.
tesseract (2007-01-11 15:43:00) [19]
> Как можно создать клон созданной в DesignTime формы с компонентами
> и событиями?
Create вобще то создаёт форму со всеми контролами созданными в DesignTime. Вызываеться сколько хочешь раз.......
Орех ИМХО.
clickmaker (2007-01-11 15:27:00) [20]
> [1] Rentgen © (11.01.07 15:16)
ты справку-то почитай для начала по CreateNew, а?