Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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);
 .....
 


Наверх

Титульная страница Поиск, карта сайта Написать письмо