Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.06.29;
Скачать: CL | DM;

Вниз

Ошибка у Canvas а   Найти похожие ветки 

 
Пётр   (2008-03-23 16:12) [0]

Image1.Canvas.Brush.Color:=clBlack;
Почему здесь выдаётся ошибка "access violation..."?! И как её убрать?


 
Efir   (2008-03-23 18:34) [1]

Чё за Image1.
Предположение, возможно не созданный, но объявленный TImage.


 
Пётр   (2008-03-23 18:55) [2]

Image1 создан ещё на этапе проектирования, он точно существует. Ещё один баг: пока я не прописал OnCreate у формы Image1.Canvas.Create;, он и к канвасу обратиться не мог. С brush"ем такой номер не проходит.


 
Пётр   (2008-03-23 19:03) [3]

Причём ошибка эта появляется "по настроению", только при каких-то загадочных обстоятельствах запуска программы


 
@!!ex ©   (2008-03-23 19:38) [4]

У меня
Image1.Canvas.Brush.Color:=clBlack;
нормально отрабатывает.

Ошибка в 17 строке однозначно.


> Ещё один баг: пока я не прописал OnCreate у формы Image1.Canvas.Create;
> , он и к канвасу обратиться не мог. С brush"ем такой номер
> не проходит.

Можно посмотреть на сорцы этого чуда???


 
Пётр   (2008-03-23 20:13) [5]

вот вам весь юнит, цените)

unit prizm;

interface

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

type
 TfrmPrizm = class(TForm)
   Image1: TImage;
   Edit1: TEdit;
   UpDown1: TUpDown;
   Label1: TLabel;
   Button1: TButton;
   Button2: TButton;
   Label2: TLabel;
   Edit2: TEdit;
   UpDown2: TUpDown;
   procedure FormShow(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure FormCreate(Sender: TObject);
   procedure Edit1KeyPress(Sender: TObject; var Key: Char);
 private
   { Private declarations }
 public
   { Public declarations }
   procedure Paint1(Sender: TObject);
 end;

var
 frmPrizm: TfrmPrizm;
 Points: array of TPoint;
 Coord: array of array [0..1] of extended;
 down, adding: boolean;
 cur: integer;
 m: extended;

implementation

uses add, edit, main;

{$R *.dfm}

procedure TfrmPrizm.FormShow(Sender: TObject);
var i: integer;
begin
 if adding
 then
  begin
   Edit1.Text:="3";
   Edit2.Text:="1";
   SetLength(coord, 0);
   SetLength(points, 0);
   SetLength(Points, 3);
   SetLength(Coord, 3);
   m:=1;
   for i:=0 to 3 do
     begin
       Coord[i][0]:=cos(2/3*pi*i);
       Coord[i][1]:=sin(2/3*pi*i);
       Points[i]:=Point(round(320+50*coord[i][0]), round(240-50*coord[i][1]));
     end;
   adding:=false;
  end
 else
   begin
     for i:=0 to length(coord)-1 do
       Points[i]:=Point(round(320+50*coord[i][0]/m), round(240-50*coord[i][1]/m));
     Edit1.Text:=IntToStr(length(coord));
   end;
 Paint1(Sender);
end;

procedure TfrmPrizm.Button1Click(Sender: TObject);
begin
 frmPrizm.Close;
end;

procedure TfrmPrizm.Button2Click(Sender: TObject);
var i: integer;
begin
 m:=StrToFloat(Edit2.Text);
 SetLength(Coord, StrToInt(Edit1.Text));
 SetLength(Points, StrToInt(Edit1.Text));
 for i:=0 to StrToInt(Edit1.Text) do
   begin
     Coord[i][0]:=m*cos(pi*2*i/StrToInt(Edit1.Text));
     Coord[i][1]:=m*sin(pi*2*i/StrToInt(Edit1.Text));
     Points[i]:=Point(round(320+50*coord[i][0]/m), round(240-50*coord[i][1]/m));
   end;
 Paint1(Sender);
end;

procedure TfrmPrizm.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
var i: integer;
begin
 for i:=0 to Length(coord)-1 do
   if (x>round(320+50*coord[i][0]/m-3))
   and(x<round(320+50*coord[i][0]/m+3))
   and(y>round(240-50*coord[i][1]/m-3))
   and(y<round(240-50*coord[i][1]/m+3)) then
     begin
       cur:=i;
       down:=true;
     end;
end;

procedure TfrmPrizm.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if down then
   begin
     coord[cur][0]:=m*(x-320)/50;
     coord[cur][1]:=m*(240-y)/50;
     points[cur]:=point(round(320+50*coord[cur][0]/m), round(240-50*coord[cur][1]/m));
     Paint1(Sender);
   end;
end;

procedure TfrmPrizm.Image1MouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 down:=false;
 Paint1(Sender);
end;

procedure TfrmPrizm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 if length(coord)>0 then frmAdd.Button7.Enabled:=true;
end;

procedure TfrmPrizm.Paint1(Sender: TObject);
var i: integer;
begin
 PatBlt(Image1.Canvas.Handle, 0, 0, Image1.Width, Image1.Height, WHITENESS);
 Image1.Canvas.Brush.Color:=clBlack;
 with Image1.Canvas do
   begin
     Polygon(Points);
     Pen.Color:=clLime;
     MoveTo(320, 0);
     LineTo(320, 480);
     MoveTo(0, 240);
     LineTo(640, 240);
     MoveTo(318, 190);
     LineTo(322, 190);
     MoveTo(370, 238);
     LineTo(370, 242);
     Brush.Color:=clWhite;
     TextOut(323, 190, FloatToStrf(m, fffixed, 10, 1));
     TextOut(370, 243, FloatToStrf(m, fffixed, 10, 1));
     Pen.Color:=clBlack;
     Brush.Color:=clBlack;
     Polygon(points);
     Brush.Color:=clLime;
   end;
 for i:=0 to length(coord)-1 do
   Image1.Canvas.Rectangle(round(320+50*coord[i][0]/m)-3, round(240-50*coord[i][1]/m)-3,
    round(320+50*coord[i][0]/m)+3, round(240-50*coord[i][1]/m)+3);
 Image1.Canvas.Brush.Color:=clWhite;
end;

procedure TfrmPrizm.FormCreate(Sender: TObject);
begin
 adding:=false;
 m:=1;
 Image1.Canvas.Create;
end;

procedure TfrmPrizm.Edit1KeyPress(Sender: TObject; var Key: Char);
var
 s: string; edit: TEdit;
begin
 edit:=Sender as TEdit;
 case Key of
 "0".."9":;
 #8: if length(edit.Text)<2 then Key:=#0;
 ",":
   begin
     s:=edit.Text;
     if (pos (",", s)<>0)or(edit.SelStart=0)or(edit=Edit1) then Key:=#0;
   end;
  else Key:=#0;
  end;
end;

end.


 
Сергей М. ©   (2008-03-23 20:37) [6]

Т.е. ты "запустил" свою программулину и тут же получил исключение, не успев даже глазом моргнуть ?


 
antonn ©   (2008-03-24 00:43) [7]


> Image1.Canvas.Create;

:)


 
@!!ex ©   (2008-03-24 08:30) [8]

> [7] antonn ©   (24.03.08 00:43)

Да, да. Поэтому и попросил автора выложить сорсы... примерно такого и ожидал. :))

Автор, вы в курсе, как работают конструкторы в Delphi?


 
Пётр   (2008-03-24 16:33) [9]

я в курсе, что так насмешившая вас строка обычно не нужна, но в этой программе постоянно шла ошибка, пока я её не прописал. А форма эта вспомогательная, и ошибка выходит при её открытии


 
@!!ex ©   (2008-03-24 16:42) [10]

> я в курсе, что так насмешившая вас строка обычно не нужна,

Она не обычно не нужна.
Это в корне не правильная строка.


 
Пётр   (2008-03-24 19:32) [11]

но она помогла)
да вобщем-то проект я уже сдал, и эта ошибка в этот раз не появилась и не помешала занять 1 место в лицее)
надеюсь, в будущем такие чудеса происходить не будут, ответ на топик больше не нужен.


 
@!!ex ©   (2008-03-24 19:45) [12]

> но она помогла)

У меня есть машина без руля, я прикрутил руль, но он отвалился и заклинил положение колес, но по случайности заклинило в идеально ровном положении, а т.к. ездить надо на другой конец улицы по ровной дороги - это помогло.


 
{RASkov} ©   (2008-03-24 22:22) [13]

> [11] Пётр   (24.03.08 19:32)
> но она помогла)
> да вобщем-то проект я уже сдал, и эта ошибка в этот раз
> не появилась и не помешала занять 1 место в лицее)

Диагноз - тебе не следует заниматься написанием программ :(
Да и в жизни у тебя тоже наверное: а, лишь бы работало.... или: работает, ну и ладно...
И еще скажу... Мне бы ты проект не сдал! Причем, провалился бы еще до заглядывания мной в исходники проекта....
Не веришь? Да у тебя в программе при ее работе вылетает куча ошибок.... Опять не веришь? Зря не веришь....
:о)


 
Пётр   (2008-03-25 13:49) [14]

ну не надо так радикально! Я не говорю, что это было написано правильно, но я просто не смог придумать выхода лучше. Ошибки есть, но я их исправляю, и обычно правильно. И вообще этому меня никто не учил, а метод научного тыка не всегда срабатывает как надо.
А в исходники они и не заглядывали, они всё равно OpenGL не поняли бы)


 
Пётр   (2008-03-25 14:03) [15]

Итак, неправильность этой строки вы мне доказали, её ненужность я понял (теперь работает без неё), и с Brush"ем проблем вроде нет. Заметьте: в коде я ничего не поменял (только после того, как начало нормально работать, я удалил Image1.Canvas.Create).


 
antonn ©   (2008-03-25 21:19) [16]

вообще не понимаю, как можно нормально работать с image.canvas %)
ладно бы с image1.picture.bitmat.canvas...
а ошибка, в принципе, могла выскакивать если в имадж загрузить JPEG и попробывать пнуть image.canvas :)


 
autohex   (2008-05-29 20:51) [17]

clLime, clBlack - 1 byte,  rgb(r,g,b)   r,g,b:byte;  -  3 byte
1 byte <=> 3 byte


 
antonn ©   (2008-05-29 21:38) [18]


> autohex   (29.05.08 20:51) [17]

че за бредятина?
cllime - это 255 по зелени и 0 по остальным трем каналам, cllime может влезть только в word.


 
antonn ©   (2008-05-29 22:27) [19]

"он и она скакали втроем на лошади" %)
ладно, допустим я имел ввиду 32 бита на цвет, и в альфе тожа 0 :)


 
Плохиш ©   (2008-05-30 14:20) [20]


> antonn ©   (25.03.08 21:19) [16]
> вообще не понимаю, как можно нормально работать с image.canvas

Ну так как в справке написано.

> Пётр   (25.03.08 14:03) [15]
> Итак, неправильность этой строки вы мне доказали, её ненужность
> я понял (теперь работает без неё), и с Brush"ем проблем
> вроде нет. Заметьте: в коде я ничего не поменял (только
> после того, как начало нормально работать, я удалил Image1.
> Canvas.Create).

Ты справку вообще пробовал читать? В частности предупреждения в ней.
<CODE
Note:
Canvas is only available if the Picture property represents a TBitmap object. Trying to read Canvas when Picture represents another type of graphic image causes TImage to raise an EInvalidOperation exception.
>



Страницы: 1 вся ветка

Текущий архив: 2008.06.29;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.024 c
15-1210936135
Kolan
2008-05-16 15:08
2008.06.29
SQLite не может получить доступ на Висте, почему?


3-1201003179
pavel_guzhanov
2008-01-22 14:59
2008.06.29
соединение с базой Oracle


4-1192474636
alek
2007-10-15 22:57
2008.06.29
Рисование в, к примеру, Paint


3-1200909327
MZ
2008-01-21 12:55
2008.06.29
запрос


15-1210800305
Антенна
2008-05-15 01:25
2008.06.29
Коды