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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2019, 10:13   #1
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию Сортировка IP в listview

Народ, привет.

Пытаюсь организовать сортировку IP адреса...
Пока намудрил только это:
Код:
procedure TMainForm.ClientListColumnClick(Sender: TObject; Column: TListColumn);
                    function IpToDWORD(ip: String): DWORD;
                              begin
                                  Result := inet_addr(PChar(ip));
                              end;

                var
                value1,value2: DWORD;
              begin
                Result := 0;

                value1:=IpToDWORD(Copy(Item1.Caption,1,Pos(':',Item1.Caption)-1 )); {тут ип в виде ххх.ххх.ххх.ххх}
                value2:=IpToDWORD(Copy(Item2.Caption,1,Pos(':',Item2.Caption)-1 ));{тут ип в виде ххх.ххх.ххх.ххх}

                if value1 > value2 then
                  Result := ParamSort
                else if value1 < value2 then
                  Result := -ParamSort;
              end;
begin

  if Column.Caption = clmn_ip then
  begin
  ClearIcon(clmn_ip);
          if (Column.ImageIndex=-1) or (Column.ImageIndex=2)  then
          begin
           Sort:=1;
           Column.ImageIndex:=3 ;
          end
            else
          begin
           Sort:=-1;
           Column.ImageIndex:=2;
          end;
    ClientList.CustomSort(@SortIPAddr, Sort);
  end;

end;
Сортировка работает но по 2,3 и 4 разряду...
1 разряд в разброс идет...

Помогите понять что не так )
niockasd вне форума Ответить с цитированием
Старый 01.07.2019, 10:57   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Пытаюсь организовать сортировку IP адреса...
Цитата:
Код:
ClientList.CustomSort(@SortIPAddr, Sort);
так ?
а где же тот самый sortIPAddr ?!
Цитата:
Код:
                value1:=IpToDWORD(Copy(Item1.Caption,1,Pos(':',Item1.Caption)-1 )); {тут ип в виде ххх.ххх.ххх.ххх}
а ЕСТЬ ли в Item's искомый ":" ?

разложить преобразование исходной строки на составляющие и
СМОТРЕТЬ(проверять) все промежуточные переменные (s, k и снова s)
Код:
begin
  s:=Item1.Caption;
  k:=Pos(':',s); 
  s:=Copy(s,1, k-1 ); 
  value1:=IpToDWORD(s); {тут ип в виде ххх.ххх.ххх.ххх}
а еще ВСЕ это можно спокойно убрать в IPtoWord
Код:
function IPtoWORD(ipstr: string): WORD;
begin
  k:=pos(':', ipstr);
  s:=Copy(ipstr, 1, k-1);
  result:=inet_addr(s);
end;
Код:
value1:=IPtoWORD(item1.Caption);
value2:=IPtoWORD(item2.Caption);
if ...
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 01.07.2019, 12:04   #3
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Странно... но если сортировать как строку то вроде все ок
Код:

procedure TForm1.ClientListColumnClick(Sender: TObject; Column: TListColumn);


              function SortIPAddr(Item1, Item2: TListItem; ParamSort: Integer): Integer; stdcall;
              var
                value1,value2: string;
              begin
                Result := 0;

                value1:=(Item1.Caption);
                value2:=(Item2.Caption);

                if value1 > value2 then
                  Result := ParamSort
                else if value1 < value2 then
                  Result := -ParamSort;
              end;


begin
    ClientList.CustomSort(@SortIPAddr, Sort);
end;
niockasd вне форума Ответить с цитированием
Старый 03.07.2019, 18:22   #4
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Сортировка как строки проблему не решила) Все равно каша.
Вернулся к способу с inet_addr.
Упростил код для отладки и понимания картины.
Код:
procedure TForm1.ClientListColumnClick(Sender: TObject; Column: TListColumn);

               function IpToDWORD(ip: String): DWORD;
               begin
                Result := inet_addr(PAnsiChar(ip));
               end;

              function SortIPAddr(Item1, Item2: TListItem; ParamSort: Integer): Integer; stdcall;
              var
                value1,value2: DWORD;
              begin
                Result := 0;

                value1:=IpToDWORD(Item1.Caption);
                value2:=IpToDWORD(Item2.Caption);


                if value1 > value2 then
                  Result := ParamSort
                else if value1 < value2 then
                  Result := -ParamSort;
              end;


begin
    ClientList.CustomSort(@SortIPAddr, Sort);
end;
Скрин до сортировки


Скрин после сортировки


Что не так сделал? )
niockasd вне форума Ответить с цитированием
Старый 03.07.2019, 21:39   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Сортировка из одного из моих проектов
Вложения
Тип файла: zip Delphi.zip (57.1 Кб, 24 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 04.07.2019, 09:36   #6
niockasd
Пользователь
 
Регистрация: 01.12.2015
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Сортировка из одного из моих проектов
Спасибо, работает. Я правильно понимаю - StrCmpLogicalW работает и с числами и с строками и с ip.... Универсальная функция ?
niockasd вне форума Ответить с цитированием
Старый 04.07.2019, 22:01   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

StrCmpLogicalW со всем работает, через неё происходит сортировка в Windows Explorer (папки, файлы).
Shouldercannon вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка в виртуальном Listview CraZZZy-GameRRR Общие вопросы Delphi 6 15.11.2016 20:55
сортировка в listview HTTqp Общие вопросы Delphi 6 30.01.2014 18:04
Сортировка в ListView and1733 C++ Builder 11 27.06.2013 12:50
Сортировка Listview pascalabc.net Konstantin1706 Помощь студентам 1 22.01.2013 23:22
ListView сортировка Viten2 Компоненты Delphi 6 25.03.2007 00:28