Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2016, 01:59   #1
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию Сортировка в виртуальном Listview

Нужно в виртуальном ListView произвести произвольную сортировку данных (по двум столбцам). Делаю это через метод CustomSort и пишет ошибку:
Цитата:
[Error] Unit1.pas(38): Variable required
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, math;

type
  TForm1 = class(TForm)
    ListView1: TListView;
    procedure ListView1Data(Sender: TObject; Item: TListItem);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure CreateValues;
    function CustomSortProc(Item1,Item2: TListItem; OptionalParam: integer): integer;stdcall;
  end;

var
  Form1: TForm1;

implementation

uses DateUtils;

{$R *.dfm}

{ TForm1 }

procedure TForm1.CreateValues;
begin
  ListView1.Items.Clear;
  ListView1.Items.Count:=10;
  ListView1.UpdateItems(0,ListView1.Items.Count-1);
  ListView1.CustomSort(@CustomSortProc, 0);   // <-- Здесь ошибка
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := IntToStr(RandomRange(1, 7));
  Item.SubItems.Add(FormatDateTime('HH:MM', random));
  Item.SubItems.Add(IntToStr(RandomRange(1, 99999)));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  CreateValues;
end;

function TForm1.CustomSortProc(Item1,Item2: TListItem; OptionalParam: integer): integer;stdcall;
var
  DayOfWeek1, DayOfWeek2: integer;
  Time1, Time2: TTime;
begin
  DayOfWeek1 := StrToint(Item1.Caption);
  DayOfWeek2 := StrToint(Item2.Caption);
  Time1 := StrToTime(Item1.SubItems[0]);
  Time2 := StrToTime(Item2.SubItems[0]);

  if DayOfWeek1 = DayOfWeek2 then
  begin
    Result := CompareTime(Time1, Time2);
  end
  else
  begin
    if DayOfWeek1 > DayOfWeek2 then
      Result := 1
    else
      Result := -1;
  end;
end;

end.
Что не так?
Вложения
Тип файла: zip virtual listview sort.zip (8.1 Кб, 11 просмотров)
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 14.11.2016, 02:13   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

какого типа первый параметер в CustomSort?
come-on вне форума Ответить с цитированием
Старый 14.11.2016, 07:42   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Убери CustomSortProc из методов формы.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.11.2016, 15:06   #4
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Убери CustomSortProc из методов формы.
Убрал, запускается, но не сортирует. Поставил breakpoint в начало CustomSortProc, но она нигде не вызывается.
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 15.11.2016, 20:39   #5
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

Список точно виртуальный? т.е. свойство OwnerData = true?
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Старый 15.11.2016, 20:41   #6
CraZZZy-GameRRR
Пользователь
 
Регистрация: 15.04.2010
Сообщений: 98
По умолчанию

Цитата:
Сообщение от 3D Hunter Посмотреть сообщение
Список точно виртуальный? т.е. свойство OwnerData = true?
Именно так.
CraZZZy-GameRRR вне форума Ответить с цитированием
Старый 15.11.2016, 20:55   #7
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

тогда используйте свойство AllocBy и метод Repaint(); заполняете данные в событии onData.
"ковыряю изнутри" (с)
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка в listview HTTqp Общие вопросы Delphi 6 30.01.2014 18:04
Сортировка в ListView and1733 C++ Builder 11 27.06.2013 12:50
Сложная сортировка в ListView Puhovoi Помощь студентам 0 02.01.2012 12:38
Сортировка данных в ListView Shouldercannon Общие вопросы Delphi 5 05.07.2011 15:11
ListView сортировка Viten2 Компоненты Delphi 6 25.03.2007 00:28