Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1223103815
Smel
2008-10-04 11:03
2008.11.16
beginthread


2-1223495398
АгатаКристи
2008-10-08 23:49
2008.11.16
IP, Основной Шлюз, DNS


2-1223410802
tubik
2008-10-08 00:20
2008.11.16
Точка входа в программу


15-1221713615
avr
2008-09-18 08:53
2008.11.16
Бортовой компьютер на микроконтроллере.


2-1223374553
AlekseyB
2008-10-07 14:15
2008.11.16
Как посчитать сумму





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский