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


Автор: Yantarik 17.9.2007, 12:14
При запуске программы возникает ошибка:


Код

Pjoect Sverka.exe raised exception class EAccessViolation whith messege 'Access violation at address 00000000. Read of address 00000000'. Process stopped.

Не знаю, что это? Как бороться? 

Автор: BaD_SeCt0R 17.9.2007, 12:28
Скорее всего твоя программа пытается работать с несуществующими данными. EAccessViolation - это исключение такое. Об этом можно прочитать почти в любой книжке о Делфи. Выложи код, а там посмотрим что и где у тебя не так.

Автор: Yantarik 17.9.2007, 12:43
Код

procedure TForm1.BADOClick(Sender: TObject);
var
ADOQuery1: TADOQuery;
begin
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='SELECT * INTO table1 FROM table2';
ADOQuery1.Open;
end;

Автор: aktuba 17.9.2007, 12:57
А создавать AdoQuery1 кто будет?

Автор: Yantarik 17.9.2007, 13:04
Цитата(aktuba @  17.9.2007,  12:57 Найти цитируемый пост)
А создавать AdoQuery1 кто будет? 

А как он создается?
На форме он есть, соединеный с  ADOConnection1.

Что-то еще надо?

Автор: dumb 17.9.2007, 13:06
ты просто перекрыл своим локальным var'ом объявление переменной из TForm1(которое создается автоматом при помещении на форму компонента ADOQuery). убери из этой процедуры раздел var.

Автор: Rodman 17.9.2007, 13:07
Код

var
  ADOQuery1: TADOQuery;
begin
  ADOQuery1:=TADOQuery.Create(Self);
  try
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Text:='SELECT * INTO table1 FROM table2';
    ADOQuery1.Open;
  finally
    ADOQuery1.Free;
  end;
end;

Автор: Yantarik 17.9.2007, 13:21
Rodman, при твоем коде выдает ошибку:
Код

Pjoect Sverka.exe raised exception class EDatabaseError with message 'Missing Connection or ConnectionString'.



dumb, 
Цитата(dumb @  17.9.2007,  13:06 Найти цитируемый пост)
перекрыл

Перекрыла smile
А разьве процедура может быть без var совсем? 


Автор: Rodman 17.9.2007, 13:23
Код

var
  ADOQuery1: TADOQuery;
begin
  ADOQuery1:=TADOQuery.Create(Self);
  try
    ADOQuery1.Connection:=ADOConnection1;
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Text:='SELECT * INTO table1 FROM table2';
    ADOQuery1.Open;
  finally
    ADOQuery1.Free;
  end;
end;

Автор: MetalFan 17.9.2007, 13:24
Цитата(Yantarik @  17.9.2007,  13:21 Найти цитируемый пост)
А разьве процедура может быть без var совсем? 

 smile  smile  smile 

Автор: Rodman 17.9.2007, 13:27
Цитата(Yantarik @  17.9.2007,  13:21 Найти цитируемый пост)
А разьве процедура может быть без var совсем? 

имеется ввиду что ты наформе создал этот компонент и в var'е снова объявил!

Автор: Yantarik 17.9.2007, 13:45
Rodman,  новая ошибка:
Код

Pjoect Sverka.exe raised exception class EDatabaseError with message 'CommandText does not return a result set'

Да, table1 в базе появляется и вроде даже как заполняется доконца(не проверяла - там более 500 строк).


MetalFan,  я спутала.... 

Цитата(dumb @  17.9.2007,  13:06 Найти цитируемый пост)
убери из этой процедуры раздел var

Я удалила var и ADOQuery1 создала новый, он его прописал в TForm1. Правда странно, когда я его вручную там пыталась прописать, программа ругалась, что переменная не описана... Поэтому я ее в процедуру-то и перенесла...

Автор: Rodman 17.9.2007, 13:56
Цитата(Yantarik @  17.9.2007,  13:45 Найти цитируемый пост)
Я удалила var и ADOQuery1 создала новый, он его прописал в TForm1. Правда странно, когда я его вручную там пыталась прописать, программа ругалась, что переменная не описана... Поэтому я ее в процедуру-то и перенесла...

туда добавляются переменные-компоненты, когда на форму кидаешь их

Автор: dumb 17.9.2007, 14:01
Цитата(Yantarik @  17.9.2007,  14:45 Найти цитируемый пост)
CommandText does not return a result set
ты пытаешься открыть(.Open) набор данных, а данный запрос(select into from) данных не возвращает. используй вместо .Open .ExecSQL

Автор: Yantarik 17.9.2007, 14:21
Цитата(dumb @  17.9.2007,  14:01 Найти цитируемый пост)
используй вместо .Open .ExecSQL 


Спасибо всем. Все получилось. smile

Автор: Lianamir 23.1.2008, 11:52
Ой уменя такаяже проблемма, а что делать в моем случае не знаю.........
Я по книге,  для учебы, переписваю код игры пятнашки и у меня вот что получилось............

Добавлено через 1 минуту и 25 секунд
Код

unit Un15;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)

      //эти процедуры вставляем вручную
          procedure ShowPole;
          procedure Mixer;
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
const
    H = 4;   W = 4;   // размер поля - 4х4
    CH = 64; CW = 64; // размер клеток - 16х16

var
    // правильное расположение фишек
    stp : array[1..H, 1..W] of byte =
    (( 1, 2, 3, 4),
     ( 5, 6, 7, 8),
     ( 9,10,11,12),
     (13,14,15, 0));

    // игровое поле
    pole: array[1..H, 1..W] of byte;

    ex,ey: integer; // координаты пустой клетки

// новая игра
procedure NewGame;
var
    i,j: integer;
begin
    // исходное (правильное) положение
    for i:=0 to H+1 do
        for j:=0 to W+1 do
            pole[i,j] := stp[i,j];
    Form1.Mixer;    // перемешать фишки
    Form1.ShowPole; // отобразить поле
end;

// проверяет, расположены ли
// фишки в нужном порядке
function Finish: boolean;
var
    row,col: integer;
    i: integer;
begin
    row :=1; col :=1;
    Finish := True; // пусть фишки в нужном порядке
    for i:=1 to 15 do
    begin
       if pole[row,col] <> i then
       begin
            Finish:= False;
            break;
       end;
       // к следующей клетке
       if col < 4
          then inc(col)
       else begin
          col :=1;
          inc(row);
       end;
    end;
end;


// "перемещает" фишку в соседнюю пустую клетку,
// если она есть, конечно
procedure Move(cx,cy: integer);
// cx,cy - клетка, в которой игрок сделал щелчок
var
    r: integer;       // выбор игрока
begin
    // проверим, возможен ли обмен
    if not (( abs(cx-ex) = 1) and (cy-ey = 0) or
            ( abs(cy-ey) = 1) and (cx-ex = 0))
    then exit;
    // Обмен. Переместим фишку из x,y в ex,ey
    Pole[ey,ex] := Pole[cy,cx];
    Pole[cy,cx] := 0;
    ex:=cx;
    ey:=cy;
    // отрисовать поле
    Form1.ShowPole;
    if Finish then
    begin
        r := MessageDlg('Цель достигнута!'+ #13+
        'Еще раз?',mtInformation,[mbYes,mbNo],0);
        if r = mrNo then Form1.Close; // завершить работу программы
    end;
//end;
end;

// щелчок в клетке
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
    cx,cy: integer; // координаты клетки
begin
    // преобразуем координаты мыши в координаты клетки
    cx := Trunc(X / CW) + 1;
    cy := Trunc(Y / CH) + 1;
    Move(cx,cy);
end;

// выводит игровое поле
procedure TForm1.ShowPole;
var
    i,j: integer;
    x,y: integer; // x,y - координаты вывода 
                  //  текста в клетке
