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