Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TValueListEditor и сортировака по Value, TValueListEditor и сортировака по Value 
:(
    Опции темы
Pcrepair
Дата 28.9.2013, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Добрый день. Есть форма на которой есть компонент TValueListEditor
в цикле в компонент вставляются значения
ValueListEditor1.InsertRow(Stemmings,IntToStr(Rating),True);
число строк от 10 до 1000
первый столбец - слова
втрой столбец - цифры
далее нужно провести сортировку по значениям второго столбца(цифры), большие значения должны попасть наверх

Вопрос: 
- есть ли в ValueListEditor1 встроенная сортировка? если есть то где? что то процедура Sort нигде в свойствах не видна
- если нет, то как можно сделать сортировку? есть два параметра: строка=число, сортировать нужно по значению число
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
БелАмор
Дата 29.9.2013, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 10.6.2010
Где: Россия

Репутация: 7
Всего: 17



Цитата(Pcrepair @  28.9.2013,  21:42 Найти цитируемый пост)
есть ли в ValueListEditor1 встроенная сортировка?

Нет.

Цитата(Pcrepair @  28.9.2013,  21:42 Найти цитируемый пост)
если есть то где? что то процедура 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.



PM   Вверх
Pcrepair
Дата 30.9.2013, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 16.1.2011

Репутация: нет
Всего: нет



Спасибо, будем изучать примеры
--------------------
Сборник рабочего кода Процедур и Функций DelPhi     http://validcoderepo.narod.ru/
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0411 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.