dupIgnore mi nie działa ???

0
    FolderLevelsArr : array of TTntStringList;
           SortList : TTntStringList;
[...]
SetLength(FolderLevelsArr, high(FolderLevelsArr)+2);
FolderLevelsArr[0]:=TTntStringList.Create;
FolderLevelsArr[0].Duplicates:=dupIgnore;
[...]
FolderLevelsArr[i-l+1].Add(SortList[k]);
FolderLevelsArr[i-l].Add(ExtractFilePath(SortList[k]));

czy ja źle rozumiem treść pomocy ?

dupIgnore Ignore attempts to add duplicate strings (do not add the duplicate string).

niby prosta sprawa a otrzymuję potem listy w FolderLevelsArr z ilomaś tam takimi samymi stringami :/

0

nie wiem czy Cię dobrze rozumie, ale jak masz x TStringList i w każdej ustawisz Duplicates:=dupIgnore; to wcale nie oznacza, że w różnych StringListach nie będziesz miał powtórzeń.
A druga sprawa to nie wiem, czy StringLista nie musi być posortowana

0

oczywiście problem opisuję tylko na jednej liście. co do posortowania to odpada bo trudno mówić o posortowaniu 4 (i tylko 4) takich_samych elementów (innymi słowy moja lista z dupIgnore zawiera stringi 'a' 'a' 'a' i...'a' !). sprawdziłem czy nie jest to (jakimś dziwnym) przypadkiem kwestia spacji których w lisbox'sie nie widzę ale to nie to.
<zmartwiony>
nauczony doświadczeniem jakoś nie chce mi się wierzyć żeby to była wina :) kogoś innego niż ja, ale tak czy siak dziwne to...postuję pełny listing odpowiedzialnego kodu:

(który jest wstępem do rozwiązania tego problemu:
http://4programmers.net/Forum/280462?h=snw#id280462
[najpierw sortuję listę wdg znaku '', a następnie dzielę na parę list, każdą jedną na 'poziom' zagłębienia folderów])

//globale:
var
    FolderLevelsArr : array of TTntStringList;
           SortList : TTntStringList;
  FileList                 : pointer;

function CountCharPos(const subtext: string; Text: string): Integer;
begin
  if (Length(subtext) = 0) or (Length(Text) = 0) or (Pos(subtext, Text) = 0) then
    Result := 0
  else
    Result := (Length(Text) - Length(StringReplace(Text, subtext, '', [rfReplaceAll]))) div Length(subtext);
end;


function BackslashWideStringListCompareStrings(List: TTntStringList; Index1, Index2: Integer): Integer;
begin
Result:=(CountCharPos('\',List.Strings[Index1])-CountCharPos('\',List.Strings[Index2]));
end;


procedure SortByBackslash;

begin
SortList:=TTntStringList.Create;
SortList.Assign(TAHCustomListBox(FileList).Items);
SortList.CustomSort(BackslashWideStringListCompareStrings);
end;

//tego jeszcze w ogóle nie optymalizowałem więc jest chaos w indeksach i zmiennych iteracyjnych...
procedure TMain.Button18Click(Sender: TObject);
var i,j,k,l:integer;
begin
SortByBackslash;

i:=CountCharPos('\',SortList[0])+1;
l:=i;
k:=0;

SetLength(FolderLevelsArr, high(FolderLevelsArr)+2);
FolderLevelsArr[0]:=TTntStringList.Create;
FolderLevelsArr[0].Duplicates:=dupIgnore;
repeat
SetLength(FolderLevelsArr, high(FolderLevelsArr)+2);
FolderLevelsArr[i-l+1]:=TTntStringList.Create;
FolderLevelsArr[i-l+1].Duplicates:=dupIgnore;
repeat
FolderLevelsArr[i-l+1].Add(SortList[k]);
FolderLevelsArr[i-l].Add(ExtractFilePath(SortList[k]));
inc(k);
if k<=(SortList.Count-1) then
   j:= CountCharPos('\',SortList[k])
else break;
until (i<(j+1));
inc(i);
until k>(SortList.Count-1);

TAHCustomListBox(FileList).Items.Clear;
for i:=0 to high(FolderLevelsArr) do
    TAHCustomListBox(FileList).Items.AddStrings(FolderLevelsArr[i]);
TAHCustomListBox(FileList).Refresh

end;
0

Nie chciao mi sie Delphi odpalac, zeby do helpa zagladnac, ale zrobilem to dla Ciebie. Co do twojego textu o rozumieniu helpa to powiem tylko, ze HELPA SIE CZYTA OD POCZATKU DO KONCA A NIE WYBIORCZO!!!!

Set Duplicates before adding any strings to the list. Setting Duplicates to dupIgnore or dupError does nothing about duplicate strings that are already in the list.

<font size="6">Note: Duplicates does nothing if the list is not sorted.</span>

mam nadzieje, ze teraz to widzisz

0

no tak, teraz widzę zdecydowanie. nie sprawdzałem specjalnie bo wydało mi się że trudno posortować 4 takie same elementy (i jeszcze nie miałem jak już odpalić wtedy delphi - plan był zrobić to dzisiaj ale ubiegłeś mnie). no ale fakt komponent przecież nie sprawdza czy tak jest czy nie tylko czy właściwość jest true of false.
[sciana]
obiecuję czytać pomoc od początku do końca...
dzięki i pozdrawiam !!!

0
snw napisał(a)

no tak, teraz widzę zdecydowanie. nie sprawdzałem specjalnie bo wydało mi się że trudno posortować 4 takie same elementy (i jeszcze nie miałem jak już odpalić wtedy delphi - plan był zrobić to dzisiaj ale ubiegłeś mnie). no ale fakt komponent przecież nie sprawdza czy tak jest czy nie tylko czy właściwość jest true of false.!

bo tu nie chodzi o sortowanie 4 takich samych elementow tylko o sam fakt czy one sa posortowane czy nie. Jak nie masz posortowane to StringList musialby sprawdzac wszystkie pozycje przy dodawaniu nowej zeby zobaczyc czy taki text juz jest natomiast jak masz posortowana liste to lokalizacja danego textu jest banalna

1 użytkowników online, w tym zalogowanych: 0, gości: 1