-
Festil (05.02.10 23:51) [0]Работаю с jpeg изображением. Задача - открыть файл. Вывести на экран. Далее настроить обработчик событий при движении мыши на битмапе рисовались вертикальные линии, а именно, при нажатии кнопки и при перемещении рисовались линии, а при отпускании завершалось все. (как рисование окружности в paint).
При первом обращении к mousemove все нормально работает, а уже при следующем - выскакивает ошибка Access Violation
Может я криво обращаюсь с изображением, возможно, раз косяк получается.
procedure TView1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
p:Tpoint;
xNew,yNew:integer;
k:Tbitmap;
RX:integer;
kk:integer;
begin
xNew:=X-View1.Left;
yNew:=Y-View1.Top;
CorX.Caption:=inttostr(xNew);
CorY.Caption:=inttostr(yNew);
if Flag then begin
Image1.Picture.Bitmap.Canvas.Refresh;
RX:=X-View1.Left-X0;
Image1.Picture.Bitmap.Canvas.Pen.Color:=clRed;
for kk:=0 to Image1.Picture.Height-1 do
begin
Image1.Picture.Bitmap.Canvas.Pixels[X-View1.Left,kk]:=clRed;
Image1.Picture.Bitmap.Canvas.Pixels[X-View1.Left-2*RX,kk]:=clRed;
end;
//Image1.Picture.Bitmap.Canvas.MoveTo(X-View1.Left-2*RX,0);
//Image1.Picture.Bitmap.Canvas.LineTo(X-View1.Left-2*RX,Image1.Picture.Height);
//Image1.Picture.Bitmap.Canvas.MoveTo(X-View1.Left,0);
//Image1.Picture.Bitmap.Canvas.LineTo(X-View1.Left,Image1.Picture.Height);
// Image1.Picture.Bitmap.Canvas.MoveTo(X-View1.Left,Y-View1.Top);
inc(FGH); Label1.Caption:=Inttostr(FGH);
Image1.Picture.Bitmap.Free;
Image1.Picture.Bitmap:=mm;
end;
end;
procedure TView1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var k:Tbitmap;
begin
x0:=X;
Flag:=true;
// ShowMessage(inttostr(Y));
end;
procedure TView1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Flag:=false;
end; -
Сергей М. © (06.02.10 16:40) [1]
> Image1.Picture.Bitmap.Free;
> Image1.Picture.Bitmap:=mm;
Вот эти телодвижения прокомментируй подробно .. -
Festil (06.02.10 16:50) [2]Это я пытался заменить битмап на ранее сохраненный(в процедуре загрузки jpeg через opendialog)
mm:Tbitmap;
а в процедуре открытия
mm:=Image1.Picture.Bitmap;
ps
после нескольких попыток пришел к решению, так как битмап затирается ненужными линиями, то в процедуре mousemove прописать процедуру реопена файлаvar jpeg:Tjpegimage;
bmp:Tbitmap;
begin
jpeg:=Tjpegimage.Create;
bmp:=TBitmap.Create;
jpeg.LoadFromFile(im1);
bmp.assign(jpeg);
View1.Image1.Picture.Bitmap:=bmp;
with View1.Image1.Picture.Bitmap.Canvas do
begin
Pen.Color:=clblue;
MoveTo(0,v1);
LineTo(View1.Image1.Width,v1);
MoveTo(0,v2);
LineTo(View1.Image1.Width,v2);
Pen.Color:=clred;
MoveTo(XX1,0);
LineTo(XX1,View1.Image1.Picture.Height);
MoveTo(XX2,0);
LineTo(XX2,View1.Image1.Picture.Height);
Pen.Color:=clyellow;
MoveTo(YY1,0);
LineTo(YY1,View1.Image1.Picture.Height);
MoveTo(YY2,0);
LineTo(YY2,View1.Image1.Picture.Height);
end;
jpeg.Free;
bmp.Free;
end; -
Сергей М. © (06.02.10 17:47) [3]Ну-ну
-
mr.il (10.02.10 06:38) [4]Почитай предыдущую тему, а потом про рисование на канвасе (в этой ветке или в "играх").
-
mr.il (10.02.10 06:39) [5]Забыл что после ответа тема уходит вверх. Вот тут почитай для начала
http://pda.delphimaster.net/?id=1209049023&n=7 -
Festil (11.02.10 19:04) [6]mr.il, спасибо.