![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка у Canvas'а [D7, WinXP]
Пётр © (2008-03-23 16:12:00)
Image1.Canvas.Brush.Color:=clBlack;
Почему здесь выдаётся ошибка "access violation..."?! И как её убрать?
Плохиш (2008-05-30 14:20:00) [1]
> 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.
>
antonn (2008-05-29 22:27:00) [2]"он и она скакали втроем на лошади" %)
ладно, допустим я имел ввиду 32 бита на цвет, и в альфе тожа 0 :)
antonn (2008-05-29 21:38:00) [3]
> autohex (29.05.08 20:51) [17]
че за бредятина?
cllime - это 255 по зелени и 0 по остальным трем каналам, cllime может влезть только в word.
autohex (2008-05-29 20:51:00) [4]clLime, clBlack - 1 byte, rgb(r,g,b) r,g,b:byte; - 3 byte
1 byte <=> 3 byte
antonn (2008-03-25 21:19:00) [5]вообще не понимаю, как можно нормально работать с image.canvas %)
ладно бы с image1.picture.bitmat.canvas...
а ошибка, в принципе, могла выскакивать если в имадж загрузить JPEG и попробывать пнуть image.canvas :)
Пётр (2008-03-25 14:03:00) [6]Итак, неправильность этой строки вы мне доказали, её ненужность я понял (теперь работает без неё), и с Brush'ем проблем вроде нет. Заметьте: в коде я ничего не поменял (только после того, как начало нормально работать, я удалил Image1.Canvas.Create).
Пётр (2008-03-25 13:49:00) [7]ну не надо так радикально! Я не говорю, что это было написано правильно, но я просто не смог придумать выхода лучше. Ошибки есть, но я их исправляю, и обычно правильно. И вообще этому меня никто не учил, а метод научного тыка не всегда срабатывает как надо.
А в исходники они и не заглядывали, они всё равно OpenGL не поняли бы)
{RASkov} (2008-03-24 22:22:00) [8]> [11] Пётр (24.03.08 19:32)
> но она помогла)
> да вобщем-то проект я уже сдал, и эта ошибка в этот раз
> не появилась и не помешала занять 1 место в лицее)
Диагноз - тебе не следует заниматься написанием программ :(
Да и в жизни у тебя тоже наверное: а, лишь бы работало.... или: работает, ну и ладно...
И еще скажу... Мне бы ты проект не сдал! Причем, провалился бы еще до заглядывания мной в исходники проекта....
Не веришь? Да у тебя в программе при ее работе вылетает куча ошибок.... Опять не веришь? Зря не веришь....
:о)
@!!ex (2008-03-24 19:45:00) [9]> но она помогла)
У меня есть машина без руля, я прикрутил руль, но он отвалился и заклинил положение колес, но по случайности заклинило в идеально ровном положении, а т.к. ездить надо на другой конец улицы по ровной дороги - это помогло.
Пётр (2008-03-24 19:32:00) [10]но она помогла)
да вобщем-то проект я уже сдал, и эта ошибка в этот раз не появилась и не помешала занять 1 место в лицее)
надеюсь, в будущем такие чудеса происходить не будут, ответ на топик больше не нужен.
@!!ex (2008-03-24 16:42:00) [11]> я в курсе, что так насмешившая вас строка обычно не нужна,
Она не обычно не нужна.
Это в корне не правильная строка.
Пётр (2008-03-24 16:33:00) [12]я в курсе, что так насмешившая вас строка обычно не нужна, но в этой программе постоянно шла ошибка, пока я её не прописал. А форма эта вспомогательная, и ошибка выходит при её открытии
@!!ex (2008-03-24 08:30:00) [13]> [7] antonn © (24.03.08 00:43)
Да, да. Поэтому и попросил автора выложить сорсы... примерно такого и ожидал. :))
Автор, вы в курсе, как работают конструкторы в Delphi?
antonn (2008-03-24 00:43:00) [14]
> Image1.Canvas.Create;
:)
Сергей М. (2008-03-23 20:37:00) [15]Т.е. ты "запустил" свою программулину и тут же получил исключение, не успев даже глазом моргнуть ?
Пётр (2008-03-23 20:13:00) [16]вот вам весь юнит, цените)
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.
@!!ex (2008-03-23 19:38:00) [17]У меня
Image1.Canvas.Brush.Color:=clBlack;
нормально отрабатывает.
Ошибка в 17 строке однозначно.
> Ещё один баг: пока я не прописал OnCreate у формы Image1.Canvas.Create;
> , он и к канвасу обратиться не мог. С brush'ем такой номер
> не проходит.
Можно посмотреть на сорцы этого чуда???
Пётр (2008-03-23 19:03:00) [18]Причём ошибка эта появляется "по настроению", только при каких-то загадочных обстоятельствах запуска программы
Пётр (2008-03-23 18:55:00) [19]Image1 создан ещё на этапе проектирования, он точно существует. Ещё один баг: пока я не прописал OnCreate у формы Image1.Canvas.Create;, он и к канвасу обратиться не мог. С brush'ем такой номер не проходит.
Efir (2008-03-23 18:34:00) [20]Чё за Image1.
Предположение, возможно не созданный, но объявленный TImage.