На главную Наши проекты:
Журнал   ·   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_
  
> Is not valid integer value / Delphi XE
    Программа меняет все значения, со знаком (=), в порядке убывания. А когда ввожу без знака (=) то возникает ошибка.

    И вот вопрос: Как, место сообщения Is not valid integer value - Вывести свой текст. К примеру, сообщение: "Внимание, вы ввели неправильные - значения".

    user posted image
    user posted image


    ExpandedWrap disabled
      function MySort(L: TStringList; ind1, ind2: integer): integer;
      var i1, i2: integer;
      begin
       i1 := StrToInt(L.ValueFromIndex[ind1]);
       i2 := StrToInt(L.ValueFromIndex[ind2]);
       if i1 = i2 then result := 0
        else if i1 > i2 then result := 1
              else result := -1;
      end;
       
      procedure TForm1.Button2Click(Sender: TObject);
      var L: TStringList;
      begin
       L := TStringList.Create;
       L.Text := Memo1.Text;
       L.CustomSort(MySort);
       Memo2.Text := L.Text;
       L.Free;
      end;
    Сообщение отредактировано: Kirilis2018 -
      по поводу сообщения:
      ExpandedWrap disabled
          if TryStrToInt(L.ValueFromIndex[ind1], i1)
          then
            // выводим своё сообщение или делаем какие-то другие действия


      по поводу причины возникновения ошибки:

      TStringList является списком строк определённого формата: name=value
      знак '=' является разделителем по умолчанию и когда мы берём значение таким способом L.ValueFromIndex[ind1] отбрасывается
      строки =1, =2 и т.д. трактуются как параметры без имени, но со значением
      строки 1, 2, и т.д. трактуются как параметры с именем, но без значения
      соответственно беря значение любого такого параметра (L.ValueFromIndex[ind1]) мы получаем '' (пустую строку)
      конвертировать её в число, конечно, не получается
        А так не катит?
        ExpandedWrap disabled
          Var
           SL:TStringList;
           I:Integer;
          begin
            SL:=TStringList.Create;
           
            SL.Sorted:=true;
            SL.Text:=Memo1.Text;
              For I:=SL.Count-1  downto 0 do memo2.Lines.Add(SL.Strings[I]);
            SL.Free;
          end;
          Цитата ^D^ima @
          А так не катит?

          Так вообще идеально. Но просто хотелось посмотреть на работу самой функции MySort.
            Kirilis2018
            Формально твою задачу можно решить так:
            ExpandedWrap disabled
              function MySort(L: TStringList; ind1, ind2: integer): integer;
              var i1, i2: integer;
              begin
                if TryStrToInt(L.Strings[ind1],i1) then i1 := StrToInt(L.Strings[ind1]) else  i1 := StrToInt(L.ValueFromIndex[ind1]);
                if TryStrToInt(L.Strings[ind2],i2) then i2 := StrToInt(L.Strings[ind2]) else  i2 := StrToInt(L.ValueFromIndex[ind2]);
               
               if i1 = i2 then result := 0
                else if i1 < i2 then result := 1
                      else result := -1;
              end;
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0229 ]   [ 16 queries used ]   [ Generated: 19.04.24, 08:15 GMT ]