проблема с дубликатами в tstringlist

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

проблема с дубликатами в tstringlist

Сообщение ivanov1 » 03.01.2015 16:37:27

Код: Выделить всё
procedure beginlist;
var
i: word;
sl: tstringlist;
s: string;
begin
sl:=tstringlist.create;
sl.Sorted:=true;
sl.Duplicates:=dupignore;
for i:=0 to 60 do
begin
  s:=GetSpecialFolderPath(i);
  sl.add(s);
end;
end;


Почему то не игнорирует дубликаты строк.
Буду благодарен за любые советы.

ос windows7
Lazarus 1.2.6 r46529 FPC 2.6.4 i386-win32-win32/win64
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: проблема с дубликатами в tstringlist

Сообщение Ism » 03.01.2015 17:08:26

Возможно дело в порядке включения опций
http://forum.sources.ru/index.php?showtopic=202950

Добавлено спустя 4 минуты 25 секунд:
Или изза кодировки. Возможно tstringlist работает только с ascii
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: проблема с дубликатами в tstringlist

Сообщение ivanov1 » 03.01.2015 20:24:08

Ism писал(а):Возможно дело в порядке включения опций
http://forum.sources.ru/index.php?showtopic=202950

Пробывал менять местами строки
Код: Выделить всё
sl.Sorted:=true;
sl.Duplicates:=dupignore;
не помогло.

Добавлено спустя 4 минуты 25 секунд:
Или изза кодировки. Возможно tstringlist работает только с ascii
нет, все выводится, читается правильно с выводом в listview.

Добавлено спустя 15 минут 47 секунд:
https://yadi.sk/d/iq61LDoAdmN6M вот прикрепил для наглядности.
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: проблема с дубликатами в tstringlist

Сообщение Sharfik » 03.01.2015 21:42:32

Что возвращает GetSpecialFolderPath(i) ?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 809
Зарегистрирован: 20.07.2013 01:04:30

Re: проблема с дубликатами в tstringlist

Сообщение ivanov1 » 04.01.2015 01:28:07

Sharfik писал(а):Что возвращает GetSpecialFolderPath(i) ?

Пути к системным папкам, в примере можете посмотреть.
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: проблема с дубликатами в tstringlist

Сообщение Ism » 04.01.2015 03:26:28

Проверил, функция SHGetFolderPath наряду с путем кидает в строку невидимый мусор, поэтому дедупликация и не работает
Старайтесь не использовать видовское API, всегда есть кросплатформенные аналоги

Вот так работает, но это костыли

Код: Выделить всё
sl:=tstringlist.Create;
sl.Sorted:=true;
sl.Duplicates:=dupIgnore;
for i:=0 to 1000 do
begin
  s:=GetSpecialFolderPath(i);
  //ShowMessage(IntToStr(Length(s))+' Тут есть некоторая хрень, длина строки больше, чем содержимое '+s);
  s:=LeftStr(s,pos(#0,s)-1);
  s:=AnsiToUtf8(s); // Не факт
  if length(s) = 0 then continue;
  sl.Add(s);
end;

for i:=0 to sl.Count-1 do
begin
  ListView1.Items.Add.Caption:=sl.Strings[i];
end;
sl.Free;   
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: проблема с дубликатами в tstringlist

Сообщение ivanov1 » 04.01.2015 14:57:58

Ism писал(а):Проверил, функция SHGetFolderPath наряду с путем кидает в строку невидимый мусор, поэтому дедупликация и не работает
Старайтесь не использовать видовское API, всегда есть кросплатформенные аналоги
Действительно, благодарю за помощь, буду брать конкретные пути по номеру. А про аналоги не слышал, посмотрю. :D
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: проблема с дубликатами в tstringlist

Сообщение Vapaamies » 04.01.2015 15:11:46

Она не невидимый мусор кидает, а возвращает строку, длину которой нужно вычислять функцией StrLen/StrLenW.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: проблема с дубликатами в tstringlist

Сообщение iskander » 04.01.2015 16:09:12

Должно помочь:
Код: Выделить всё
function GetSpecialFolderPath(folder : integer) : string;
const
SHGFP_TYPE_CURRENT = 0;
var
path: array [1..MAX_PATH] of char;
begin
if SUCCEEDED(SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path)) then
  // Result := path
  Result := PChar(@path)
else
   Result := '';
end;
iskander
энтузиаст
 
Сообщения: 623
Зарегистрирован: 08.01.2012 18:43:34

Re: проблема с дубликатами в tstringlist

Сообщение ivanov1 » 04.01.2015 21:46:10

iskander писал(а):Должно помочь:
Код: Выделить всё
function GetSpecialFolderPath(folder : integer) : string;
const
SHGFP_TYPE_CURRENT = 0;
var
path: array [1..MAX_PATH] of char;
begin
if SUCCEEDED(SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path)) then
  // Result := path
  Result := PChar(@path)
else
   Result := '';
end;
Да, работает, проверил.
ivanov1
новенький
 
Сообщения: 32
Зарегистрирован: 03.01.2015 16:25:04

Re: проблема с дубликатами в tstringlist

Сообщение Ism » 04.01.2015 22:02:59

ivanov1 писал(а):Действительно, благодарю за помощь, буду брать конкретные пути по номеру. А про аналоги не слышал, посмотрю


Вот вариант, одобренный Императором
Можно переделать под любую задачу
Код: Выделить всё
Memo1.Lines:=GetFileList ('C:\','*',true,true);

Код: Выделить всё
function GetFileList(const Path, mask: string; incSubDirs, incDirs: boolean): TStringList;
var
  I: Integer;
  SearchRec: TSearchRec;
begin
  Result := TStringList.Create;
  try
    I := FindFirst(Path + DirectorySeparator+mask, $FF, SearchRec);
    while (I = 0) and ((SearchRec.Name<>'.') or (SearchRec.Name<>'..')) do
    begin
      if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
        if (SearchRec.Attr and faDirectory <> 0) and incSubDirs then
          Result.AddStrings(GetFileList(Path + DirectorySeparator + SearchRec.Name, mask, incSubDirs, incDirs))
        else
          if incDirs then Result.Add(Path + DirectorySeparator + SearchRec.Name)
      else
        if (SearchRec.Attr and faDirectory = 0) then Result.Add(Path + '\' + SearchRec.Name);
      I := FindNext(SearchRec);
    end;
  except
    Result.Free;
  raise;
  end;
end;               

http://forum.developing.ru/archive/inde ... -7423.html
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 241

Рейтинг@Mail.ru
cron