Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.08.2009, 00:16
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Вопрос Удаление переменных

Здравствуйте, у меня вопрос, с которым вот уже несколько дней не могу разобраться.
Переделал всё на максимально простой уровень, чтобы всем было понятно.
Допустим у нас есть процедура:
----------
Случай 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  
Старый 17.08.2009, 22:10
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
По умолчанию Продвижение...

Сделал вот так:
Код:
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  
Старый 18.08.2009, 06:30
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

У всез компонентов есть своейство 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;
Для удаления всех кнопок есть мтоде FreeAllComponents (если не путаю).

Но лучший вариант - воспользоваться списками TList или TObjList
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #4  
Старый 18.08.2009, 14:38
Аватар для Oleg
Oleg Oleg вне форума
Активный
 
Регистрация: 29.11.2007
Адрес: Оренбургская обл., Россия
Сообщения: 261
Репутация: 15
Стрелка

>> 0nni
так не пойдет, я кнопку взял лишь для примера, у меня свои классы другие.
__________________
Если Вы находите ошибки, исправить которые дело долгое и нудное, ничего не делайте - просто внесите их в список особенностей
Ответить с цитированием
  #5  
Старый 18.08.2009, 15:17
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Замени класс TButton на любой другой класс, в чем проблема?
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
  #6  
Старый 18.08.2009, 15:30
Аватар для 0nni
0nni 0nni вне форума
Начинающий
 
Регистрация: 13.12.2008
Адрес: Туапсе
Сообщения: 161
Репутация: 20
По умолчанию

Сделай вот такие изменения и все будет работать с локальным объектом.
Код:
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 - это глупо.
__________________
...сказал, и загрустил от бесспорной своей правоты
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:08.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025