Запрет превышения типа Integer

Тема в разделе "Delphi - FAQ", создана пользователем -, 13 мар 2010.

Статус темы:
Закрыта.
  1. Гость

    Программа всё та же самая: не позволяет пользователю вводить в Edit'ы и StringGrid буквы, символы и прочую чепуху, не позволяет выходить за границы массива. Это я сделала (спасибо Вам :( ). НО ещё нужно сделать чтобы программа не вылетала если мы вводим число превышающее диапазон Integer (-2147483648..2147483647) и как только будет попытка ввести число большее то программа должна выдавать сообщение "Превышен размер числа!" и стирать неправильное число.
    Вот программа:
    Код (Text):
    unit laba3;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Grids;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;
    I,J: integer;
    implementation

    {$R *.dfm}
    procedure TForm1.Edit1Change(Sender: TObject);
    begin
    If (StrToInt(Edit1.Text)>20) OR (StrToInt(Edit1.Text)<=0)
    then begin ShowMessage('Выход за границы массива!');
    Edit1.Text:='20';
    end;
    StringGrid1.ColCount:=StrToInt(Edit1.Text)+1;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    const
    SIZE=20;
    var
    a: array[1..SIZE] of integer;
    n: integer;
    found: boolean;
    i,m: integer;
    begin
    {ввод числа элементов массива n<20}
    n:=StrToInt(Edit1.text);
    {ввод массива }
    for i:=1 to n-1 do
    a[i]:=StrToInt(StringGrid1.Cells[i,1]);

    {ввод искомого элемента массива}
    m:=StrToInt(Edit2.text);
    {процедура поиска в массиве}
    found:=false;
    i:=1;
    repeat
    if a[i]=m then
    found:=true
    else
    i:=i+1;
    until (i>n) or (found = true);
    if found=true then
    ShowMessage('Совпадение с элементом номер '+ IntToStr(i)+#13+
    'Поиск успешно завершен')
    else
    ShowMessage('Заданный элемент не найден!');
    end;

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
    begin
    case Key of
    '0'..'9':;
    else
    begin
    Key := #0;
    ShowMessage('Недопустимый элемент!');
    end;
    end;
    end;
    procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
    begin
    case Key of
    '0'..'9':;
    else
    begin
    Key := #0;
    ShowMessage('Недопустимый элемент!');
    end;
    end;
    end;

    procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
    begin
    case Key of
    '0'..'9':;
    else
    begin
    Key := #0;
    ShowMessage('Недопустимый элемент!');
    end;
    end;
    end;
    end.
    Какое условие нужно сделать? С if'ами не прокатывает, вылетает :)
     
  2. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Попробуй вместо integer тип int64

    Min значение int64 = -9223372036854775808
    Max значение int64 = 9223372036854775807

    Strtoint должен его поддерживать

    а насчет иф то попробуй опять же через try
     
  3. Гость

    Код (Text):
    procedure TForm1.Edit2Change(Sender: TObject);
    begin
    Try
    StrToInt(Edit2.text);
    Except
    ShowMessage('Превышен размер числа!');
    end;

    end;
    Так?
     
  4. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    в принципе да, тока надо поставить проверку чтоб там были токо цифры
    к примеру
    Код (Text):
    var ind:boolean;
    i,k:integer;
    begin
    ind:=false;
    for i:=1 to length(edit2.text) do
    begin
    try
    k:=strtoint(edit2.text[i]);
    except
    ind:=true;
    end;
    end;
    Try
    StrToInt(Edit2.text);
    Except
    if ind then ShowMessage('incorect data') else ShowMessage('Превышен размер числа!');
    end;
    end;
    или же использавать maskedit(чтоб не делать поверку на наличие цифр)
    Окна редактирования Edit и MaskEdit
     
  5. Гость

    Всё равно вылетает если я ввожу например 9999999999999999999999 :( Наверно не судьба мне сделать такую программу :)
     
  6. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Можно попробовать сделать свою процедуру типа strtoint тока разчитаную на огромное число
    если получится выложу пример
     
  7. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Вышло но максимум 10 цифр если больше то результат не соответствеут введенному

    Код (Text):
    function TForm1.BigStrToReal(s: string):double;
    var i,k:integer;
    temp,temp2:double;
    ind:boolean;
    begin
    ind:=true;
    if s[1]='-' then
    begin
    delete(s,1,1);
    end;
    k:=1;
    for i:= length(s) downto 1 do
    begin
    temp:=strtoint(s[i]);
    temp2:=temp2+temp*k;
    k:=k*10;
    end;
    BigStrToReal:=temp2;
    end;
     
  8. Гость

    Огромное спасибо :)
     
  9. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.474
    Симпатии:
    27
    Док заслужил плюс=) Это такой типа намек)
     
  10. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Если переменную k поставить в double то удалось выжеть 16 цифр.

    хотя можна сделать по другому

    Код (Text):
    var k:real;
    begin
    label1.Caption:=format('%20.10g', [chislo]);//переводим real в string; 20 количество чифр до точки, 10 после
    k:=strtofloat(edit3.text); //переводим string в real
    label2.caption:=format('%50.83g', [k]); //50 количество чифр до точки, 83 после
    end;
    в место точки ставте "," и для норм преревода вводите до 16 цифр
     
  11. mibin

    mibin Well-Known Member

    Регистрация:
    29 янв 2009
    Сообщения:
    48
    Симпатии:
    0
    Короче, кто-нибудь слышал о такой фигне как Length проверяй строку на длинну и все
     
  12. Dock1100

    Dock1100 :-]

    Регистрация:
    9 ноя 2009
    Сообщения:
    678
    Симпатии:
    0
    Ну слышали, а причем тут это?
     
  13. EdgarWine

    EdgarWine Гость

    Думаю товарищь как бы имел ввиду что если в строке больше 10-ти символов, то число полюбому неправильное, а если меньше либо равно 9-ти символам - то полюбому верное... (без знака "-") :)

    А я б как-то так сделал:
    Код (Delphi):
    function getvalue1(var a: Integer): boolean;
    var i: int64;
    begin
    result:=false;
    i:=StrToInt64(Form1.Edit1.Text);
    if (i>MaxInt) or (i+1<-MaxInt) then
    Form1.Edit1.Text:='0'
    else
    begin
    a:=i;
    result:=true;
    end;
    end;
    З.Ы. Про использование забыл:
    Код (Delphi):
    var i: integer;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if getvalue1(i) then
    Form1.Caption:=IntToStr(i);
    end;
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей