Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 4
1

Как программно дублировать форму с компонентами на ней?

27.02.2012, 20:23. Показов 3532. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Я пишу мини инспектор объетов как в delphi и надо программно продублировать форму вместе со всеми компонентами. Копирование файла dfm не предлагать. Допустим
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    BinStream := TMemoryStream.Create;
    try
      FileStream := TFileStream.Create(SaveDialog.FileName, fmOpenWrite or fmCreate);
      try
        NewForm := TfmNewForm.Create(Self);
        NewForm := TfmNewForm(ActiveMDIChild); // тут я копирую только свойство самой формы,
                                                        // без компонентов, правильно?
        NewForm.FormStyle := fsNormal;              // ставлю нужное мне свойство
        .... // удаляю прочие лишние события формы
 
        // а вот теперь нужно перенести на NewForm все компоненты из ActiveMDIChild
        for i := 0 to ActiveMDIChild.ControlCount - 1 do
        begin
          // как здесь правильно сделать ? т.к. вылетает с ошибкой "list index out of bound (3)"
          NewControl := TControl.Create(Self);
          NewControl := ActiveMDIChild.Controls[i];
          NewControl.Parent := NewForm;
        end;
        // записываю всю форму с компонентами
        BinStream.WriteComponent(NewForm);
        BinStream.Seek(0, soFromBeginning);
        ObjectBinaryToText(BinStream, FileStream);
        NewForm.Free;
      finally
        FileStream.Free;
      end;
    finally
      BinStream.Free
    end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2012, 20:23
Ответы с готовыми решениями:

Как полностью удалить форму со всеми компонентами на ней и очистить память кодом
Как полностью удалить форму со всеми компонентами на ней и очистить память кодом.

Программно открыть книгу и форму в ней
здравствуйте, токая проблема: Есть книга открываю книгу, вылезает форма типа "начать новый рабочий...

Программно создать форму, кнопки на ней и сохранить в проекте
Если возможно, то хотелось бы иметь код для простенького примера по этому запросу

Как дублировать форму?
Возможно ли в VS 2012 дублировать форму? Т.е. есть какая-либо форма, в конструкторе задаются...

6
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
27.02.2012, 20:47 2
Я пишу мини инспектор объетов как в delphi
не ясна задача. по-подробней пожалуйста.
0
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 4
27.02.2012, 22:03  [ТС] 3
Дык всю задачу я изложил в коде с комментариями. Т.е. непонятен сам принцип дублирования формы.
0
1302 / 708 / 107
Регистрация: 25.05.2011
Сообщений: 2,158
Записей в блоге: 51
28.02.2012, 01:17 4
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function FormClone(formparent:pointer):pointer; // фукнция клонирует любую форму
 var
    ms : TMemoryStream;
 begin
    ms := TMemoryStream.Create;
    try
      ms.WriteComponent(formparent) ;
      ms.Position := 0;
      Result := TFormClass(TForm(formparent).ClassType).CreateNew(Application) ;
      ms.ReadComponent( Result) ;
      //Result.Left := TForm(formparent).Left + 10;
      // Result.Top := TForm(formparent).Top + 10;
      // Result.Show;
    finally
      ms.Free;
    end;
 end;
пример

Delphi
1
2
3
4
5
6
procedure TForm1.Button2Click(Sender: TObject);
var f: TForm1;
begin
  f:=FormClone(self);
  //f.Show;
end;
1
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 4
28.02.2012, 08:14  [ТС] 5
Спасибо! Работает!
0
Житель Земли
3002 / 3004 / 391
Регистрация: 26.07.2011
Сообщений: 11,463
Записей в блоге: 1
28.02.2012, 10:46 6
а зачем такие сложности? не лучше ли создать еще один экземпляр нужной формы, или так не подойдет?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  NewForm: TForm1;
begin
  NewForm:= TForm1.Create(Application);
  NewForm.Show;
end;
 
end.
0
0 / 0 / 0
Регистрация: 27.02.2012
Сообщений: 4
28.02.2012, 14:39  [ТС] 7
Нет, у меня, я поправлюсь, не просто инспектор объектов, а дизайнер форм. При редактировании формы мне надо чтобы в dfm файлик форма записалась в "чистом" виде: только форма и контролы. Без всяких там событий и ненужных компонентов, типа TSizeCtrl. Поэтому, переделав вышеупомянутый пример, сделал так. Именно сохранение формы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
procedure TfmMainForm.SaveFromMainMenu1Click(Sender: TObject);
var
  BinStream  : TMemoryStream;
  FileStream : TFileStream;
  i          : Integer;
  NewForm    : TForm;
 
   function ControlClone(p : pointer; Comp: TComponent): pointer;
   var
      ms : TMemoryStream;
   begin
      ms := TMemoryStream.Create;
      try
        ms.WriteComponent(p) ;
        ms.Position := 0;
        Result := TControlClass(TControl(p).ClassType).Create(Comp);
        ms.ReadComponent( Result) ;
      finally
        ms.Free;
      end;
   end;
 
begin
  if SaveDialog.Execute then
  begin
    BinStream := TMemoryStream.Create;
    try
      FileStream := TFileStream.Create(SaveDialog.FileName, fmOpenWrite or fmCreate);
      try
        NewForm           := TForm.Create(Self);
        // ActiveMDIChild - форма, где проводилось редактирование, в ней куча ненужных событий и компонентов 
        // берем только нужное 
        NewForm.Left      := TfmNewForm(ActiveMDIChild).Left;
        NewForm.Top       := TfmNewForm(ActiveMDIChild).Top;
        NewForm.Width     := TfmNewForm(ActiveMDIChild).Width;
        NewForm.Height    := TfmNewForm(ActiveMDIChild).Height;
        for i:=0 to TfmNewForm(ActiveMDIChild).ControlCount-1 do
        begin
          // копируем контролы
          NewForm.InsertControl(ControlClone(ActiveMDIChild.Controls[i], NewForm));
        end;
        BinStream.WriteComponent(NewForm);
        BinStream.Seek(0, soFromBeginning);
        ObjectBinaryToText(BinStream, FileStream);
        NewForm.Free;
      finally
        FileStream.Free;
      end;
    finally
      BinStream.Free
    end;
  end;
end;
Вот теперь работает как надо!
0
28.02.2012, 14:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2012, 14:39
Помогаю со студенческими работами здесь

Как правильно дублировать форму, но загрузить в нее уже другие данные
Здравствуйте, такой вопрос: У меня в программе должны быть две вкладки с одинаковым содержимым:...

Autorun. Как сделать невилимую форму с видимыми компонентами?
Если кто подскажет как заставить Delphi делать форму прозрачной, или невидимой, но с доступными...

Дублировать существующую форму
Всем привет! Не могу справиться. :wall: Есть существующая форма мне нужно чтобы она открывалась в...

Как программно узнать версию java и путь к ней
Не могу найти код как узнать путь к java и версию ее, кто может помочь?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru