我想建立一个全局出错函数.(100分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi帮助中我看到如下可以实现全局除错.但我想写在独立的单元中,不包括在TForm,
比如我想用procedure AppException(Sender: TObject; E: Exception);而不是用
procedure TForm1.AppException(Sender: TObject; E: Exception);
但TExceptionEvent类定义中有of object,我能理会但不太清楚具体定义,请问哪位能帮我
解释一下具体概念吗?而且,我是希望将一个常用的封装到一个DLL中,不包括表单,而我也想
将出错函数加在里面,或一个单独的Unit文件中,但程序出错都到那个去除错.行吗?
2.再问一个题外话,多少像素对1厘米,哪位有类似对照表?比如说800*600的屏幕,多长距离是
1厘米,而640*480的又是多少?鼠标移动是以什么为单位,与厘米如何转换?
谢谢各位大侠排忧解难!!

帮助中的例子如下:
type TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
property OnException: TExceptionEvent;

procedure TForm1.FormCreate(Sender: TObject);
begin
; Application.OnException := AppException;
end;

procedure TForm1.AppException(Sender: TObject; E: Exception);
begin
; Application.ShowException(E);
; Application.Terminate;
end;
 
要建立全局函数恐怕是不行的,可以考虑创建一个异常处理对象,封装到DLL即可。
type
; TMyExceptionHandle=class
; ; procedure AppExeption(Sender: TObject; E: Exception);
; end;
procedure TMyExceptionHandle.AppException(Sender: TObject; E: Exception);
begin
; Application.ShowException(E);
; Application.Terminate;
end;
var
; MyExceptionHandle:TMyExceptionHandle;
initialization
; MyExceptionHandle:=TMyExceptionHandle.Create;
; Application.OnException := TMyExceptionHandle.AppException;
end;
 
给你介绍个控件:
Eureka Exception Log v3.1 for Delphi ; ; ; ; ; ; ; ; ; ;
http://www.eurekalog.com/
 
龙丹的方法可行﹐但这个对像需不需要FREE呢?另外,第2个问题请解答.
我想得到鼠标在屏幕上移动的距离换算成厘米.
 
1.从软件工程/良好的编程习惯来说,谁创建的对象谁销毁,所以应该在单元的finalization部分Free,
; 不过这个对象不Free也无妨,因为程序结束时系统会释放所有资源
2.简单一点可以通过Screen.PixelsPerInch属性来换算
const
; TMMPI=254; //每英寸的mm/10数
function MetricToPixels(x:integer):integer; //将公制单位(mm/10)转换为屏幕像素
begin
; result:=MulDiv(x,Screen.PixelsPerInch,TMMPI);
end;
function PixelsToMetric(x:integer):integer;//将屏幕像素转换为公制单位(mm/10)
begin
; result:=MulDiv(x,TMMPI,Screen.PixelsPerInch);
end;
以上是以十分之一毫米为单位。
实际上,屏幕的垂直分辨率和水平分辨率是不一样的,Screen.PixelsPerInch取的是垂直
分辨率,以下代码可取出两个分辨率:
; DC:=GetDC(0);
; FHorzDPI:=GetDeviceCaps(DC, LOGPIXELSX);
; FVertDPI:=GetDeviceCaps(DC, LOGPIXELSY);
; ReleaseDC(0, DC);
 
龙丹,对不起,我还有一个问题要问你,若我是斜线,怎么算呢?你说横的跟竖的值不一样.而且
我分两次取得鼠标的值,p.x与p.y,它们是以什么为单位的呢?得到两次的值后必定以斜线算
移动距离,而这个斜线就要换算成厘米.
 
不知道你的具体应用,不太好说,
一般地,是只考虑图形参数,比如线段:考虑端点坐标,所有的转换也就是对端点坐标进行;
转换一个坐标,X用FHorzDPI,Y用FVertDPI
圆:可以看成椭圆
...
 
赞成龙丹~
 
初中几何中学过用角度和一直边可以求斜边长度,Delphi中也有这方面的函数。
 
我总得先算出斜线长度,然后再转换成厘米.那么,我是以什么为准呢?
程序中调用如下:
; LenPath:=CalPathLen(LastX,LastY,M.pt.x,M.pt.y);
函数定义如下:
function CalPathLen(x1, y1, x2, y2: integer): single; ;//计算鼠标移动距离
var x,y:integer;
; ; z:single;
begin
; x:=Abs(x2-x1); ;//比如x1为20,x2为.50
; y:=Abs(y2-y1); ;//比如y1为30,y2为70
; z:=Sqrt(x*x+y*y);
; LastX:=x2;
; LastY:=y2;
; Result:=z/DPI;?这DPI到底应该是多少呢?
end;
答完就给分.谢谢!
 
1.应该先转换两个端点坐标,然后再计算
2.a^2+b^2=c^2,应该会算吧
 
查查SetMapMode,SetWindowOrgEx,SetViewportOrgEx,SetWindowExtEx,SetViewPortExtEx
几个吧
 
龙丹,能结个尾吗?这儿至少有80分是你的.
 
我想,应该就是憨憨说的吧。
分多分少都谢了。
 
谢谢各位!
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
913
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部