![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Пользователь
Регистрация: 04.07.2010
Сообщений: 28
|
![]()
Ну, примерно так и хотел, с той лишь разницей, что с целью экономии времени хотел не двигать все члены справа от удаляемого, а просто записать на его место самый крайний (жертвуя сохранением порядка, конечно, но он в общем не важен).
|
![]() |
![]() |
![]() |
#12 |
Пользователь
Регистрация: 04.07.2010
Сообщений: 28
|
![]()
Ну тогда гуглу и лайк. Шутка. Гуглил, конечно, но как - то не очень доходит.
Последний раз редактировалось dimavit; 17.08.2015 в 17:17. |
![]() |
![]() |
![]() |
#13 | |
Участник клуба
Регистрация: 12.09.2012
Сообщений: 1,030
|
![]() Цитата:
![]()
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби. ![]() |
|
![]() |
![]() |
![]() |
#14 |
Регистрация: 01.07.2010
Сообщений: 8
|
![]()
открою вам секрет...
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. |
![]() |
![]() |
![]() |
#15 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,543
|
![]() Цитата:
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 17.06.2016 в 11:42. |
|
![]() |
![]() |
![]() |
#16 |
Регистрация: 01.07.2010
Сообщений: 8
|
![]()
Спасибо полезно , хотя не так явно. И всеже 1-ной строкой проще myObjectList.Items[0].Destroy;
|
![]() |
![]() |
![]() |
#17 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#18 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
в конструкторе TObjectList есть неявный параметр [OwnObjects = False]. если задать его в True, то при вызовах Delete() и Remove() будет:
1. вызываться деструктор удаляемого объекта по индексу/ссылке 2. связность списка сохраняется с учетом удаленного 3. размерность списка обновляется с учетом удаленного Автор, замените ваш динамический массив на данный класс, множество проблем уйдут в будущем.
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
#19 | |
Регистрация: 01.07.2010
Сообщений: 8
|
![]() Цитата:
А как указать 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. Причина: перепроверил |
|
![]() |
![]() |
![]() |
#20 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
покажите код конструктора и деструктора для начала
"ковыряю изнутри" (с)
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |