Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1118263862
Кирилл Гумилев
2005-06-09 00:51
2005.06.29
Удаление Excel-столбца


14-1117181522
TUser
2005-05-27 12:12
2005.06.29
Уплотнение элементов в памяти


1-1117708355
BasiL_666_
2005-06-02 14:32
2005.06.29
Unable to invoke....


1-1118063196
Иван П.
2005-06-06 17:06
2005.06.29
Первое-последнее число текущего месяца в DateTimePicker


1-1118062914
Олег из Москвы
2005-06-06 17:01
2005.06.29
Непонятные ошибки.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский