Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];
ВнизОшибка при определении процедуры Найти похожие ветки
← →
Александр325 © (2008-10-02 00:04) [0]Здравствуйте, господа мастера.
Проблема в следующем. Есть установка, которая измеряет параметры диодов и сохраняет их в файл. Люди, которые делали установку, не смогли написать программу обработки этих данных. Своих спецов по программированию у нас нет, поэтому пришлось ковыряться самому. Поначалу проблем не возникло. Но по мере разрастания программы возникла мысль, что часть программы, отвечающую за прорисовку графиков на экране, можно и нужно выделить в отдельную процедуру. И тут начались проблемы: "Access violatin at adress ...". При остановке программы указатель стоит на строке "with Image1.Canvas do". Здесь на сайте нашел, что подобная ошибка возникает при обращении к несуществующему объекту. Но когда все лилось одним потоком ошибок не было! Понятно, что я где-то что-то упустил, но где? Буду признаелен за любую помощь.
Спасибо.
← →
turbouser © (2008-10-02 01:11) [1]
>
> Александр325 ©
Без примеров конкретного кода невозможно что-либо сказать.
← →
Германн © (2008-10-02 01:49) [2]
> И тут начались проблемы: "Access violatin at adress ...".
> При остановке программы указатель стоит на строке "with
> Image1.Canvas do". Здесь на сайте нашел, что подобная ошибка
> возникает при обращении к несуществующему объекту.
И ещё в массе случаев. AV выдаётся при попытке обратиться к области памяти, которая в данный момент не принадлежит данному процессу.
А далее см. turbouser © (02.10.08 01:11) [1]
← →
{RASkov} © (2008-10-02 09:18) [3]> [0] Александр325 © (02.10.08 00:04)
> При остановке программы указатель стоит на строке "with Image1.Canvas do".
Вообще строка безобидная если переменная Image1 проинициализирована....
← →
Jeer © (2008-10-02 09:53) [4]
> Александр325 © (02.10.08 00:04)
Правильнее и эффективнее - найти программиста.
Может быть даже здесь.
← →
Александр325 © (2008-10-02 19:48) [5]Здравствуйте еще раз.
Вот упрощенный вариант, который работает:
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.
← →
Palladin © (2008-10-02 20:01) [6]вот скажи мне, откуда твоя процедура может знать что такое image1 ?
в ясли, короче, изучать области видимости переменных...
← →
Palladin © (2008-10-02 20:02) [7]ой, а она у тебя в глобальном var описана... даже и не заметил...
тогда другой интересный вопрос, а с чего ты взял что image1 описанный в глобальной секции тоже самое, что image1, описанный как поле созданного объекта TForm1 ?
хотя про области видимости читать тоже нужно
← →
{RASkov} © (2008-10-02 20:41) [8]> ой, а она у тебя в глобальном var описана... даже и не заметил...
:)
ЗЫ Эта улыбка автору вопроса, а не автору цитаты))
← →
{RASkov} © (2008-10-02 20:49) [9]> [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 немного подправить, думаю справишься.....
← →
Александр325 © (2008-10-02 21:10) [10]Железно!!!
Заработало. Кто бы мог подумать.
Всем спасибо.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.11.16;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c