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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2018, 21:07   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
Вопрос StringGrid сортировка через StrCmpLogicalW

Есть StringGrid 3 на 10. Хочу сделать сортировку всех столбцов по второму столбцу с помощью
Код:
function StrCmpLogicalW(psz1, psz2: PWideChar): Integer; stdcall; external 'shlwapi.dll';
...
function Sort(List: TStringList; Index1, Index2: Integer): Integer;
var
  ws1, ws2: WideString;
begin
  ws1 := List[Index1];
  ws2 := List[Index2];
  Result := StrCmpLogicalW(Pointer(ws1), Pointer(ws2));
end;
Встал вопрос как в эту функцию передать параметры?
Shouldercannon вне форума Ответить с цитированием
Старый 18.05.2018, 09:44   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
Встал вопрос как в эту функцию передать параметры?
Вы имеет в виду StrCmpLogicalW ?
так они уже передаются.
Эта функция, которая сравнивает две строки.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.05.2018, 10:01   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

PWideChar

и отсортируешь только второй столбец. К этой функции то можно обращаться, а вот строки грида будь добр сам перетаскивай ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.05.2018 в 10:05.
Аватар вне форума Ответить с цитированием
Старый 18.05.2018, 21:45   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Есть такой способ сортировки
Код:
procedure TForm1.SortGrid(Column: integer);
var
  I, I2: integer;
  SL: TStringList;
begin
  try
    SL := TStringList.Create;
    try
      for I := 1 to StringGrid1.RowCount - 1 do // С 1, чтобы заголовки не трогать
      begin
        for I2 := I + 1 to StringGrid1.RowCount - 1 do
        begin
          // Cортируем по возрастанию
          if AnsiCompareStr(StringGrid1.Cells[Column, I], StringGrid1.Cells[Column, I2]) > 0 then
          begin
            SL.Assign(StringGrid1.Rows[I]);
            StringGrid1.Rows[I] := StringGrid1.Rows[I2];
            StringGrid1.Rows[I2] := SL;
          end;
        end;
      end;
    except
    end;
  finally
    FreeAndNil(SL);
  end;
end;
В него можно внедрить?
Код:
function NumberSort(List: TStringList; Index1, Index2: Integer): Integer;
И как оно будет выглядеть?
Shouldercannon вне форума Ответить с цитированием
Старый 19.05.2018, 01:22   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Shouldercannon Посмотреть сообщение
В него можно внедрить?
Код:
function NumberSort(List: TStringList; Index1, Index2: Integer): Integer;
можно.

а что такое NumberSort() ?
и зачем его внедрять в ваш код?

p.s. кстати, исправьте ошибку:
Код:
 for I := 1 to StringGrid1.RowCount - 2 do // С 1, чтобы заголовки не трогать
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2018, 09:10   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,893
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
можно.

а что такое NumberSort() ?
и зачем его внедрять в ваш код?

p.s. кстати, исправьте ошибку:
Код:
 for I := 1 to StringGrid1.RowCount - 2 do // С 1, чтобы заголовки не трогать
NumberSort() лишнее скопировал
Код:
procedure TForm1.SortGrid(ST: TStringGrid; Column: Integer);
var
  I, I2: integer;
  SL: TStringList;
begin
  try
    SL := TStringList.Create;
    try
      for I := 1 to ST.RowCount - 2 do // С 1, чтобы не трогать FixedRows
      begin
        for I2 := I + 1 to ST.RowCount - 1 do
        begin
          // Cортируем по возрастанию
          if StrCmpLogicalW(PWideChar(ST.Cells[Column, I]), PWideChar(ST.Cells[Column, I2])) > 0 then
          begin
            SL.Assign(ST.Rows[I]);
            ST.Rows[I] := ST.Rows[I2];
            ST.Rows[I2] := SL;
          end;
        end;
      end;
    except
    end;
  finally
    FreeAndNil(SL);
  end;
end;

Последний раз редактировалось Shouldercannon; 19.05.2018 в 09:22.
Shouldercannon вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как решить данную задачу не через StringGrid а через файл в котором и будут храниться данные ALEXandr20333 Помощь студентам 12 04.03.2014 12:16
сортировка StringGrid vovey Помощь студентам 4 11.04.2010 14:25
Сортировка в StringGrid Ch00kan0ff Общие вопросы C/C++ 2 24.03.2009 18:09
StringGrid и сортировка dee_lv Помощь студентам 5 02.05.2008 17:51