社区
Delphi
帖子详情
关于Canvas:=TCanvas.Create();的错误~
militant
2003-12-15 08:34:17
我想用Canvas画图,可是当我Canvas:=TCanvas.Create();创建Canvas对象的时候,出现错误如下:Cannot assign to a read-only property.
我其他对象创建都没有出现这种错误,奇怪。
...全文
175
10
打赏
收藏
关于Canvas:=TCanvas.Create();的错误~
我想用Canvas画图,可是当我Canvas:=TCanvas.Create();创建Canvas对象的时候,出现错误如下:Cannot assign to a read-only property. 我其他对象创建都没有出现这种错误,奇怪。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mingjianzeng2003
2003-12-15
打赏
举报
回复
Canvas:=Tcanvas.Create;没有问题啊,怎么会报错吗?我试了怎么不会呢?
lxhong1980
2003-12-15
打赏
举报
回复
procedure TForm1.Button1Click(Sender: TObject);
var
Canvas:TCanvas;
begin
Canvas:=TCanvas.Create();
Canvas.Brush.Color:=clWhite;
end;
没有错误啊
Sumie@Sam
2003-12-15
打赏
举报
回复
在窗体中使用属性,如果没有指定对象,则默认作为当前窗体的属性,你把定义的变量名换一个吧。
shgye121212
2003-12-15
打赏
举报
回复
不是吧!!??
militant
2003-12-15
打赏
举报
回复
不是了吧?
刚开始我定义Canvas:TCanvas啊
Canvas我还没有定义的对象啊,怎么可以直接用呢?
直接用我也用过了, Canvas.Brush.Color:=clWhite;这里就出错了
产生EAccessViolation错误。
gencan
2003-12-15
打赏
举报
回复
你要用Canvas用就是了,为什么给它赋值呢?
asj
2003-12-15
打赏
举报
回复
呵呵,你要用Canvas用就是了,为什么给它赋值呢?
人家不是告诉你了Canvas是一个Read-only的属性,给它赋值当然要出错了
在窗口中写Canvas就等于Form1.Canvas,而这个对象是在窗口创建时就已经创建的,由窗口来管理。当然不能让你随便就给它从新分配内存了。直接使用它就行了
tonylk
2003-12-15
打赏
举报
回复
Canvas:=TCanvas.Create();
左边这个canvas是你自己声明的变量,还是什么控件里自带的属性,后者的话当然不可以进行赋值,而且也不需要赋值,直接用就可以了。。
shgye121212
2003-12-15
打赏
举报
回复
关注:
militant
2003-12-15
打赏
举报
回复
我觉得可能是因为Canvas创建的问题了。
我是在FormShow事件中创建Canvas是就产生上述错误了。
系统截屏源码
//创建一个BITMAP来存放图象 Fullscreen.Width:=screen.width; Fullscreen.Height:=screen.Height; DC:=GetDC(0); //取得屏幕的DC,参数0指的是屏幕 Fullscreen
Canvas
:=T
Canvas
.
Create
; //创建一个
CANVAS
对象 Fullscreen
Canvas
.Handle:=DC; Fullscreen.
Canvas
.CopyRect(Rect(0,0,screen.Width,screen.Height), fullscreen
Canvas
,Rect(0,0,Screen.Width,Screen.Height)); //把整个屏幕复制到BITMAP中 Fullscreen
Canvas
.Free;
Delphi 全屏抓图 范例.rar
Delphi 全屏抓图范例源码,除了全屏截图外还演示了区域抓图的实现,最后将抓图保存了图片,可把本源码作为Delphi图像工具软件的一个模块来借鉴。 Fullscreen:=TBitmap.
Create
;//创建一个BITMAP来存放图象 Fullscreen.Width:=screen.width; Fullscreen.Height:=screen.Height; DC:=GetDC(0);//取得屏幕的DC,参数0指的是屏幕 Fullscreen
Canvas
:=T
Canvas
.
Create
;//创建一个
CANVAS
对象 Fullscreen
Canvas
.Handle:=DC; Fullscreen.
Canvas
.CopyRect (Rect(0,0,screen.Width,screen.Height),fullscreen
Canvas
, Rect(0,0,Screen.Width,Screen.Height)); // 把整个屏幕复制到BITMAP中 Fullscreen
Canvas
.Free;//释放
CANVAS
对象 ReleaseDC(0,DC);//释放DC image1.picture.Bitmap:=fullscreen;//拷贝下的图象赋给IMAGE对象 image1.Width:=fullscreen.Width; image1.Height:=fullscreen.Height; fullscreen.free;//释放bitmap form1.show;//显示窗口 messagebeep(1);//BEEP叫一声,报告图象已经截取好了。
Delphi 屏 幕 拷 贝 程 序
Borland 公 司 的 天 才 设 计 师 们 用 画 布(T
canvas
) 对 象 封 装 了Windows 的 大 部 分 图 形 输 出 功 能, 这 使 得 我 们 可 以 通 过 他 以 更 直 观 的 方 式 和Windows 的 屏 幕 打 交 道, 而 不 必 关 心 令 人 头 疼 的Windows API 函 数。 下 面 的 一 小 段 程 序 就 可 以 实 现 整 个 屏 幕 的 图 象 拷 贝 了。 var //变量声明 Fullscreen:Tbitmap; Fullscreen
Canvas
:T
Canvas
; dc:HDC; //------------------------------------------------------------ DC := GetDC (0); //取得屏幕的 DC,参数0指的是屏幕 Fullscreen
Canvas
:= T
Canvas
.
Create
; //创建一个
CANVAS
对象 Fullscreen
Canvas
.Handle := DC; //将屏幕的DC赋给HANDLE Fullscreen.
Canvas
.CopyRect (Rect (0, 0, screen.Width,screen.Height), fullscreen
Canvas
, Rect (0, 0, Screen.Width, Screen.Height)); //把整个屏幕复制到BITMAP中 Fullscreen
Canvas
.Free; //释放
CANVAS
对象 ReleaseDC (0, DC); //释放DC //SCREEN对象是DELPHI预先定义的屏幕对象,直接使用就行了。 ---- 看 了 以 上 代 码, 你 就 会 发 现 用DELPHI 写 屏 幕 拷 贝 程 序 的 确 很 简 单。 ---- 当 然 要 写 一 个 实 用 的 屏 幕 拷 贝 程 序, 光 靠 上 述 代 码 是 不 够 的, 下 面 讲 一 下 主 要 的 编 程 思 路: ---- 1. 全 屏 幕 拷 贝 的 实 现 ---- 首 先 隐 藏 拷 屏 程 序, 延 长 一 定 时 间 后, 利 用 上 述 的 程 序 即 可 实 现 屏 幕 的 拷 贝。 ---- 2. 区 域 拷 贝 的 实 现 ---- 要 实 现 区 域 拷 贝 要 用 个 小 技 巧, 首 先 调 用 全 屏 幕 拷 贝 程 序 把 整 个 屏 幕 拷 贝 下 来, 然 后 把 拷 贝 下 来 的 图 象 显 示 在 屏 幕 上, 之 后 就 可 以 让 用 户 在 上 面 选 择 需 要 的 区 域, 最 后 才 将 用 户 选 定 的 区 域 复 制 下 来。 ---- 编 程 实 现: ---- 1. 首 先 用DELPHI3 开 一 个 工 程。 ---- 2. 在FORM 上 放 置 一 个TPANEL 元 件, 设 置ALIGN=ALTOP, 再 选 部 件 条ADDITIONAL 上 的TSCROLLBOX, 放 到FORM 上, 设 置ALIGN=ALCLIENT, 然 后 在SCROLLBOX 上 放 置 一 个 TIMAGE 对 象。 ---- 3. 在PANEL 上 放 置4 个 按 钮, 分 别 为FULL SCREEN,REGIN,SAVE,EXIT。 ---- 4. 容 易 干 的 先 干, 在EXIT 按 钮 的CLICK 事 件 里 写 下 代 码 procedure TForm1.ExitClick(Sender: TObject); begin close; end; ---- 5. 接 着 是 实 现 全 屏 幕 拷 贝 了, 在FROM 上 放 置 一 个 记 时 器TTIMER,ENABLED 设 为 FALSE,INTERVAL 设 为500, 也 就 是 半 秒 钟 激 活 一 次。 双 击TIMER 部 件, 写 上 如 下 的 代 码。 procedure TForm1.Timer1Timer(Sender: TObject); var Fullscreen:Tbitmap; Fullscreen
Canvas
:T
Canvas
; dc:HDC; begin timer1.Enabled:=false; //取消时钟 Fullscreen := TBitmap.
Create
; //创建一个BITMAP来存放图象 Fullscreen.Width := screen.width; Fullscreen.Height := screen.Height; DC := GetDC (0); //取得屏幕的 DC,参数0指的是屏幕 Fullscreen
Canvas
:= T
Canvas
.
Create
; //创建一个
CANVAS
对象 Fullscreen
Canvas
.Handle := DC; Fullscreen.
Canvas
.CopyRect (Rect (0, 0, screen.Width, screen.Height), fullscreen
Canvas
, Rect (0, 0, Screen.Width, Screen.Height)); //把整个屏幕复制到BITMAP中 Fullscreen
Canvas
.Free; //释放
CANVAS
对象 ReleaseDC (0, DC); //释放DC //******************************* image1.picture.Bitmap:=fullscreen;//拷贝下的图象赋给IMAGE对象 image1.Width:=fullscreen.Width; image1.Height:=fullscreen.Height; fullscreen.free; //释放bitmap form1.WindowState:=wsNormal; //复原窗口状态 form1.show; //显示窗口 messagebeep(1); //BEEP叫一声,报告图象已经截取好了。 end; ---- 6. 接 下 去FULLSCREEN 按 钮 上 的 代 码 就 很 简 单 了。 procedure TForm1.FullscreenClick(Sender: TObject); begin form1.WindowState:=wsMinimized; //最小化程序窗口 form1.hide; //把程序藏起来 timer1.enabled:=true; //打开记时器 end; ---- 7. 拷 贝 到 了 图 象 当 然 要 存 起 来 了,SAVE 按 钮 就 有 了 用 武 之 地, 我 们 写 下 如 下 代 码。 procedure TForm1.Save1Click(Sender: TObject); begin if savedialog1.Execute then begin form1.Image1.Picture.SaveToFile(savedialog1.filename) end; end; ---- 8. 下 面 是 区 域 拷 贝 的 实 现。 再New 一 个FORM,BorderStype 设 为 bsNone, 这 样 能 够 显 示 为 全 屏 幕, 上 面 放 置 一 个TIMAGE 部 件,ALIGN 设 为ALCLIENT, 另 外 放 置 一 个TTIMER 部 件,TIMER 部 件 的 程 序 跟 上 面 的 很 象, 因 为 它 首 先 要 实 现 的 是 全 屏 幕 的 拷 贝。 procedure TForm2.Timer1Timer(Sender: TObject); var Fullscreen:Tbitmap; Fullscreen
Canvas
:T
Canvas
; dc:HDC; begin timer1.Enabled:=false; Fullscreen := TBitmap.
Create
; Fullscreen.Width := screen.width; Fullscreen.Height := screen.Height; DC := GetDC (0); Fullscreen
Canvas
:= T
Canvas
.
Create
; Fullscreen
Canvas
.Handle := DC; Fullscreen.
Canvas
.CopyRect (Rect (0, 0, screen.Width, screen.Height), fullscreen
Canvas
, Rect (0, 0, Screen.Width, Screen.Height)); Fullscreen
Canvas
.Free; ReleaseDC (0, DC); image1.picture.Bitmap:=fullscreen; image1.Width:=fullscreen.Width; image1.Height:=fullscreen.Height; fullscreen.free; form2.WindowState:=wsMaximized; form2.show; messagebeep(1); foldx:=-1; foldy:=-1; image1.
Canvas
.Pen.mode:=pmnot; //笔的模式为取反 image1.
canvas
.pen.color:=clblack; //笔为黑色 image1.
canvas
.brush.Style:=bsclear; //空白刷子 flag:=true; end; ---- 9.TIMAGE 部 件 上 有 两 个 事 件 的 程 序 需 要 编 写, 一 个 是ONMOUSEDOWN, 另 一 个 是ONMOUSEMOVE。 ---- 10. 可 以 回 头 看 看 区 域 拷 贝 的 思 路, 此 时 需 要 作 区 域 拷 贝 的 屏 幕 我 们 已 经 得 到, 也 显 示 在 屏 幕 上 了, 按 下 鼠 标 左 键 是 区 域 的 原 点, 此 后 移 动 鼠 标, 将 有 一 个 矩 形 在 原 点 和 鼠 标 之 间, 它 会 随 着 鼠 标 的 移 动 而 变 化, 再 次 按 下 鼠 标 的 左 键, 此 时 矩 形 所 包 含 的 区 域 就 是 我 们 要 得 到 的 图 象 了。 ---- 11. 所 以MOUSEDOWN 有 两 次 响 应 的 处 理, 见 以 下 程 序。 procedure TForm2.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var width,height:integer; newbitmap:Tbitmap; begin if (trace=false) then // TRACE表示是否在追踪鼠标 begin //首次点击鼠标左键,开始追踪鼠标。 flag:=false; with image1.
canvas
do begin moveTo(foldx,0); LineTo(foldx,screen.height); moveto(0,foldy); lineto(screen.width,foldy); end; x1:=x; y1:=y; oldx:=x; oldy:=y; trace:=true; image1.
Canvas
.Pen.mode:=pmnot; //笔的模式为取反 //这样再在原处画一遍矩形,相当于擦除矩形。 image1.
canvas
.pen.color:=clblack; //笔为黑色 image1.
canvas
.brush.Style:=bsclear;//空白刷子 end else begin //第二次点击,表示已经得到矩形了, //把它拷贝到FORM1中的IMAGE部件上。 x2:=x; y2:=y; trace:=false; image1.
canvas
.rectangle(x1,y1,oldx,oldy); width:=abs(x2-x1); height:=abs(y2-y1); form1.image1.Width:=Width; form1.image1.Height:=Height; newbitmap:=Tbitmap.
create
; newbitmap.width:=width; newbitmap.height:=height; newbitmap.
Canvas
.CopyRect (Rect (0, 0, width, Height),form2.image1.
canvas
, Rect (x1, y1,x2,y2)); //拷贝 form1.image1.picture.bitmap:=newbitmap; //放到FORM的IMAGE上 newbitmap.free; form2.hide; form1.show; end; end; ---- 12.MOUSEMOVE 的 处 理 就 是 在 原 点 和 鼠 标 当 前 位 置 之 间 不 断 地 画 矩 形 和 擦 除 矩 形。 procedure TForm2.Image1MouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if trace=true then //是否在追踪鼠标? begin //是,擦除旧的矩形并画上新的矩形 with image1.
canvas
do begin rectangle(x1,y1,oldx,oldy); Rectangle(x1,y1,x,y); oldx:=x; oldy:=y; end; end else if flag=true then //在鼠标所在的位置上画十字 begin with image1.
canvas
do begin moveTo(foldx,0); //擦除旧的十字 LineTo(foldx,screen.height); moveto(0,foldy); lineto(screen.width,foldy); moveTo(x,0); //画上新的十字 LineTo(x,screen.height); moveto(0,y); lineto(screen.width,y); foldx:=x; foldy:=y; end; end; end; ---- 13. 好 了, 让 我 们 回 过 头 来 编 写REGION 按 钮 的 代 码。 procedure TForm1.RegionClick(Sender: TObject); begin form1.Hide; form2.hide; form2.Timer1.Enabled:=true; end; ---- 好 了, 我 们 终 于 胜 利 完 工 了, 赶 快 运 行 一 遍, 把 漂 亮 的 屏 幕 拷 下 来 ! 瞧 DELPHI 不 仅 是 一 个 优 秀 的 数 据 库 开 发 工 具, 而 且 是 一 个 优 秀 的 编 写WINDOWS 程 序 的 好 帮 手。 让 我 们 不 禁 赞 叹: 伟 大 的DELPHI !
Delphi图片与Base64互转及图片添加水印
Delphi 实现图片与Base64编码相互转化和给图片添加水印图片和水印文字Demo
图像反色处理,Delphi多形式示例..rar
图像反色处理,Delphi多形式示例..rar
Delphi
5,930
社区成员
262,936
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章