Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

сортировка в ListBox [D7, XP]


pasha star ©   (2007-03-09 12:53:00) 

ListBox1.Sorted := True; // <- не подходит..

нужно что бы некоторые символы были выше чем сортируются с sorted:=true;

допустим сейчас он сортирует так:

+aaa
%bbb
@ccc
~ddd
aaaa
bbba
cccc

а нужно что бы было так:

~ddd
@ccc
%bbb
+aaa
aaaa
bbba
cccc

как изменить эту сортировку ?


pasha star   (2007-03-10 16:26:00) [1]

все получилсаяь..


Const
A : Array[1..5] of Char = ('~', '&', '@', '%', '+');

function update_listbox(lb:TListBox):integer;
Var
S1: TStringList;
S  : String;
I, J, Ind : Integer;
begin
lb.Items.BeginUpdate;
Ind:=lb.TopIndex;
lb.Items.Objects[lb.ItemIndex]:=lb;
try
S1 := TStringList.Create;
S1.Sorted := False;
S1.Assign(lb.Items);

for i := 0 to S1.Count - 1 do begin
 S := S1.Strings[i];
 for j := 1 to High(A) do S := StringReplace(S, A[j], IntToStr(j), [rfReplaceAll, rfIgnoreCase]);
 S1.Strings[i] := S;
end;

S1.Sorted := True;
S1.Sorted := False;

for i := 0 to S1.Count - 1 do begin
 S := S1.Strings[i];
 for j := 1 to High(A) do S := StringReplace(S, IntToStr(j), A[j], [rfReplaceAll, rfIgnoreCase]);
 S1.Strings[i] := S;
end;
lb.Items.Assign(S1);
finally
lb.ItemIndex:=lb.Items.IndexOfObject(lb);
lb.Items.Objects[lb.ItemIndex]:=nil;
lb.TopIndex:=Ind;
lb.Items.EndUpdate;
end;
Result:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add(Edit1.Text);
update_listbox(ListBox1);
end;


pasha star   (2007-03-10 16:23:00) [2]

ListBox1.Items.Objects[ListBox1.ItemIndex]:=self;
ListBox1.ItemIndex:=ListBox1.Items.IndexOfObject(self);

слово self , чем его можно заменить? иначе не получается создать функцию или процедуру, что бы её везде использовать..


pasha star   (2007-03-10 16:06:00) [3]

работает !! супер ! big big big thanks !


RASkov   (2007-03-10 15:41:00) [4]

> [15] pasha star ©   (10.03.07 14:04)

Попробуй так (немного доработанный [12]):

Const
A : Array[1..4] of Char = ('+', '%', '@', '~');

procedure TForm1.Button1Click(Sender: TObject);
Var
S1: TStringList;
S  : String;
I, J, Ind : Integer;
begin
 ListBox1.Items.BeginUpdate;
 Ind:=ListBox1.TopIndex;
 ListBox1.Items.Objects[ListBox1.ItemIndex]:=self;
try
 S1 := TStringList.Create;
 S1.Sorted := False;
 S1.Assign(Listbox1.Items);

 for i := 0 to S1.Count - 1 do begin
  S := S1.Strings[i];
  for j := 1 to High(A) do S := StringReplace(S, A[j], IntToStr(j), [rfReplaceAll, rfIgnoreCase]);
  S1.Strings[i] := S;
 end;

 S1.Sorted := True;
 S1.Sorted := False;

 for i := 0 to S1.Count - 1 do begin
  S := S1.Strings[i];
  for j := 1 to High(A) do S := StringReplace(S, IntToStr(j), A[j], [rfReplaceAll, rfIgnoreCase]);
  S1.Strings[i] := S;
 end;
 ListBox1.Items.Assign(S1);
finally
 ListBox1.ItemIndex:=ListBox1.Items.IndexOfObject(self);
 ListBox1.Items.Objects[ListBox1.ItemIndex]:=nil;
 ListBox1.TopIndex:=Ind;
 ListBox1.Items.EndUpdate;
end;
end;

И нужно учитывать [9]...


pasha star   (2007-03-10 14:04:00) [5]

а сортирует круто ! thanks!
но как исправить сброс scrollbar и выделенный item ?


pasha star   (2007-03-10 13:48:00) [6]

p.s: а сортерует круто ! thanks! но как быть исправить сброс scrollbar и выделенный item ?


pasha star   (2007-03-10 13:47:00) [7]

после сортировки происходит сброс scrollbar и сброс выделенного item..


fd979   (2007-03-09 22:51:00) [8]

Исправлено:
procedure TForm1.Button1Click(Sender: TObject);
Var
S1: TStringList;
S  : String;
I, J   : Integer;
begin
S1 := TStringList.Create;
S1.Sorted := False;
S1.Text := Listbox1.Items.Text;

