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

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

CustomSort в TStringList [D5, D7]


GanibalLector ©   (2005-06-30 23:26:00) 

TStringList имеет метод CustomSort,состоящий из TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;
До недавнего времени я так и делал :

function NumbersSort(List: TStringList; Index1, Index2: Integer): Integer;
begin
 Result := -1;
 if StrToInt(List.Strings[Index1])>StrToInt(List.Strings[Index2])
  then Result := 1
 else
 if StrToInt(List.Strings[Index1]) = StrToInt(List.Strings[Index2])
   then Result := 0;
end;

function DoSort(OList:TObjectList):TObjectList;
 var i,ii:Integer;
  List:TStringList;
  Ob:TObject;
begin
 TStringList(OList.Items[0]).CustomSort(NumbersSort);
 Result:=TObjectList.Create;
 Result.Add(Olist.Items[0]);
 for i:= 1 to OList.Count-1 do
 begin
   List:=TStringList.Create;
   for ii:=0 to TStringList(OList.Items[0]).Count-1 do
   begin
     Ob:=TStringList(Result.Items[0]).Objects[ii];
     List.Add(TStringList(OList.Items[i])[TStringList(OList.Items[i]).IndexOfObject(Ob)]);
   end;
 Result.Add(List);
 OList.Items[i].Free;
 end;
end;

Вызывал так :  
  Q:=TObjectList.Create;
  ...// много чего
  Q:=DoSort(Q);



Так вот,время идет,задачи усложняются ;) теперь мне необходимо сортировать не Integer а Int64.
И ШО собственно делать??? Писать наследника от TStringList с новым методом TStringListSortCompare = function(List: TStringList; Index1, Index2: Int64): Integer;
В общем,как бы это сделать без лишнего головняка? Спасибо.


GanibalLector   (2005-07-01 00:53:00) [1]

Блин,сегодня я тупой :(
Все получилось. Во,гоню!!!


GanibalLector   (2005-07-01 00:49:00) [2]

2 GanibalLector ©   (01.07.05 00:44) [3]
>вышел за границы Int64,блин :(
Да нет,не вышел.А ШО ж такое???
 var x:Int64;
begin
  x := High(Int64);
  ShowMessage('Max  = '+IntToStr(x));


GanibalLector   (2005-07-01 00:44:00) [3]

блин,тот пример работает ;)
А вот так:

List.AddObject('9999999999',TObject(1)) ;
уже не работает. Я вышел за границы Int64,блин :(


GanibalLector   (2005-07-01 00:38:00) [4]

2 VMcL ©   (01.07.05 00:07) [1]
а толку? EConvertError with message "8000125484' is not a valid integer value.

Вот,примерчик Лукавый :

procedure TForm1.Button1Click(Sender: TObject);
 var Q:TObjectList;
 List:TStringList;
begin
  Q:=TObjectList.Create;

    List:=TStringList.Create;
    List.AddObject('8000125484',TObject(1)) ;
    List.AddObject('80030', TObject(2)) ;
    List.AddObject('55003', TObject(3)) ;
    Q.Add(List);
    //
    List:=TStringList.Create;
    List.AddObject('q',TObject(1)) ;
    List.AddObject('w', TObject(2)) ;
    List.AddObject('e', TObject(3)) ;
    Q.Add(List);
  Q:=DoSort(Q);
  StringGrid1.Cols[1]:=TStrings(Q.Items[0]);
  StringGrid1.Cols[2]:=TStrings(Q.Items[1]);
end;


VMcL   (2005-07-01 00:07:00) [5]

StrToInt заменить на StrToInt64
?


Наверх

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