Форум: "Начинающим";
Текущий архив: 2008.06.29;
Скачать: [xml.tar.bz2];
ВнизОшибка у 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.046 c