Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2009, 08:55   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Вопрос Не могу устранить ошибку EAccessViolation

Написал процедуру поиска в таблице для моей программы. Вводишь букву в строку и в таблице остаются только результаты с этой буквы. Вводишь еще одну - остаются только результаты, которые начинаются с двух этих букв. В теории все работает, но когда ввожу букву в строку, вылетает ошибка EAccessViolation и подсвечивается строка:
Код:
Compare := Compare + (GameList.Cells[0,i])[i2];
Вот полный код:
Код:
procedure TMainForm.FindChange(Sender: TObject);
var i, i2, Max, Num, x, y: integer; Compare: string;
begin
  if Find.Text <> '' then
    begin
      Ini := TIniFile.Create(extractfilepath(Application.ExeName) + 'Games.ini');
      Ini.ReadSection('General', StrGrid);
      Compare := '';
      Num := 1;
      Max := 1;
      while GameList.Cells[0,Max] <> '' do
        if GameList.Cells[0,Max] <> '' then Max := Max + 1;
      for i := 1 to Max - 1 do
        begin
          for i2 := 1 to length(Find.Text) do
            if GameList.Cells[0,i] = '' then break;
            Compare := Compare + (GameList.Cells[0,i])[i2];
          if Compare = Find.Text then
            begin
              GameList.Cells[0,Num] := GameList.Cells[0,i];
              GameList.Cells[1,Num] := GameList.Cells[1,i];
              GameList.Cells[2,Num] := GameList.Cells[2,i];
              GameList.Cells[3,Num] := GameList.Cells[3,i];
              GameList.Cells[4,Num] := GameList.Cells[4,i];
              Num := Num + 1;
            end;
          for x := 0 to 4 do
            for y := Num to 100 do
              GameList.Cells[x,y] := '';
        end;
    end;
  if Find.Text = '' then IsChange := true;
end;
Вроде бы такая ошибка означает выход за границы массива, но где тут он может быть? Вроде выполнил проверку, чтобы он не брал пустые строки. Надеюсь на вашу помощь!
k1r1ch вне форума Ответить с цитированием
Старый 05.07.2009, 10:36   #2
lexaltd
Форумчанин
 
Регистрация: 21.07.2008
Сообщений: 192
По умолчанию

Если на вскидку ,то
1).
Код:
 while GameList.Cells[0,Max] <> '' do
  if GameList.Cells[0,Max] <> '' then Max := Max + 1;
это вроде цикл , он происходит только в этой строке if GameList.Cells[0,Max] <> '' then Max := Max + 1; это правильно?

2).
Код:
for i2 := 1 to length(Find.Text) do
 if GameList.Cells[0,i] = '' then break;
Это цикл происходит только с этой строкой if GameList.Cells[0,i] = '' then break; , мне так кажется для этой строки он не нужен , если этот цикл нужен ещё для чего то то нужно поставить begin end;

Скорей всего надо так:
Код:
for i2 := 1 to length(Find.Text) do
 begin
  if GameList.Cells[0,i] = '' then break;
  Compare := Compare + (GameList.Cells[0,i])[i2];
 end;

Последний раз редактировалось lexaltd; 05.07.2009 в 10:39.
lexaltd вне форума Ответить с цитированием
Старый 05.07.2009, 10:44   #3
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Действительно, во втором случае я просто забыл поставить begin...end! Спасибо большое, теперь все работает.

Похожая ошибка, поэтому продолжил писать в этой теме. Стал я изменять процедуру дальше, подстраивая под нужды программы. И сейчас программа выдает такую ошибку при вводе чего-либо в строку поиска:
First chance exception at $7C812AFB. Exception class EStringListError with message 'List index out of bounds (4)'. Process Project1.exe (412)
И ничего не подсвечивает. Как я понимаю, программа ссылается на строчку, которой не существует.
Вот код:
Код:
var  
  Ini: TIniFile;
  StrGrid: TStrings;

procedure TMainForm.FindChange(Sender: TObject);
var i, i2, Num, x, y: integer; Compare: string;
begin
  IsChange := true;
  TimerTimer(Sender);
  if Find.Text <> '' then
    begin
      Ini := TIniFile.Create(extractfilepath(Application.ExeName) + 'Games.ini');
      Ini.ReadSection('General', StrGrid);
      for i := 0 to StrGrid.Count - 1 do
        Num := 1;
        Compare := '';
        for i2 := 1 to length(Find.Text) do Compare := Compare + (StrGrid[i])[i2];
          if Compare = Find.Text then
            begin
              GameList.Cells[0,Num] := StrGrid[i];
              GameList.Cells[1,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Genre', '');
              GameList.Cells[2,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Dev', '');
              GameList.Cells[3,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Pub', '');
              GameList.Cells[4,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Year', '');
              Num := Num + 1;
            end;
  for x := 0 to 4 do
    for y := Num to 99 do
      GameList.Cells[x,y] := '';
  Ini.Free;
  New.Caption := Compare;
end;
Что делать?

Последний раз редактировалось Stilet; 06.07.2009 в 10:32.
k1r1ch вне форума Ответить с цитированием
Старый 06.07.2009, 10:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну а на какой строке вылетает ошибка?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2009, 11:08   #5
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Так вот именно что оно ничего не выделяет! А число в скобках меняется в зависимости от кол-ва записей в General Ini-файла.
k1r1ch вне форума Ответить с цитированием
Старый 06.07.2009, 11:18   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Тогда прикрепляй сюда весь проект.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2009, 11:48   #7
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Вот проект:
http://files.getdropbox.com/u/1278190/GameBrowser.rar
Это моя первая программа вообще, так что смеяться не надо)
k1r1ch вне форума Ответить с цитированием
Старый 06.07.2009, 11:55   #8
lexaltd
Форумчанин
 
Регистрация: 21.07.2008
Сообщений: 192
По умолчанию

Опять тоже самое
Вот у тебя цикл
Код:
for i := 0 to StrGrid.Count - 1 do
        Num := 1;
И что он делает - Num := 1;
Наверно опять , нужно поставить begin end


Наверно надо так
Код:
for i := 0 to StrGrid.Count - 1 do
begin
        Num := 1;
        Compare := '';
        for i2 := 1 to length(Find.Text) do Compare := Compare + (StrGrid[i])[i2];
          if Compare = Find.Text then
            begin
              GameList.Cells[0,Num] := StrGrid[i];
              GameList.Cells[1,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Genre', '');
              GameList.Cells[2,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Dev', '');
              GameList.Cells[3,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Pub', '');
              GameList.Cells[4,Num] := Ini.ReadString(GameList.Cells[0,Num], 'Year', '');
              Num := Num + 1;
            end;
end;

Последний раз редактировалось lexaltd; 06.07.2009 в 12:02.
lexaltd вне форума Ответить с цитированием
Старый 06.07.2009, 12:07   #9
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Да, это причина ошибки! Но все равно поиск работает криво. Может поможете сделать что-нибудь? Просто он то ищет, то не ищет...
k1r1ch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Устранить ошибку в коде Divoha Общие вопросы C/C++ 11 27.06.2009 15:13
Как устранить ошибку Cannot instantiate non-existent class SeRhy PHP 1 28.04.2009 03:54
Как устранить ошибку "socket error #10060" Evgen1976 Работа с сетью в Delphi 11 20.03.2009 15:21
Не могу найти ошибку . KVANTOM Общие вопросы Delphi 2 08.01.2009 17:15
Устранить ошибку AlenaBEL Помощь студентам 7 23.11.2008 15:00