Форум: "Основная";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Внизсоздать клон формы с компонентами Найти похожие ветки
← →
Rentgen © (2007-01-11 15:09) [0]Всем привет!
Как можно создать клон созданной в DesignTime формы с компонентами и событиями?
может способ общедоступный какой есть?
BDS2006
Win2003
← →
Rentgen © (2007-01-11 15:16) [1]пробовал так:
var
frmNew:TForm;
...
frmNew:= TForm2.CreateNew(Form2);
frmNew.Show;
***
выходит пустое окно.
хотя на клонруемом есть лэйблы.
← →
clickmaker © (2007-01-11 15:27) [2]
> [1] Rentgen © (11.01.07 15:16)
ты справку-то почитай для начала по CreateNew, а?
← →
tesseract © (2007-01-11 15:43) [3]
> Как можно создать клон созданной в DesignTime формы с компонентами
> и событиями?
Create вобще то создаёт форму со всеми контролами созданными в DesignTime. Вызываеться сколько хочешь раз.......
Орех ИМХО.
← →
Alkid © (2007-01-11 16:19) [4]Нет, не орех. Просто товарищ не понимает объектно-ориентированного программирования и как его форма с ним соотносится.
Автору топика:
Форма - это класс, который может иметь много экземпляров. Один создаётся по умолчанию и ты его видишь. Но могут быть и другие экземпляры.
Поучи объектно-ориентированное программирование и поймёшь глубинный смысл сказнного.
← →
RASkov (2007-01-12 00:20) [5]procedure Form2.Button1Click();
var
frmNew:TForm2;
...
frmNew:= TForm2.Create(nil);
frmNew.ShowModal;
FreeAndNil(frmNew);
← →
GrayFace © (2007-01-12 02:09) [6]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, т.к. состояние формы мы читаем сами.
← →
Rentgen © (2007-01-12 08:00) [7]Всем спасибо!
чрезCreate
я пробовал.
:) оказывается тупо тупил.
делал так:var
f:TForm;
begin
f := TForm.Create(nil);
f.Show;
end;
т.е. я не указывалTForm2
;
блин...
← →
Rentgen © (2007-01-12 08:01) [8]не nil, а Form2
← →
evvcom © (2007-01-12 09:34) [9]> [8] Rentgen © (12.01.07 08:01)
> не nil, а Form2
Тогда будь готов к тому, что при убийстве Form2 твоя frmNew тоже неожиданно убьется. Обычно для формы передают Application.
← →
Rentgen © (2007-01-16 13:12) [10]Елки палки...
вспомнил грабли то...
как мне свойства Компонентов на Созданной форме то менять?procedure TfrmMain.FilesListDblClick(Sender: TObject);
var
frm:TfrmReader;
begin
frm:=TfrmReader.Create(Application);
frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку...
end;
в данной ситуации IDE Delphi видимо не знает, про lbStatus;
хотя может я незнаю чего то...
← →
Elen © (2007-01-16 13:22) [11]
> frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку.
Точно?
> в данной ситуации IDE Delphi видимо не знает, про lbStatus;
а где описан TfrmReader?
← →
Плохиш © (2007-01-16 13:23) [12]
> frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку...
Ессно..., но не на то место, где ты поставил (?)
← →
Rentgen © (2007-01-16 13:23) [13]Удалено модератором
← →
evvcom © (2007-01-16 16:11) [14]Удалено модератором
← →
vidiv © (2007-01-16 21:41) [15]
> Rentgen © (16.01.07 13:23) [13]
Мальчик?? А Мальчик? Оно тебе надо? Откуда? зачем? Меньше знаешь — дольше живешь =)
ЗЫ:Чтоб мой пост не удалили, скажу по теме:
var form:TForm2;
form := TForm2.Create(nil); // вместо nil можно указать хозяина формы...
form.label1.caption := "Привет, Мальчик!"; // и компилятор знает, надо же
form.show();
только непонятно, где и когда ты будешь убивать форму, а ведь это надо будет сделать.
Можно при событии onclose убить форму (self.free), но некоторые борцы за справедливость утверждают, что нельзя убивать объект собственным же обработчиком. Да и к тому же тебе придется както отличить форму созданную тобой, от формы созданной автоматически.
И еще замечание: поскольку у твоей, вновь созданной, формы параметр name будет такойже как и у автоматически созданной формы, могут возникнуть траблы ;)
← →
vidiv © (2007-01-16 21:44) [16]
> frm.(?)lbStatus.Caption := "Test"; //ессно выдает ошибку.
> ..
какж ему догадаться, что за зверь такой, двойные кавычки =)
← →
Palladin © (2007-01-16 22:17) [17]
> но некоторые борцы за справедливость утверждают, что нельзя
> убивать объект собственным же обработчиком
и они правы, и если нужно уничтожить объект формы на событии OnClose формы "борцы за справедливость" включают в код этого события строчку
Action:=caFree;
← →
vidiv © (2007-01-16 22:40) [18]
> и они правы
а как же метод Free ?? Он как раз убивает сам себя, причем сам не является деструктором.
← →
Palladin © (2007-01-16 22:48) [19]
> [18] vidiv ©
при чем тут метод Free? я тебе говорю как правильно уничтожить объект формы при ее закрытии или по определенному событию... учитывая это можно не заботиться об обязательном явном вызове Free. объект уничтожится при закрытии. это очень удобно когда количество и время жизни некоторых окон приложения неизвестны.
← →
vidiv © (2007-01-16 22:52) [20]А я против этого не возражаю. Я возражаю, что против того, что объект не может убивать сам себя
← →
Anatoly Podgoretsky © (2007-01-16 23:11) [21]> vidiv (16.01.2007 22:40:18) [18]
метод Free не увивает сам себя, он вообще никого не убивает, этим занимается деструктор Destroy
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.03.11;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.041 c