Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2015, 17:13   #11
dimavit
Пользователь
 
Регистрация: 04.07.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от саша40 Посмотреть сообщение
Если TMyType - объект, то вызывай FreeAndNil и спокойно уменьшай длину. Только помни: Если элемент не в конце массива, то сначала сдвинь массив на элемент ближе к началу, начиная со следующего элемента за удаляемым.
Ну, примерно так и хотел, с той лишь разницей, что с целью экономии времени хотел не двигать все члены справа от удаляемого, а просто записать на его место самый крайний (жертвуя сохранением порядка, конечно, но он в общем не важен).
dimavit вне форума Ответить с цитированием
Старый 17.08.2015, 17:14   #12
dimavit
Пользователь
 
Регистрация: 04.07.2010
Сообщений: 28
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
тебе гугол за неуплату отключили? тогда спрашивай.
Ну тогда гуглу и лайк. Шутка. Гуглил, конечно, но как - то не очень доходит.

Последний раз редактировалось dimavit; 17.08.2015 в 17:17.
dimavit вне форума Ответить с цитированием
Старый 17.08.2015, 17:23   #13
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от dimavit Посмотреть сообщение
Ну, примерно так и хотел, с той лишь разницей, что с целью экономии времени хотел не двигать все члены справа от удаляемого, а просто записать на его место самый крайний (жертвуя сохранением порядка, конечно, но он в общем не важен).
Ваше дело! Рад помочь.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Старый 17.06.2016, 01:01   #14
WindWest
 
Регистрация: 01.07.2010
Сообщений: 8
По умолчанию TObjectList

открою вам секрет...
TObjectList методом delete не удаляет экземпляр объекта.
он действует также как просто метод Remove
Да сам ДИНАМИЧЕСКИ созданный элемент из списка удаляется, но его экземпляр остаться жить и это факт ибо оба этих метода не вызывают
Destructor элемента в списке.

Может глюк а может и по хуже чего с руками у Эмберакодеры

вот пример рабочего кода что я писал для человечка чтоб он понял что такое Дженерики и с чем их кушать.


unit Unit7;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Generics.Collections,
System.Generics.Defaults,
Vcl.StdCtrls;

type
TForm7 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TMyObject = class
private
Name: string;
IPAddr: string;
UCode: integer;
public
constructor Create(NewName, NewIPAddr: string; NewUCode: integer);
procedure Print(Console: TMemo);
destructor Destroy();
end;

TMyObjectList = TList<TMyObject>;

var
Form7: TForm7;
myObjectList: TMyObjectList;
myObject: TMyObject;
I: integer;

implementation

{$R *.dfm}
{ TMyObject }

constructor TMyObject.Create(NewName, NewIPAddr: string; NewUCode: integer);
begin
Name := NewName;
IPAddr := NewIPAddr;
UCode := NewUCode;
Form7.Memo1.Lines.Add(NewName+NewIP Addr);
end;

procedure TForm7.Button1Click(Sender: TObject);

begin
Memo1.Clear;
myObjectList.Add(TMyObject.Create(' Лопухи' + DateTimeToStr(Now),
'192.168.0.1', myObjectList.Count));

for I := 0 to myObjectList.Count - 1 do
myObjectList[I].Print(Memo1);

end;

procedure TForm7.Button2Click(Sender: TObject);
begin

Memo1.Clear;
for I := 0 to myObjectList.Count - 1 do
myObjectList[I].Print(Memo1);


end;

procedure TForm7.Button3Click(Sender: TObject);
begin
if myObjectList.Count = 0 then
exit;

myObjectList.Items[0].Destroy;
myObjectList.Remove(myObjectList.It ems[0]);

for I := 0 to myObjectList.Count - 1 do
myObjectList[I].Print(Memo1);
end;

procedure TForm7.FormClose(Sender: TObject; var Action: TCloseAction);
begin

myObjectList.Free;
myObject.Free;
end;

procedure TForm7.FormCreate(Sender: TObject);
begin

myObjectList := TMyObjectList.Create;

end;


destructor TMyObject.Destroy();
begin
Form7.Memo1.Lines.Add(Format('Объек т %s удален.', [Name]));
inherited;
end;

procedure TMyObject.Print(Console: TMemo);
begin

Console.Lines.Add(Format('Объект %s создан c кодом %d.', [Name, UCode]));
end;

end.

Обращаем внимание на строки

myObjectList.Items[0].Destroy;
myObjectList.Remove(myObjectList.It ems[0]);

пробуйте комментировать по 1-ной и у видите результат.

а по существу myObjectList.Add(TMyType.Create)
myObjectList.items[тут индекс].поле или метод (магия да и только)

тупо в результате выходит как динамический массив объектов TMyType но с приятными плюшками.

а вместо TObjectList ведь можно использовать и TDictionary так там вообще красота.

Последний раз редактировалось WindWest; 17.06.2016 в 01:19.
WindWest вне форума Ответить с цитированием
Старый 17.06.2016, 11:39   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
открою вам секрет...
TObjectList методом delete не удаляет экземпляр объекта.
он действует также как просто метод Remove
Да сам ДИНАМИЧЕСКИ созданный элемент из списка удаляется, но его экземпляр остаться жить и это факт ибо оба этих метода не вызывают
Destructor элемента в списке.
Не знаю как новые Delphi, НО D7
Код:

procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if OwnsObjects then
    if Action = lnDeleted then
      TObject(Ptr).Free;
  inherited Notify(Ptr, Action);
end;
и ВСЕ delete|remove работают через нее.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 17.06.2016 в 11:42.
evg_m вне форума Ответить с цитированием
Старый 18.06.2016, 17:34   #16
WindWest
 
Регистрация: 01.07.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Не знаю как новые Delphi, НО D7
Код:

procedure TObjectList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if OwnsObjects then
    if Action = lnDeleted then
      TObject(Ptr).Free;
  inherited Notify(Ptr, Action);
end;
и ВСЕ delete|remove работают через нее.
Спасибо полезно , хотя не так явно. И всеже 1-ной строкой проще myObjectList.Items[0].Destroy;
WindWest вне форума Ответить с цитированием
Старый 18.06.2016, 19:01   #17
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Спасибо полезно , хотя не так явно. И всеже 1-ной строкой проще myObjectList.Items[0].Destroy;
А зачем тогда TObjectList? TList и сам освобождай. На то и TObjectList, чтобы он заботился об этом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 22.06.2016, 17:54   #18
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

в конструкторе TObjectList есть неявный параметр [OwnObjects = False]. если задать его в True, то при вызовах Delete() и Remove() будет:
1. вызываться деструктор удаляемого объекта по индексу/ссылке
2. связность списка сохраняется с учетом удаленного
3. размерность списка обновляется с учетом удаленного

Автор, замените ваш динамический массив на данный класс, множество проблем уйдут в будущем.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 23.06.2016, 10:12   #19
WindWest
 
Регистрация: 01.07.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
в конструкторе TObjectList есть неявный параметр [OwnObjects = False]. если задать его в True, то при вызовах Delete() и Remove() будет:
1. вызываться деструктор удаляемого объекта по индексу/ссылке
2. связность списка сохраняется с учетом удаленного
3. размерность списка обновляется с учетом удаленного

Автор, замените ваш динамический массив на данный класс, множество проблем уйдут в будущем.
Спасибо за то что указали на косяк я только сейчас заметил что в коде не tobjectlist а просто tlist.
А как указать owned просто конструкцией lala=TObjectList. Create(true)?

в общем проверил, даже с OwnObjects = true, хотя по дефолту он итак true, метод delete или remove НЕ вызывает деструктор удаляемого объекта в контейнере по индексу. Саму строку да он удаляет и даже верю что у этой строки есть там какой-то деструктор но сам объект в что был создан в метом myObjectList.Add(TMyObject.Create(' ....... не удаляется без явного вызова destroy

TMyObject = class
private
Name: string;
IPAddr: string;
UCode: integer;
public
constructor Create(NewName, NewIPAddr: string; NewUCode: integer);
procedure Print(Console: TMemo);
destructor Destroy();
end;

TMyObjectList = TObjectList<TMyObject>;
'192.168.0.1', myObjectList.Count));

Последний раз редактировалось WindWest; 23.06.2016 в 12:10. Причина: перепроверил
WindWest вне форума Ответить с цитированием
Старый 23.06.2016, 12:15   #20
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

покажите код конструктора и деструктора для начала
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
EListError при удалении 0-ого элемента ListView Человек_Борща Общие вопросы Delphi 2 23.10.2011 16:48
добавление элемента массива при подключении нового пользователя Lokos Работа с сетью в Delphi 10 01.11.2010 02:27
Использование конструкторов и деструктора при проектировании пользовательского класса НеважНо Общие вопросы C/C++ 1 22.01.2010 14:56
Использование виртуального деструктора Fataller Общие вопросы C/C++ 3 12.12.2009 22:08
PHP: использование элемента массива как массива Sudia Помощь студентам 1 20.02.2009 20:48