![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка при определении процедуры [D6, 95/98]
Александр325 © (2008-10-02 00:04:00)Здравствуйте, господа мастера.
Проблема в следующем. Есть установка, которая измеряет параметры диодов и сохраняет их в файл. Люди, которые делали установку, не смогли написать программу обработки этих данных. Своих спецов по программированию у нас нет, поэтому пришлось ковыряться самому. Поначалу проблем не возникло. Но по мере разрастания программы возникла мысль, что часть программы, отвечающую за прорисовку графиков на экране, можно и нужно выделить в отдельную процедуру. И тут начались проблемы: "Access violatin at adress ...". При остановке программы указатель стоит на строке "with Image1.Canvas do". Здесь на сайте нашел, что подобная ошибка возникает при обращении к несуществующему объекту. Но когда все лилось одним потоком ошибок не было! Понятно, что я где-то что-то упустил, но где? Буду признаелен за любую помощь.
Спасибо.
Александр325 (2008-10-02 21:10:00) [1]Железно!!!
Заработало. Кто бы мог подумать.
Всем спасибо.
{RASkov} (2008-10-02 20:49:00) [2]> [5] Александр325 © (02.10.08 19:48)
> procedure grafik(x0,y0,dx,dy:integer);
А вот такой вариант попробуй
//твоя процедура:
procedure grafik(Img: TImage; x0,y0,dx,dy:integer);
.........
procedure TForm1.Button1Click(Sender: TObject);
begin
.....
grafik(image1, x0,y0,dx,dy);
end;
где image1 - это компонент "брошенный на форму"(т.е. из первой твоей "части")
реализацию grafik немного подправить, думаю справишься.....
{RASkov} (2008-10-02 20:41:00) [3]> ой, а она у тебя в глобальном var описана... даже и не заметил...
:)
ЗЫ Эта улыбка автору вопроса, а не автору цитаты))
Palladin (2008-10-02 20:02:00) [4]ой, а она у тебя в глобальном var описана... даже и не заметил...
тогда другой интересный вопрос, а с чего ты взял что image1 описанный в глобальной секции тоже самое, что image1, описанный как поле созданного объекта TForm1 ?
хотя про области видимости читать тоже нужно
Palladin (2008-10-02 20:01:00) [5]вот скажи мне, откуда твоя процедура может знать что такое image1 ?
в ясли, короче, изучать области видимости переменных...
Александр325 (2008-10-02 19:48:00) [6]Здравствуйте еще раз.
Вот упрощенный вариант, который работает:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
x0,y0,dx,dy,i:integer;
image1:timage;
procedure TForm1.Button1Click(Sender: TObject);
begin
//рисуем сетку
x0:=0;
y0:=32;
dx:=40;
dy:=30;
with image1.Canvas do //рисуем оси координат
begin
image1.picture.Bitmap.Height:=10*dy+100;
image1.Picture.Bitmap.Width:=10*dx+80;
x0:=x0+50;//картинку смещаем на середину области рисования
moveto(x0,y0);
pen.Color:=$00000000;
pen.Width:=3;
lineto(x0+10*dx,y0);
lineto(x0+10*dx,y0+10*dy);
lineto(x0,y0+10*dy);
lineto(x0,y0);
pen.style:=psdot;
pen.Width:=1;//рисуем вспомогательную сетку
for i:=1 to 9 do
begin
moveto(x0+i*dx,y0);
lineto(x0+i*dx,y0+10*dy);
end;
for i:=1 to 9 do
begin
moveto(x0,y0+i*dy);
lineto(x0+10*dx,y0+i*dy);
end;
end;
end;
end.
А вот вариант, который не работает:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
x0,y0,dx,dy,i:integer;
image1:timage;
procedure grafik(x0,y0,dx,dy:integer);
begin
with image1.Canvas do //рисуем оси координат
begin
image1.picture.Bitmap.Height:=10*dy+100;
image1.Picture.Bitmap.Width:=10*dx+80;
x0:=x0+50;//картинку смещаем на середину области рисования
moveto(x0,y0);
pen.Color:=$00000000;
pen.Width:=3;
lineto(x0+10*dx,y0);
lineto(x0+10*dx,y0+10*dy);
lineto(x0,y0+10*dy);
lineto(x0,y0);
pen.style:=psdot;
pen.Width:=1;//рисуем вспомогательную сетку
for i:=1 to 9 do
begin
moveto(x0+i*dx,y0);
lineto(x0+i*dx,y0+10*dy);
end;
for i:=1 to 9 do
begin
moveto(x0,y0+i*dy);
lineto(x0+10*dx,y0+i*dy);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
//рисуем сетку
x0:=0;
y0:=32;
dx:=40;
dy:=30;
grafik(x0,y0,dx,dy);
end;
end.
Jeer (2008-10-02 09:53:00) [7]
> Александр325 © (02.10.08 00:04)
Правильнее и эффективнее - найти программиста.
Может быть даже здесь.
{RASkov} (2008-10-02 09:18:00) [8]> [0] Александр325 © (02.10.08 00:04)
> При остановке программы указатель стоит на строке "with Image1.Canvas do".
Вообще строка безобидная если переменная Image1 проинициализирована....
Германн (2008-10-02 01:49:00) [9]
> И тут начались проблемы: "Access violatin at adress ...".
> При остановке программы указатель стоит на строке "with
> Image1.Canvas do". Здесь на сайте нашел, что подобная ошибка
> возникает при обращении к несуществующему объекту.
И ещё в массе случаев. AV выдаётся при попытке обратиться к области памяти, которая в данный момент не принадлежит данному процессу.
А далее см. turbouser © (02.10.08 01:11) [1]
turbouser (2008-10-02 01:11:00) [10]
>
> Александр325 ©
Без примеров конкретного кода невозможно что-либо сказать.