Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Почему вылазит ошибка acces violation?


Автор: Fhusy 27.1.2010, 21:07
Кароч вопрос очень простой почему ошибка при вызове процедуры?
Код

procedure sgt(sg3:tstringgrid);
var i:integer;
    sg:tstringgrid;
    c:char;
begin
c:='x';
sg:=sg3;
    for i:=0 to sg.RowCount-1 do
     if sg.Cells[1,i][1]=c then
end;

Автор: ~FoX~ 27.1.2010, 21:15
Fhusy,  if sg.Cells[1,i][1]=c then
Это кто такой?

Автор: chip_and_dayl 27.1.2010, 21:16
Потому, что если ячейка пустая или там один символ, то  ты обращаешься к ... даже не знаю как его назвать

Добавлено @ 21:17
~FoX~
Я тож думал что это. Это в первых квадратных скобках номер строки и столбца, а второй это номер символа в ячейке [1,i]

Добавлено через 3 минуты и 59 секунд
Код

procedure sgt(sg3:tstringgrid);
var i:integer;
    sg:tstringgrid;
    c:char;
begin
c:='x';
sg:=sg3;
    for i:=0 to sg.RowCount-1 do
     if sg.Cells[1,i][1]=c then
end;


Вот это 
Код

   sg:tstringgrid;


и это
Код

sg:=sg3;

есть лишними. Делаешь лишние движения. Можно просто

Код

procedure sgt(sg3:tstringgrid);
var i:integer;
    c:char;
begin
c:='x';
    for i:=0 to sg3.RowCount-1 do
     if sg3.Cells[1,i][1]=c then
end;



Автор: Frees 27.1.2010, 21:21
Цитата(~FoX~ @  28.1.2010,  00:15 Найти цитируемый пост)
Это кто такой?

первый символ в ячейке

Код

procedure sgt(sg3:TStringGrid);
var i:integer;
    c:char;
begin
   c:='x';
   if not Assigned(sg3) then
     Exit;

   for i:=0 to sg3.RowCount-1 do
      if (Length(sg3.Cells[1,i]) >= 1)and(sg3.Cells[1,i][1] = c) then
        ;//что то делаем
end;


и вызов еще покажи

Автор: chip_and_dayl 27.1.2010, 21:23
Нужно делать проверку перед

Код

if sg3.Cells[1,i][1]=c then


Код

if (Length(StringGrid1.Cells[i,1])>1) then

Автор: Fhusy 27.1.2010, 21:28
Цитата(Frees @ 27.1.2010,  21:21)
Цитата(~FoX~ @  28.1.2010,  00:15 Найти цитируемый пост)
Это кто такой?

первый символ в ячейке

Код

procedure sgt(sg3:TStringGrid);
var i:integer;
    c:char;
begin
   c:='x';
   if not Assigned(sg3) then
     Exit;

   for i:=0 to sg3.RowCount-1 do
      if (Length(sg3.Cells[1,i]) >= 1)and(sg3.Cells[1,i][1] = c) then
        ;//что то делаем
end;


и вызов еще покажи

спасиб большое помогло, тока можна в свою очередь кинуть вопросик а кто это такой if not(assigned sg3)?

Автор: Frees 27.1.2010, 21:30
если передан не созданный объект то выйти из процедуры

рас тебе помогло значит ты не правельно вызываеш функцию, точнее посылаеш ей не существующий StringGrid

Автор: ~FoX~ 27.1.2010, 21:31
Цитата(Fhusy @  27.1.2010,  22:28 Найти цитируемый пост)
if not(assigned sg3)

Если по каким то причинами sg3 отсутствует или не доступен, в общем "не назначенный"

Автор: chip_and_dayl 27.1.2010, 21:31
Fhusy
Проверяет на существование обьекта sg3. Это на случай, если забыли передать ссылку на StringGrid

Автор: Fhusy 27.1.2010, 21:55
спасибо за ответы

Автор: CodeMonkey 28.1.2010, 12:42
http://transl-gunsmoker.blogspot.com/2009/09/blog-post.html.

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