Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

Массив указателей или компонентов?   Найти похожие ветки 

 
capkoh   (2005-06-06 22:23) [0]

Мне необходимо сделать массив компонентов, каждый из которых - наследник TObject. Массив создается во время работы программы. Вопрос в том, есть ли смысл в создании массива указателей на компоненты? Или же класс - это уже указатель и есть смысл сделать просто массив этих компонентов?


 
Просто Джо ©   (2005-06-06 22:25) [1]

Че-то ничего не понятно из твоего вопроса. Но таки-да, экзмепляры классов - это таки указатели. Кроме того, на всякий случай посоветую использовать готовый компонент TObjectList а не массивы.


 
jack128 ©   (2005-06-06 22:44) [2]

capkoh   (06.06.05 22:23)
Мне необходимо сделать массив компонентов, каждый из которых - наследник TObject.

это какая то тавталогия. "Мне нужен список видов творога, каждый из которых - кисломолочный продукт".


 
Юрий Зотов ©   (2005-06-07 01:07) [3]

> capkoh   (06.06.05 22:23)  

Класс - это указатель, но не тот, который Вам нужен. Класс указывает на VMT, а Вам нужен другой указатель - на объект. То есть, на экземпляр класса.

var
 C: TComponent;
begin
 C := TComponent.Create(...);
 ...


Идентификатор TComponent - это класс, тип переменной C. Но он же и указатель на VMT класса TComponent.

Переменная С - это экземпляр класса TComponent. Но она же и указатель на место в памяти, где размещен этот экземпляр.

Поэтому делать указатели на компоненты не нужно - получатся указатели на указатели. Нужно сделать просто массив экземпляров компонентов - это и будет массив указателей.

var
 A: array of TComponent;

function AddComponent(ComponentClass: TComponentClass;
 Owner: TComponent; Parent: TWinControl = nil): TComponent;
begin
 Result := ComponentClass.Create(Owner);
 try
   if (Result is TControl) and (Parent <> nil) then
     TControl(Result).Parent := Parent;
   SetLength(A, Length(A) + 1);
   A[High(A)] := Result
 except
   FreeAndNil(Result);
   raise
 end
end;

Пример использования:

type
 TFriendControl = class(TControl); // Дает доступ к protected

procedure TForm1.Button1Click(Sender: TObject);

 procedure CreateControl(ControlClass: TControlClass);
 begin
   with TFriendControl(AddComponent(ControlClass, Self, Self)) do
   begin
     SetBounds(Random(Self.ClientWidth - Width),
       Random(Self.ClientHeight - Height), Width, Height);
     Color := Random(clWhite)
   end
 end;

begin
 if Menu = nil then
 begin
   Menu := TMainMenu(AddComponent(TMainMenu, Self));
   Menu.Items.Add(NewItem("Button1Click", 0, False, True, Button1Click, 0, ""));
   InsertComponent(Menu.Items[0]);
   Randomize
 end;
 CreateControl(TEdit);
 CreateControl(TComboBox)
end;


 
capkoh   (2005-06-07 11:13) [4]

Спасибо, теперь все встало на свои места.



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.04 c
9-1110944584
Кенвертнуть
2005-03-16 06:43
2005.06.29
Как или чем конвертнуть модельки из Max и Maya в 3ds ?


1-1117605664
mmms
2005-06-01 10:01
2005.06.29
Помогите разобрать строку, нужно взять только цифры с "конца"


1-1118226809
Руслан
2005-06-08 14:33
2005.06.29
обновить DBGrid


4-1114683614
psa247
2005-04-28 14:20
2005.06.29
Корзина Windows


3-1116331690
Гость2
2005-05-17 16:08
2005.06.29
Вопрос по SQL-запросу