![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Здравствуйте, у меня вопрос, с которым вот уже несколько дней не могу разобраться.
Переделал всё на максимально простой уровень, чтобы всем было понятно. Допустим у нас есть процедура: ---------- Случай 1 ---------- Код:
Procedure AddObject; var myObject:TButton; begin myObject:=TButton.Create(Form1); myObject.Caption:='Test Button'; myObject.Parent:=Form1; AddToList(myObject); // и т.п. end; может нужно как-то создать массив, в котором будут указатели(но у меня не получается) ![]() ---------- Случай 2 ---------- Если этот объект объявлен в глобальных переменных: Код:
var myObject:TButton; Ptr:^TButton; Код:
Procedure AddToList(var Obj:TButton); begin Ptr:=Addr(Obj); end; Procedure AddObject; begin myObject:=TButton.Create(Form1); myObject.Caption:='Test Button'; myObject.Parent:=Form1; AddToList(myObject); // и т.п. end; Procedure DeleteObj; begin FreeAndNil(Ptr^); end; ______________________ немного другой вопрос: ---------- Случай 3 ---------- допустим у нас это переменная глобальная: Код:
var myObject:TButton; Код:
var // глобальные переменные myObject:TButton; Ptr:array[1..100] of ^TButton; Count:Integer; Код:
Procedure AddToList(var Obj:TButton); begin Inc(Count); Ptr[Count]:=Addr(Obj); end; Procedure AddObject; begin myObject:=TButton.Create(Form1); myObject.Caption:='Test Button'+IntToStr(Random(1000)); myObject.Parent:=Form1; myObject.Left:=Random(100); MyObject.Top:=Random(50); AddToList(myObject); // и т.п. end; Procedure DeleteObj; var i:integer; begin For i:=1 to Count do FreeAndNil(Ptr[i]^); end; ![]() Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей ![]() Последний раз редактировалось Oleg, 17.08.2009 в 20:34. Причина: возник вопрос, который не дает покоя :( |
#2
|
||||
|
||||
![]() Сделал вот так:
Код:
var Ptr:array[1..100] of ^TButton; Count:Integer; //========================== Procedure AddToList(var Obj:TButton); begin Inc(Count); Ptr[Count]:=Addr(Obj); end; Procedure AddObject; var myObject:^TButton; begin new(myObject); myObject^:=TButton.Create(Form1); myObject^.Caption:='Test Button'+IntToStr(Random(1000)); myObject^.Parent:=Form1; myObject^.Left:=Random(100); MyObject^.Top:=Random(50); AddToList(myObject^); // и т.п. end; Procedure DeleteObj; var i:integer; begin For i:=1 to Count do FreeAndNil(Ptr[i]^); end; Код:
Procedure DeleteObj; var i:integer; begin For i:=1 to Count do IF Assigned(Ptr[i]) and Assigned(Ptr[i]^) then begin FreeAndNil(Ptr[i]^); Dispose(Ptr[i]); Ptr[i]:=nil; end; end; ![]() Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей ![]() Последний раз редактировалось Oleg, 17.08.2009 в 22:38. |
#3
|
||||
|
||||
![]() У всез компонентов есть своейство Components b и ComponentsCount;
Создай например глобальный объект ButtonOwner : TComponent; (не забудь создать в процедуре onCreate) Код:
Procedure AddObject; var myObject:TButton; begin myObject:=TButton.Create(ButtonOwner); myObject.Caption:='Test Button'; myObject.Parent:=Form1; // и т.п. end; Код:
if ButtonOwner.ComponentsCount <> 0 then ButtonOwner.Components[ButtonOwner.ComponentsCount - 1].Free; Но лучший вариант - воспользоваться списками TList или TObjList ...сказал, и загрустил от бесспорной своей правоты |
#4
|
||||
|
||||
![]() >> 0nni
так не пойдет, я кнопку взял лишь для примера, у меня свои классы другие. Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей ![]() |
#5
|
||||
|
||||
![]() Замени класс TButton на любой другой класс, в чем проблема?
...сказал, и загрустил от бесспорной своей правоты |
#6
|
||||
|
||||
![]() Сделай вот такие изменения и все будет работать с локальным объектом.
Код:
Ptr:array[1..100] of TButton; Ptr:TButton; Код:
Procedure AddToList(Obj:TButton); begin Ptr:=Obj end; Код:
Procedure DeleteObj; var i:integer; begin For i:=1 to Count do FreeAndNil(Ptr[i]); end; Вообще не мешало бы тебе почитать что есть указатель, что есть локальная переменная и почему указатель на него не рекомендутеся передавать, и что такое объект и почему указатель PObject = ^TObject - это глупо. ...сказал, и загрустил от бесспорной своей правоты |