![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi 7: маленькая ошибка, StringGrid и массив
Первокурсница © (2010-03-04 14:13:00)Здравствуйте.
Ниже приведен текст программы поиска в массиве целых чисел. Перебор элементов массива осуществляет оператором repeat, в теле которой оператор if сравнивает текущий элемент массива с заданным и присваивает переменной found значение true, если текущий элемент и заданный равны. Цикл завершается, если в массиве обнаружен искомый элемент, (found=true), или если проверены все элементы массива. По завершении цикла, проверив значение переменной found, можно определить, успешен поиск или нет.
Проблема возникла в том, что кажется я неправильно заполняю массив значениями которые ввожу в StringGrid. Возникает окно с ошибкой:
with message '''is not a valid integer value'. Хотелось бы от этой ошибки избавиться.
unit Unit11Filin;
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);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
I,J: integer;
implementation
{$R *.dfm}
{Function GetSubStr(st:string; n: integer) :string;
var
p, i:integer;
begin
for i:=1 to n-1 do
begin
p:=pos(' ',st);
st:=copy(st,p+1,Length(st)-p);
//если в начале оставшейся части строки
//есть пробелы, то они удаляются
while (pos(' ',st)=1) and (length(st)>0) do
delete(st,1,1);
end;
p:=pos(' ',st);
if p <> 0
then result:=copy(st,1,p-1) else result:=st;
end;}
procedure TForm1.Edit1Change(Sender: TObject);
begin
StringGrid1.ColCount:=StrToInt(Edit1.Text);
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 do
a[i]:=StrToInt(StringGrid1.Cells[J,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;
end.
Ega23 (2010-03-05 12:37:00) [1]
> Прекрасно понимаю. Вопрос только - хорошо это или плохо.
Ну вот в данном очень конкретном случае с TryStrToInt лично яособого выигрыша или удобства не вижу.
Игорь Шевченко (2010-03-05 11:52:00) [2]Ega23 © (05.03.10 11:17) [12]
> В пятёрке этого не было, а поскольку на D7 перещёл всего
> лет 5 назад, то до этого выработалась устойчивая привычка.
> Я уже даже не задумываюсь.
Прекрасно понимаю. Вопрос только - хорошо это или плохо.
Я до сих пор иногда пользуюсь самописным HSObjectList, наследник класса TList, который подчищает за собой объекты, написанный еще до TObjectList в Delphi.
Набор возможностей языка от версии к версии обычно расширяется, более того, обычно в лучшую сторону. Набор функций в стандартных юнитах - тоже. Борланды, они конечно способствуют частично переходу, ставя модификатор deprecated,но не всегда и не везде :)
Ega23 (2010-03-05 11:17:00) [3]
> Ну если пальцы из нержавеющей стали, тогда конечно, отчего
> бы не пообъявлять лишних мусорных переменных :)
В пятёрке этого не было, а поскольку на D7 перещёл всего лет 5 назад, то до этого выработалась устойчивая привычка. Я уже даже не задумываюсь.
> не спорь с гением
+1 :)
KilkennyCat (2010-03-05 02:00:00) [4]
> Игорь Шевченко © (04.03.10 14:56) [10]
не спорь с гением
:)
Игорь Шевченко (2010-03-04 14:56:00) [5]Ega23 © (04.03.10 14:52) [9]
Ну если пальцы из нержавеющей стали, тогда конечно, отчего бы не пообъявлять лишних мусорных переменных :)
Ega23 (2010-03-04 14:52:00) [6]
> И че ?
Те же яйца, только сбоку. Предпочитаю изначальный Val. Ну а дальше - кому как нравится.
Игорь Шевченко (2010-03-04 14:51:00) [7]Ega23 © (04.03.10 14:45) [6]
И че ?
Первокурсница (2010-03-04 14:47:00) [8]Ega23, помогло! Ты гений!
Ega23 (2010-03-04 14:45:00) [9]
> Игорь Шевченко © (04.03.10 14:38) [4]
>
> TryStrToInt
function TryStrToInt(const S: string; out Value: Integer): Boolean;
var
E: Integer;
begin
Val(S, Value, E);
Result := E = 0;
end;
Игорь Шевченко (2010-03-04 14:38:00) [10]Ega23 © (04.03.10 14:23) [2]
> Val
TryStrToInt
Игорь Шевченко (2010-03-04 14:38:00) [11]Автор, форматируй код.
Первокурсница (2010-03-04 14:28:00) [12]Ega23, спасибо большое, сейчас попробую
123 (2010-03-04 14:23:00) [13]
> message '''is not a valid integer value
генирится оператором StrToInt
надо поставить там брейкпойнт и смотреть почему туда приходит not a valid integer value
Ega23 (2010-03-04 14:23:00) [14]
a[i]:=StrToInt(StringGrid1.Cells[J,1]);
var
v, Code : Integer;
begin
.......
Val(StringGrid1.Cells[J,1], v, Code);
if (Code > 0) then
begin
ShowMessage('Фигня, а не число');
Exit;
end;
a[i] := StrToInt(v);
.....