![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массив указателей или компонентов? [D7, WinXP]
capkoh © (2005-06-06 22:23:00)Мне необходимо сделать массив компонентов, каждый из которых - наследник TObject. Массив создается во время работы программы. Вопрос в том, есть ли смысл в создании массива указателей на компоненты? Или же класс - это уже указатель и есть смысл сделать просто массив этих компонентов?
capkoh (2005-06-07 11:13:00) [1]Спасибо, теперь все встало на свои места.
Юрий Зотов (2005-06-07 01:07:00) [2]> 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;
jack128 (2005-06-06 22:44:00) [3]capkoh (06.06.05 22:23)
Мне необходимо сделать массив компонентов, каждый из которых - наследник TObject.
это какая то тавталогия. "Мне нужен список видов творога, каждый из которых - кисломолочный продукт".
Просто Джо (2005-06-06 22:25:00) [4]Че-то ничего не понятно из твоего вопроса. Но таки-да, экзмепляры классов - это таки указатели. Кроме того, на всякий случай посоветую использовать готовый компонент TObjectList а не массивы.