Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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]

Мальчик?? А Мальчик? Оно тебе надо? Откуда? зачем? Меньше знаешь &mdash; дольше живешь =)

ЗЫ:Чтоб мой пост не удалили, скажу по теме:

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.037 c
2-1171790032
VadimSpb
2007-02-18 12:13
2007.03.11
Создание текстового файла в ASCII


4-1160470572
AlexT1000
2006-10-10 12:56
2007.03.11
Запрет запуска приложений. Как реализовать?


1-1169107900
JohnKorsh
2007-01-18 11:11
2007.03.11
Раскладка клавиатуры.


15-1171371493
Vlad Oshin
2007-02-13 15:58
2007.03.11
cgi можно защитить от скачивания?


8-1152387424
!_SM_!
2006-07-08 23:37
2007.03.11
Звук из ресурса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский