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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2013, 18:03   #1
Stertor
Заблокирован
 
Регистрация: 17.07.2013
Сообщений: 104
По умолчанию Защита от попадания дубликатов в TThreadlist

Здравствуйте, товарищи! Имеется tthreadlist, в который заносятся объекты. Есть такой вопрос: как не допустить попадания дубликатов в tthreadlist? У этого объекта есть свойство Duplicates, выставлено в dupIgnore, но копии объектов все равно добавляются.

код полностью:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

  type
    tmystr=class(tobject)
    param1:string;
    param2:string;
    param3:integer;
  end;
  
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    ListView1: TListView;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  threadlist:tthreadlist;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  threadlist:=tthreadlist.Create;
  threadlist.Duplicates:=dupignore;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  t:tmystr;
  i:integer;
  lst:tlist;
begin
  lst:=threadlist.LockList;
  for i:=1 to 5 do    // по идее, должен добавиться только 1 экземпляр tmystr
  begin
    t:=tmystr.Create;
    t.param1:='param one';
    t.param2:='param two';
    t.param3:=inttostr(i);
    lst.Add(t);
  end;
  threadlist.UnlockList;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  lst:tlist;
  i:integer;
  begin
  lst:=threadlist.LockList;
  i:=lst.Count;
  threadlist.UnlockList;
  showmessage(inttostr(i));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  lst:tlistitem;
  tlst:tlist;
  i:integer;
begin
  tlst:=threadlist.LockList;
  for i:=tlst.Count-1 downto 0 do
  begin
    lst:=listview1.Items.Add;
    lst.Caption:=tmystr(tlst[i]).param1;
  end;
  threadlist.UnlockList;
end;

end.
Очевидно, список нужно отсортировать, но я ума не приложу, как отсортировать список с объектами. Можно ли это сделать по параметру "param1" ?

Последний раз редактировалось Stertor; 03.08.2013 в 18:07.
Stertor вне форума Ответить с цитированием
Старый 03.08.2013, 18:37   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Stertor, TThreadList - список указателей и предназначен для хранения TThread. Для хранения объектов используйте TObjectList, там есть метод IndexOf который сравнивает объекты списка, наследуйте свой класс от его и перепишите методы на свой лад с контролем дубликатов.

Ещё вариант - TStringList - тоже список объектов.
TStringList.AddObject('СТРОКА', Объект), и есть встроенный контроль дубликатов.
Человек_Борща вне форума Ответить с цитированием
Старый 04.08.2013, 00:04   #3
Троллинг
Новичок
Джуниор
 
Регистрация: 03.08.2013
Сообщений: 6
По умолчанию

Цитата:
Stertor, TThreadList - список указателей и предназначен для хранения TThread. Для хранения объектов используйте TObjectList, там есть метод IndexOf который сравнивает объекты списка, наследуйте свой класс от его и перепишите методы на свой лад с контролем дубликатов.

Ещё вариант - TStringList - тоже список объектов.
TStringList.AddObject('СТРОКА', Объект), и есть встроенный контроль дубликатов.
Да, в принципе от тебя я такого ответа и ждал. Если бы мне понадобился tobjectlist, я бы, наверно, использовал его - как ты думаешь?

Опус выше попадет на мой любимый сайт, без обид))
Можно заблокировать тролля, но нельзя забанить троллинг, ибо это не причина, а следствие.
Троллинг вне форума Ответить с цитированием
Старый 04.08.2013, 00:13   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
/ по идее, должен добавиться только 1 экземпляр tmystr
с чего это?
5 разных объектов добавляете.

Троллинг, не надоело еще кучу акков заводить?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2013, 00:18   #5
Троллинг
Новичок
Джуниор
 
Регистрация: 03.08.2013
Сообщений: 6
По умолчанию

Цитата:
с чего это?
5 разных объектов добавляете.
Это так. А если param3:=0 ?

Насчет акков: меня вынудили это сделать. После каждого бана будет возрожденный Стертор, аки Феникс возрождается из пепла. Стертора нельзя забанить.
Можно заблокировать тролля, но нельзя забанить троллинг, ибо это не причина, а следствие.
Троллинг вне форума Ответить с цитированием
Старый 04.08.2013, 00:24   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Да, в принципе от тебя я такого ответа и ждал. Если бы мне понадобился tobjectlist, я бы, наверно, использовал его - как ты думаешь?
А хлеб и батон ты в холодильнике, вместо хлебницы, хранишь?

Сортировка списка объектов довольно просто делается. У каждого списка есть метод Sort, где на входе указатель на процедуру TSortProc, в которой ты сам указываешь как нужно сравнивать 2 объекта.

Цитата:
Насчет акков: меня вынудили это сделать.
Ему не надоест тебя банить.

Последний раз редактировалось Человек_Борща; 04.08.2013 в 00:28.
Человек_Борща вне форума Ответить с цитированием
Старый 04.08.2013, 00:38   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Это так. А если param3:=0 ?
это не важно, объекты хранятся по указателю, потому если адрес разный, то он будет добавлен.

вариант один, это писать свой класс от списка и в нем переопределять Add и Insert(или что там еще за добавление отвечает, не помню)

еще вариант разве что поиграть с перегрузкой операторов, но не факт что оно заработает с не-дженерик списком.
Цитата:
А хлеб и батон ты в холодильнике, вместо хлебницы, хранишь?
ну мы храним дома, так дольше живет и меньше сохнет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 04.08.2013 в 00:42.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2013, 00:48   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
ну мы храним дома, так дольше живет и меньше сохнет.
Это был сорказм

Цитата:
еще вариант разве что поиграть с перегрузкой операторов, но не факт что оно заработает с не-дженерик списком
Будет работать.
Человек_Борща вне форума Ответить с цитированием
Старый 04.08.2013, 00:54   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Будет работать.
зависит от того как у них это устроено, я этого не знаю, потому и не могу обещать.
там может быть применен компарер стандартного TObject, то есть по адресу.
генерик же должен будем применять именно наши операторы.

но тебе виднее.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.08.2013, 01:12   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Перегрузка операторов работает так же как оператор is, т.е. если хоть 1 предок к древе класса совпадает, то вернётся true.

Путь у на есть список объектов TObject, а мы храним там объекты TMyObject(TObject)=>TMySuperObject( TMyOject), то базовые методы списка все равно будут использовать базовый тип TObject или вообще указатель или адрес этого объекта, как вы и сказали.

А вообще, для сортировки существует метод Sort в котрый передается TCustomSortProc, где программист получает 2 указателя на объекты для сравнения, и сам указывает, что сравнивать.


Если бы не работало, как же мы до 2009 делфи, без дженериков-то жили?
Человек_Борща вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TThreadList как им пользоваться? bakanaev Общие вопросы Delphi 3 15.01.2013 00:23
Определить попадания точки в заштрихованную область Ty4ka Помощь студентам 10 20.05.2012 21:35
Исследования попадания точки в заданную область uHkBu3uTop Помощь студентам 2 19.01.2012 12:35
Бальная оценка в зависимости от попадания в интервал Medlain Microsoft Office Excel 2 22.05.2010 22:17
поиск дубликатов файлов(имя, тип, размер). Вывод дубликатов на экран с отображением их пути faraon1792 Помощь студентам 4 19.03.2010 23:46