Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите написать чёткий код / 5 сообщений из 5, страница 1 из 1
02.02.2019, 03:51
    #39768598
FIL23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать чёткий код
Добрых суток,

Пишу код динамического создания компонентов разных типов.
Суть кода. Создается динамический массив, в нем размещаются ссылки на динамические компоненты.
Динамические компоненты могут быть родителями или подчинятся форме.
Так же у динамических компонент есть одинаковые свойства.

Так вот вопрос как сократить код, дабы при создании каждого типа компонента не писать почти один и тот же код?
Спасибо.

В примере TGroupBox и TEdit
Код: 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.
var
 masElementsOfTemplate: array of TObject

...

procedure TfmTemplateOfInventory.CreateObjectOfInventory(TypeOfObject:string);
var
perLengthMasElementsOfTemplate:integer;                                                   
begin
perLengthMasElementsOfTemplate:= Length(masElementsOfTemplate) + 1;
SetLength(masElementsOfTemplate, perLengthMasElementsOfTemplate);               

if TypeOfObject='TGroupBox' then
  begin
  if perSender = nil then                                                         
    masElementsOfTemplate[perLengthMasElementsOfTemplate-1]:= TGroupBox.Create(fmTemplateOfInventory)
      else masElementsOfTemplate[perLengthMasElementsOfTemplate-1]:= TGroupBox.Create(perSender as TGroupBox);

  if perSender = nil then                                                         
    (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).Parent:=GroupBuilding      
      else  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).Parent:=(perSender as TGroupBox); 

  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).Name          :='GroupBox'+ inttostr(perLengthMasElementsOfTemplate); 
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).Caption       :='GroupBox'+ inttostr(perLengthMasElementsOfTemplate);
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).OnMouseDown   :=fmTemplateOfInventory.MouseDown;
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).OnMouseMove   :=fmTemplateOfInventory.MouseMove;
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).OnMouseUp     :=fmTemplateOfInventory.MouseUp;
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TGroupBox).OnDblClick    :=fmTemplateOfInventory.DblClick;
  end;

if TypeOfObject='TEdit' then
  begin
  if perSender = nil then                                                        
    masElementsOfTemplate[perLengthMasElementsOfTemplate-1]:= TEdit.Create(fmTemplateOfInventory)
      else masElementsOfTemplate[perLengthMasElementsOfTemplate-1]:= TEdit.Create(perSender as TEdit); 

  if perSender = nil then                                                         
    (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).Parent:=GroupBuilding      
      else  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).Parent:=(perSender as TEdit); 

  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).Name          :='Edit'+ inttostr(perLengthMasElementsOfTemplate); 
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).Text          :='Edit'+ inttostr(perLengthMasElementsOfTemplate);
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).OnMouseDown   :=fmTemplateOfInventory.MouseDown;
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).OnMouseMove   :=fmTemplateOfInventory.MouseMove;
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).OnMouseUp     :=fmTemplateOfInventory.MouseUp;
  (masElementsOfTemplate[perLengthMasElementsOfTemplate-1] as TEdit).OnDblClick    :=fmTemplateOfInventory.DblClick;
  end;


SelectComponent(masElementsOfTemplate[perLengthMasElementsOfTemplate-1]);
end;
...
Рейтинг: 0 / 0
02.02.2019, 06:36
    #39768607
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать чёткий код
FIL23Добрых суток,

Пишу код динамического создания компонентов разных типов.
Суть кода. Создается динамический массив, в нем размещаются ссылки на динамические компоненты.
Динамические компоненты могут быть родителями или подчинятся форме.
Так же у динамических компонент есть одинаковые свойства.

Если массив компонентов, то его и следут объявить как array of TComponent.
Еще посмотрите функцию GetClass.
Примерный код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var 
  Obj:TComponent;
  ow:TComponent;
begin
  if perSender=nil then ow:=fmTemplateOfInventory else ow:=perSender;
  Obj:=GetClass(TypeOfObject).Create(ow);
  if (Obj is TControl) then
  with Obj as TContol do
  begin
    Name:=....
    Caption:=...
    ....
  end;
  //Добавить Obj в массив
end;
...
Рейтинг: 0 / 0
02.02.2019, 15:45
    #39768690
swame2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать чёткий код
FIL23,
1. Массив компонент не нужен. Форма сама является контейнером для созданных компонентов.
2. Код создания компонента обернуть в метод с параметрами
...
Рейтинг: 0 / 0
04.02.2019, 16:43
    #39769321
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать чёткий код
Делайте каждому компоненту отдельную процедуру для создания, т.к. общего у них не так много. Все равно ничего не съекономите.
И такой код будет гораздо более читабельнее.
Я храню XML с настройками. Парсер зачитывает и создает на форме все что нужно.
В дизайне XML наполняется настройками, где нет ничего лишнего.

При желании можно допилить, чтобы логика создания была более сложной.
...
Рейтинг: 0 / 0
04.02.2019, 18:57
    #39769386
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать чёткий код
FIL23,
ReadComponent переизобретаешь?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Помогите написать чёткий код / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]