begin
    // сетка: вертикальные линии
    for i:= 1 to W - 1 do
    begin
        Canvas.MoveTo(i*CW,0);
        Canvas.LineTo(i*CW,ClientHeight);
    end;
    // сетка: горизонтальные линии
    for i:= 1 to H - 1 do
    begin
        Canvas.MoveTo(0,i*CH);
        Canvas.LineTo(ClientWidth,i*CH);
    end;

    // содержимое клеток
    // x,y - координаты вывода текста
    for i:= 1 to H do
    begin
        y:=(i-1)*CH + 15;
        for j:=1 to W do
        begin
            x:= (j-1)*CW + 15;
            case Pole[i,j] of
            0:      Canvas.TextOut(x,y,'     ');
            1..9:   Canvas.TextOut(x,y,' '+IntToStr(Pole[i,j])+'  ');
            10..15: Canvas.TextOut(x,y,IntToStr(Pole[i,j]));
            end;
        end;
    end;
end;

// "перемешивает" фишки
procedure TForm1.Mixer;
var
    x1,y1: integer; // пустая клетка
    x2,y2: integer; // эту переместить в пустую
    d: integer;     // направление, относительно пустой
    i: integer;
begin
    x1:=4;
    y1:=4;
    randomize;
    for i:= 1 to 150 do
    begin
        repeat
            x2:=x1;
            y2:=y1;
            d:=random(4)+1;
            case d of
                1: dec(x2);
                2: inc(x2);
                3: dec(y2);
                4: inc(y2);
            end;

        until (x2>=1) and (x2<=4) and (y2>=1) and (y2<=4);
        // здесь определили фишку, которую
        // надо переместить в пустую клетку
        Pole[y1,x1] := Pole[y2,x2];
        Pole[y2,x2] := 0;
        x1:=x2;
        y1:=y2;
    end;
    // запомним координаты пустой клетки
    ex:= x1;
    ey:= y1;
end;


// обработка события OnCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
    ClientWidth := CW * W;
    ClientHeight := CH * H;
    Canvas.Font.Name := 'Times New Roman';
    Canvas.Font.Size := 22;
    NewGame;
end;

// обработка события OnPaint
procedure TForm1.FormPaint(Sender: TObject);
begin
    Form1.ShowPole;
end;









end.


Добавлено через 4 минуты и 9 секунд
В итоге при запуске выскакивает ошибка

Project  game15.exe raised exception class  EAccessViolation  with message ‘Access violation at address 00420c78 in module ‘game15.exe’.  Read of address 2BC845E5’.

Автор: VICTAR 23.1.2008, 12:08
Код

pole: array[1..H, 1..W] of byte; //!!!


Код

for i:=0 to H+1 do //обрати внимание
        for j:=0 to W+1 do //на индексы!!!
            pole[i,j] := stp[i,j];

Автор: Lianamir 23.1.2008, 12:15
Сейчас посмотрю,.... smile

Добавлено через 5 минут и 35 секунд
Я не вижу ошибки smile , подскажи плиз, что не так??? smile 

Автор: VICTAR 23.1.2008, 12:28
Код

for i:=1 to H do //обрати внимание
        for j:=1 to W do //на индексы!!!
            pole[i,j] := stp[i,j];

ps может где еще есть ошибки, я не смотрел

Автор: Lianamir 23.1.2008, 12:36
 smile 
Ура!!!  все работает...........спасибки
Так значит это в учебнике ошибка!!?

Автор: VICTAR 23.1.2008, 12:37
Цитата(Lianamir @  23.1.2008,  12:36 Найти цитируемый пост)
Так значит это в учебнике ошибка!!? 

Так часто делают, чтобы тупо не сдирали код  smile 

Автор: Lianamir 23.1.2008, 12:55
И это действительно так...
Екзешник то ихний работает.................(на диске к книжке давался)
А в исходнике при компиляции выдает ту же ошибку......................ХМ!

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