for i := 0 to S1.Count - 1 do
begin
  S := S1.Strings[i];
  for j := 1 to n do
     S := StringReplace(S, A[j], IntToStr(j), [rfReplaceAll, rfIgnoreCase]);
  S1.Strings[i] := S;
end;

S1.Sorted := True;
S1.Sorted := False;

for i := 0 to S1.Count - 1 do
begin
  S := S1.Strings[i];
  for j := 1 to n do
     S := StringReplace(S, IntToStr(j), A[j], [rfReplaceAll, rfIgnoreCase]);
  S1.Strings[i] := S;
end;

ListBox1.Items := S1;
end;


pasha star   (2007-03-09 17:56:00) [9]

fixed by: S1.Assign(ListBox1.Items);

но сортировка не пашет..


pasha star   (2007-03-09 17:35:00) [10]

error:

S1 := Listbox1.Items;
Incompitable types: 'TStringList' and 'TStrings'


fd979   (2007-03-09 16:38:00) [11]

Ой нет... Только что посмотрел внимательнее... Не будет правильно работать, если в превоначальной строке есть цифры...


fd979   (2007-03-09 16:36:00) [12]

Предлагаю:
Const
 A : Array[1..n] = ('+', '%', '@', '~', ..., n); //обязательно в том порядке в каком нужно сортировать!! Вместо n поставь количество этих символов...
....

 Var
 S1: TStringList;
 S  : String;
 I, J   : Integer;
...
begin
 S1 := TStringList.Create;
 S1.Sorted := False;
 S1 := Listbox1.Items;

 for i := 0 to S1.Count - 1 do
 begin
   S := S1.Strings[i];
   for j := 1 to n do
      S := StringReplace(S, A[j], IntToStr(j), [rfReplaceAll, rfIgnoreCase]);
   S1.Strings[i] := S;
 end;

 S1.Sorted := True;

 for i := 0 to S1.Count - 1 do
 begin
   S := S1.Strings[i];
   for j := 1 to n do
      S := StringReplace(S, IntToStr(j), A[j], [rfReplaceAll, rfIgnoreCase]);
   S1.Strings[i] := S;
 end;
 
 ListBox1.Items := S1;
end;


Писал прямо сюда. Так что проверь...


Рамиль   (2007-03-09 16:01:00) [13]


> Сергей М. ©   (09.03.07 15:02) [6]

Так у него не из-за метода сортировки сбрасывается скрол, а из-за Form1.ListBox1.Items.Assign(sl);

А метод CustomSort у TListbox.Items недоступен


Сергей М.   (2007-03-09 15:02:00) [14]


> а если стоит listbox1.sorted:=true;


Тебе нужна собственнаясортировка, т.е. сортировка по своимкритериям сравнения !

Ну и причем здесь Sorted = True ?

Нипричем.

Дорабатывай алгоритм ф-ции CustomCompare() таким образом, чтобы он удовлетворял всемтвоим требованиям. Св-во Sorted при этом забудь.


pasha star   (2007-03-09 14:56:00) [15]

no idea ?


pasha star   (2007-03-09 13:50:00) [16]

const
 CRANKING = '+%@&~';

function CustomCompare(List: TStringList; Index1, Index2: Integer): Integer;
var
 s1, s2: string;
 r1, r2: char;
begin
 s1 := List[index1];
 s2 := List[index2];
 r1 := s1[1];
 r2 := s2[1];
 Delete(s1, 1, 1);
 Delete(s2, 1, 1);
 if Pos(r1, CRANKING) > Pos(r2, CRANKING) then Result := -1 else
 if Pos(r1, CRANKING) < Pos(r2, CRANKING) then Result := 1 else
 Result := AnsiCompareText(s1, s2);
end;

procedure make_sort;
var sl: TStringList;
begin
 sl := TStringList.Create;
 try
   sl.Assign(Form1.ListBox1.Items);
   sl.CustomSort(CustomCompare);
   Form1.ListBox1.Items.Assign(sl);
 finally
   sl.Free
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Add(Edit1.Text);
make_sort;
end;

ну для первой добавки всех Items'ов этот код норм.. но.. если добавить новый Items, то происходит сортировка всего listbox'а и сбрасывается позиция scrollbar'a и выбронный item.. а если стоит listbox1.sorted:=true; (с //make_sort;) то всё ок.. как это исправить ?


Рамиль   (2007-03-09 12:58:00) [17]

Написать свою сортировку.


Сергей М.   (2007-03-09 12:56:00) [18]

ListBox.Items.CustomSort(..)


S@shka   (2007-03-09 12:56:00) [19]

Либо все сам сортируешь как надо.
Либо ListBox1.Sorted;
а потом все равно до первой 'a' - сортируешь самостоятельно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо