На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Сортировка TStringList по убыванию , TStringList
    Мне надо отсортированить TStringList. Нашла в DRKB3 Вот как:
    ExpandedWrap disabled
      MyList        := TStringList.Create;
        MyList.Sorted := False;
        try
          begin
            for I := 1 to (CountItem - 1) do
              MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator +
                GenStrGrid.Rows[I].Text);
              Mylist.Sort;

    Но тут сортирует по возрастанию. А мне оказалось надо по убыванию. Пожскажите пожалуйста. Может есть какой параметр типа Asc, desc
      ExpandedWrap disabled
        function MySort(List: TStringList; Index1, Index2: Integer): Integer;
        begin
          if List[Index1]<List[Index2] then
          begin
            Result := 1;
            Exit;
          end;
          if List[Index1]=List[Index2]
            then Result := 0
            else Result := -1;
        end;
         
         
        ...
        Mylist.CustomSort(MySort);
        а что такое Index1, Index2?
          Цитата mopsik @
          а что такое Index1, Index2?


          Метод CustomSort позволяет осуществить порьзовательскую сортировку. В функцию для сортировки передаются индексы строк в TStrings (Index1 и Index2), которые нужно сравнить.
          Открой справку Delphi.
            Метод Sort объекта класса TStringList по умочанию сортирует во возрастанию.
            Цитата
            Sorts the strings in the list in ascending order.

            Если посмотреть как это реализовано:
            ExpandedWrap disabled
              function StringListCompareStrings(List: TStringList; Index1, Index2: Integer): Integer;
              begin
                Result := List.CompareStrings(List.FList^[Index1].FString,
                                              List.FList^[Index2].FString);
              end;
               
              procedure TStringList.Sort;
              begin
                CustomSort(StringListCompareStrings);
              end;

            То можно легко догадаться, что для сортировки по убыванию надо переписать:
            ExpandedWrap disabled
              function StringListCompareStringsDesc(List: TStringList; Index1, Index2: Integer): Integer;
              begin
                Result := List.CompareStrings(List.FList^[Index2].FString,
                                              List.FList^[Index1].FString);
              end;

            И уже потом использовать метод CustomSort:
            ExpandedWrap disabled
              var
                Strs: TStringList;
              begin
                Strs := TStringList.Create;
                try
                  Strs.Add(...);
                  ...
                  Strs.CustomSort(StringListCompareStringsDesc);
                  ...
                finally
                  Strs.Free;
                end;
            Сообщение отредактировано: Selya -
              Selya
              см. реализацию InternalCompareText. Менее эффективный код в данном случае.
                Товарищи, я делаю, как вы говорите, но у меня на строчке Mylist.CustomSort(mysort)ругается:
                ExpandedWrap disabled
                  Incompatible types: regular procedure and method pointer
                  Цитата mopsik @
                  Incompatible types: regular procedure and method pointer


                  А ты что, MySort методом класса сделала?
                    ExpandedWrap disabled
                      unit Unit1;
                       
                      interface
                       
                      uses
                        ...;
                       
                      type
                        ...
                          function MySort(List: TStringList; Index1, Index2: Integer): Integer; stdcall;
                       
                       
                      implementation
                      ...
                      function TForm1.MySort(List: TStringList; Index1, Index2: Integer): Integer;stdcall;
                      begin
                        if List[Index1]<List[Index2] then
                        begin
                          Result := 1;
                          Exit;
                        end;
                        if List[Index1]=List[Index2]
                          then Result := 0
                          else Result := -1;
                      end;
                       
                      procedure TForm1.SortStringGrid(var GenStrGrid: TStringGrid; ThatCol: Integer);
                      //тут у меня сама процедура создания листа , занесения данных  и ........сортировка
                      MyList        := TStringList.Create;
                        MyList.Sorted := False;
                        try
                          begin
                            for I := 1 to (CountItem - 1) do
                              MyList.Add(GenStrGrid.Rows[I].Strings[ThatCol] + TheSeparator +
                                GenStrGrid.Rows[I].Text);
                      Mylist.CustomSort(mysort);
                    А что неправильно?
                      ExpandedWrap disabled
                        type
                          TForm1=...
                            ...
                            ...
                          end;
                         
                        [B]function MySort(List: TStringList; Index1, Index2: Integer): Integer;[/B]
                         
                        implementation
                         
                        [B]function MySort(List: TStringList; Index1, Index2: Integer): Integer;[/B]
                        begin
                          if List[Index1]<List[Index2] then
                          begin
                            Result := 1;
                            Exit;
                          end;
                          if List[Index1]=List[Index2]
                            then Result := 0
                            else Result := -1;
                        end;


                      И никаких stdcall!
                      Сообщение отредактировано: Демо -
                        Ой, исправила.....исправила!
                        Получилось....получилось! :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:
                        Демо спасибо большое
                          [quote=mopsik,1212926208,1981206]А мне оказалось надо по убыванию.[/quote]

                          Ну в таком случае все гораздо тривиальнее! :) Строку
                          [quote=mopsik,1212926208,1981206]for I := 1 to (CountItem - 1) do[/quote]
                          Надо заменить на строку
                          ExpandedWrap disabled
                            for I := (CountItem - 1) downto 1 do[/quote]


                          ЗЫЖ Кстати, индексы начинаяют с нуля...
                          Сообщение отредактировано: Felan -
                            [quote=Felan,1212986535,1981559]Строку
                            Цитата (mopsik @ Вчера, 17:56)
                            for I := 1 to (CountItem - 1) do

                            Надо заменить на строку

                            for I := (CountItem - 1) downto 1 do[/quote]

                            [/quote]
                            :no: Сортировка выполняется не этим циклом, а последующим вызовом MyList.Sort.
                              Тьфу-ты :) Прогнал :)
                              Переклинило меня что-то что это вывод уже. :)
                                На самом деле - всё гораздо проще. ;)
                                Идея в том, что если мы имеем хотя бы обычную сортировку, то ничто нам не мешает просто повернуть уже отсортированный лист.

                                ExpandedWrap disabled
                                  procedure ReverseList(var List: TStringList);
                                  var
                                    TmpList: TStringList;
                                    I: Integer;
                                  begin
                                    TmpList := TStringList.Create;
                                    for I := List.Count -1 DownTo 0 do
                                      TmpList.Append(List[I]);
                                    List.Assign(TmpList);
                                    TmpList.Free;
                                  end;
                                   
                                  ...
                                  procedure TForm1.Button1Click(Sender: TObject);
                                  var
                                    List: TStringList;
                                  begin
                                    List := TStringList.Create;
                                    List.Append('a');
                                    List.Append('v');
                                    List.Append('e');
                                    List.Append('z');
                                    List.Sort;
                                    ReverseList(List);
                                    Memo1.Lines.Assign(List);
                                    List.Free;
                                  end;
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0467 ]   [ 15 queries used ]   [ Generated: 27.07.24, 09:11 GMT ]