Форум: "Основная";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];
ВнизМассив указателей или компонентов? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.05 c