Главная страница
    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.039 c
4-1115567827
alex_samus
2005-05-08 19:57
2005.06.29
Параметры программы


14-1117618035
peypivo
2005-06-01 13:27
2005.06.29
SMS марафон


14-1117712175
Gero
2005-06-02 15:36
2005.06.29
Что-то форум тормозит


14-1117391999
Layner
2005-05-29 22:39
2005.06.29
Свой макроязык


1-1118249091
terra0
2005-06-08 20:44
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский