Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Общие вопросы > Is not valid integer value / Delphi XE


Автор: Kirilis2018 23.04.18, 20:33
Программа меняет все значения, со знаком (=), в порядке убывания. А когда ввожу без знака (=) то возникает ошибка.

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

user posted image
user posted image


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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;

Автор: Shaggy 23.04.18, 22:29
по поводу сообщения:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      if TryStrToInt(L.ValueFromIndex[ind1], i1)
      then
        // выводим своё сообщение или делаем какие-то другие действия


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

TStringList является списком строк определённого формата: name=value
знак '=' является разделителем по умолчанию и когда мы берём значение таким способом L.ValueFromIndex[ind1] отбрасывается
строки =1, =2 и т.д. трактуются как параметры без имени, но со значением
строки 1, 2, и т.д. трактуются как параметры с именем, но без значения
соответственно беря значение любого такого параметра (L.ValueFromIndex[ind1]) мы получаем '' (пустую строку)
конвертировать её в число, конечно, не получается

Автор: ^D^ima 24.04.18, 08:21
А так не катит?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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;

Автор: Kirilis2018 24.04.18, 08:23
Цитата ^D^ima @
А так не катит?

Так вообще идеально. Но просто хотелось посмотреть на работу самой функции MySort.

Автор: ^D^ima 24.04.18, 11:14
Kirilis2018
Формально твою задачу можно решить так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    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;

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)