Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.02.2017, 18:48
Martin Martin вне форума
Прохожий
 
Регистрация: 10.02.2017
Сообщения: 5
Версия Delphi: Embarcadero XE3
Репутация: 10
По умолчанию Как скопировать все контролы с одного tabsheet на все остальные?

Есть окно с одним tabsheet. На этот tabsheet программист ручками кидает произвольное число контролов (поля ввода чисел, строк, разные "галочки" и т.д.) со своими свойствами (в частности, эвентом OnChange, ссылающимся на определенные процедуры обработки).
Нужно программно сгенерировать определенное число tabsheets, куда программно скопировать контролы с первого tabsheet (визуально выглядящие и находящиеся на тех же местах, как и на первом tabsheet).
Смысл в том, чтобы вводить через разные однотипные контролы в разных однотипных tabsheets данные в массивы параметров.
Как это можно сделать?
Попробовал сделать так:
Код:
    for i := 0 to TabSheet16.ComponentCount - 1 do
    begin
        contr := TCustomControl.Create(self);
        contr.Assign(TabSheet16.Components[i] as TCustomControl);
        contr.Parent := TabSheet17;
    end;
- результат пустой.
Изображения
Тип файла: jpg tabsheets.JPG (27.5 Кбайт, 4 просмотров)

Последний раз редактировалось Martin, 10.02.2017 в 19:06.
Ответить с цитированием
  #2  
Старый 10.02.2017, 20:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Заставить программиста "кидать" контролы на фрейм, а потом в ран-тайм просто создавать фрейм целиком и "класть" его на табшит.
Ответить с цитированием
  #3  
Старый 10.02.2017, 20:25
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

В моем примере контролы одной панели полностью копируются на вторую панель.
Код:
uses
  TypInfo;

procedure CopyObject(ObjFrom, ObjTo: TObject);
var
  PropInfos: PPropList;
  PropInfo: PPropInfo;
  Count, Loop: Integer;
  OrdVal: Longint;
  StrVal: String;
  FloatVal: Extended;
  MethodVal: TMethod;
begin
  Count := GetPropList(ObjFrom.ClassInfo, tkAny, nil);
  GetMem(PropInfos, Count * SizeOf(PPropInfo));
  try
    GetPropList(ObjFrom.ClassInfo, tkAny, PropInfos);
    for Loop := 0 to Count - 1 do
    begin
      PropInfo := GetPropInfo(ObjTo.ClassInfo, PropInfos^[Loop]^.Name);
      case PropInfos^[Loop]^.PropType^.Kind of
        tkInteger, tkChar, tkEnumeration,
        tkSet, tkClass{$ifdef Win32}, tkWChar{$endif}:
        begin
          OrdVal := GetOrdProp(ObjFrom, PropInfos^[Loop]);
          if Assigned(PropInfo) then
            SetOrdProp(ObjTo, PropInfo, OrdVal);
        end;
        tkFloat:
        begin
          FloatVal := GetFloatProp(ObjFrom, PropInfos^[Loop]);
          if Assigned(PropInfo) then
            SetFloatProp(ObjTo, PropInfo, FloatVal);
        end;
        {$ifndef DelphiLessThan3}
        tkWString,
        {$endif}
        {$ifdef Win32}
        tkLString,
        {$endif}
        tkString:
        begin
          { components must have unique names }
          if UpperCase(PropInfos^[Loop]^.Name) = 'NAME' then
            Continue;
          StrVal := GetStrProp(ObjFrom, PropInfos^[Loop]);
          if Assigned(PropInfo) then
            SetStrProp(ObjTo, PropInfo, StrVal);
        end;
        tkMethod:
        begin
          MethodVal := GetMethodProp(ObjFrom, PropInfos^[Loop]);
          if Assigned(PropInfo) then
            SetMethodProp(ObjTo, PropInfo, MethodVal);
        end
      end
    end
  finally
    FreeMem(PropInfos, Count * SizeOf(PPropInfo));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Original, Clone: TControl;
  OriginalClass: TClass;
  i: integer;
begin
  for i := 0 to Panel1.ControlCount - 1 do
  begin
    Original := Panel1.Controls[i];
    OriginalClass := Original.ClassType;
    Clone := TControlClass(OriginalClass).Create(Original.Owner);
    Clone.Parent := Panel2;
    CopyObject(Original, Clone);
  end;
end;

Для изучения: RTTI
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #4  
Старый 10.02.2017, 20:31
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от lmikle
Заставить программиста "кидать" контролы на фрейм, а потом в ран-тайм просто создавать фрейм целиком и "класть" его на табшит.
Тоже сначала подумал про фрейм, но как-то вопрос вроде "как скопировать"...
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #5  
Старый 10.02.2017, 23:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от dr. F.I.N.
Тоже сначала подумал про фрейм, но как-то вопрос вроде "как скопировать"...

Я тоже сначала подумал о честном копировании. Остановили меня 2 вещи:
1. В конце указано зачем это надо. Т.е. задача не скопировать контролы, а минимизировать ручную работу при разработке.
2. Там что-то говорилось про обработчики событий. А вот это уже road block для простого копирования, т.к. скорее всего обработчик завязан на конкретный контрол. Мало кто пишет обработчики без прямой адресации контролов с самого начала. Соответственно, фрейм более универсальное решение в таком случае.
Ответить с цитированием
  #6  
Старый 11.02.2017, 11:37
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от lmikle
Я тоже сначала подумал о честном копировании. Остановили меня 2 вещи:
1. В конце указано зачем это надо. Т.е. задача не скопировать контролы, а минимизировать ручную работу при разработке.
2. Там что-то говорилось про обработчики событий. А вот это уже road block для простого копирования, т.к. скорее всего обработчик завязан на конкретный контрол. Мало кто пишет обработчики без прямой адресации контролов с самого начала. Соответственно, фрейм более универсальное решение в таком случае.
П.1 - Я отталкивался не только от слова "копировать", но и от наброска ТС.
П.2 - Тут абсолютно согласен. Если в методе контрола идет работа с неабстрагированным контролом, то и клон будет работать с теми же контролами.

А посоветовать фреймы мне показалось очень банальным Да и ты уже их посоветовал
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.

Последний раз редактировалось dr. F.I.N., 11.02.2017 в 11:46.
Ответить с цитированием
  #7  
Старый 21.02.2017, 14:47
Martin Martin вне форума
Прохожий
 
Регистрация: 10.02.2017
Сообщения: 5
Версия Delphi: Embarcadero XE3
Репутация: 10
По умолчанию

Всем спасибо, использовал TabControl.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:50.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter