• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

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

Dock1100

Попробуй вместо integer тип int64

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

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

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

Guest

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

end;

Так?
 
D

Dock1100

в принципе да, тока надо поставить проверку чтоб там были токо цифры
к примеру
Код:
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(чтоб не делать поверку на наличие цифр)
 
G

Guest

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

Dock1100

Можно попробовать сделать свою процедуру типа strtoint тока разчитаную на огромное число
если получится выложу пример
 
D

Dock1100

Вышло но максимум 10 цифр если больше то результат не соответствеут введенному

Код:
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;
 
D

Dock1100

Если переменную k поставить в double то удалось выжеть 16 цифр.

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

Код:
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 цифр
 
M

mibin

Короче, кто-нибудь слышал о такой фигне как Length проверяй строку на длинну и все
 
E

EdgarWine

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

А я б как-то так сделал:
Код:
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;

З.Ы. Про использование забыл:
Код:
var i: integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
if getvalue1(i) then
Form1.Caption:=IntToStr(i);
end;
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!