TValueListEditor и сортировака по Value

 
0
 
Delphi, Kylix & Pascal
ava
Pcrepair | 28.09.2013, 21:42
Добрый день. Есть форма на которой есть компонент TValueListEditor
в цикле в компонент вставляются значения
ValueListEditor1.InsertRow(Stemmings,IntToStr(Rating),True);
число строк от 10 до 1000
первый столбец - слова
втрой столбец - цифры
далее нужно провести сортировку по значениям второго столбца(цифры), большие значения должны попасть наверх

Вопрос:
- есть ли в ValueListEditor1 встроенная сортировка? если есть то где? что то процедура Sort нигде в свойствах не видна
- если нет, то как можно сделать сортировку? есть два параметра: строка=число, сортировать нужно по значению число
Comments (2)
ava
БелАмор | 29.09.2013, 20:50 #
Цитата (Pcrepair @  28.9.2013,  21:42 findReferencedText)
есть ли в ValueListEditor1 встроенная сортировка?

Нет.

Цитата (Pcrepair @  28.9.2013,  21:42 findReferencedText)
если есть то где? что то процедура Sort нигде в свойствах не видна

Данные хранятся в свойстве Strings типа TStrings. Объекты собственно типа TStrings не создаются, это общий базовый класс для семейства наследников. Большинство из них используются внутри разных компонентов. Для непосредственного использования программистом есть только один: TStringList. За свойством Strings типа TStrings прячется некий наследник TStrings, работать с которым мы должны только как с TStrings. Сам TStrings методов сортировки не имеет. Но мы можем перекинуть строки в TStringList, отсортировать там и вернуть на место.
TStringList имеет два метода сортировки: Sort и CustomSort.
Sort просто сортирует строки и нам не подходит.
CustomSort позволяет произвольную сортировку, ей нужно только подсунуть ссылку на нужную функцию сравнения (не обязательно даже строк, можно сравнивать хоть связанные со строками Objects).

TStringList.CustomSort:

type TStringListSortCompare = function(List: TStringList; Index1, Index2: Integer): Integer;

procedure CustomSort(Compare: TStringListSortCompare); virtual;

Т.о. в функции сравнения можно реализовать любой вариант сортировки.
Функции сравнения не должны быть методами.

Использовать всё это можно примерно так:


unit List_Utils;

interface
uses
  SysUtils, Classes;

procedure SortStrings(AStrings: TStrings; ACompareFunc: TStringListSortCompare);
procedure SortByDigitValAsc(AStrings: TStrings);
procedure SortByDigitValDesc(AStrings: TStrings);
function CompareDigitValsAsc(List: TStringList; Index1, Index2: Integer): Integer;
function CompareDigitValsDesc(List: TStringList; Index1, Index2: Integer): Integer;

implementation

// Универсальная сортировка TStrings
procedure SortStrings(AStrings: TStrings; ACompareFunc: TStringListSortCompare);
var
  List: TStringList;
begin
  List := TStringList.Create;
  List.AddStrings(AStrings);
  List.CustomSort(ACompareFunc);
  AStrings.Clear;
  AStrings.AddStrings(List);
  List.Free;
end;

{--- Преднастроенные процедуры ---}

// Сортировка по возрастанию Values в формате целых чисел
procedure SortByDigitValAsc(AStrings: TStrings);
begin
  SortStrings(AStrings, CompareDigitValsAsc);
end;

// Сортировка по убыванию Values в формате целых чисел
procedure SortByDigitValDesc(AStrings: TStrings);
begin
  SortStrings(AStrings, CompareDigitValsDesc);
end;

{--- Функции сравнения ---}

// Values - целые по возрастанию
function CompareDigitValsAsc(List: TStringList; Index1, Index2: Integer): Integer;
const
  DefVal = 0;
begin
  Result :=
    StrToIntDef(List.ValueFromIndex[Index1], DefVal) -
    StrToIntDef(List.ValueFromIndex[Index2], DefVal);
end;

// Values - целые по убыванию
function CompareDigitValsDesc(List: TStringList; Index1, Index2: Integer): Integer;
const
  DefVal = 0;
begin
  Result :=
    StrToIntDef(List.ValueFromIndex[Index2], DefVal) -
    StrToIntDef(List.ValueFromIndex[Index1], DefVal);
end;

end.

Тестовая форма:


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, Grids, ValEdit, StdCtrls;

type
  TForm1 = class(TForm)
    ValueListEditor1: TValueListEditor;
    Panel1: TPanel;
    SortByAscButton: TButton;
    SortByDescButton: TButton;
    procedure FormCreate(Sender: TObject);
    procedure SortByAscButtonClick(Sender: TObject);
    procedure SortByDescButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses List_Utils;

{$R *.dfm}

const
  KeyValList =
    'Один=1,Два=2,Сто=100,Двадцать=20,Пусто=,"Минус пять=-5","Плюс пять=+5",Буквы=АБВГД';

procedure TForm1.FormCreate(Sender: TObject);
begin
  ValueListEditor1.Strings.CommaText := KeyValList;
end;

// По возрастанию
procedure TForm1.SortByAscButtonClick(Sender: TObject);
begin
  SortByDigitValAsc(ValueListEditor1.Strings);                 // вызов преднастроенной процедуры
end;

// По убыванию
procedure TForm1.SortByDescButtonClick(Sender: TObject);
begin
  SortStrings(ValueListEditor1.Strings, CompareDigitValsDesc);  // вызов универсальной процедуры
end;

end.


ava
Pcrepair | 30.09.2013, 14:37 #
Спасибо, будем изучать примеры
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit