求翻译...把delphi代码改成c++builder

wzllin111 2015-09-01 01:51:22
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Math, StdCtrls, Grids, DBGrids, ComCtrls, Buttons, RzLabel,
ExtCtrls,TypInfo;

var
fScrResolutionRateW:Double;
fScrResolutionRateH:Double;
fIsFitDeviceDone: Boolean;
fPosition:Array of TRect;

Const //记录设计时的屏幕分辨率
OriWidth=1024;
OriHeight=768;

procedure FitDeviceResolution(Self : TForm);

implementation



procedure FitDeviceResolution(Self : TForm);
Var
LocList:TList;
LocFontRate:Double;
LocFontSize:Integer;
LocFont:TFont;
locK:Integer;

function GetObjectProperty(const AObject: TObject; const APropName : string ):TObject;
var
PropInfo:PPropInfo;
begin
Result := nil;
PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);
if Assigned(PropInfo) and
(PropInfo^.PropType^.Kind = tkClass) then
Result := GetObjectProp(AObject,PropInfo);
end;



function PropertyExists(const AObject: TObject;const APropName : String):Boolean;
//判断一个属性是否存在
var
PropInfo:PPropInfo;
begin
PropInfo:=GetPropInfo(AObject.ClassInfo,APropName);
Result:=Assigned(PropInfo);
end;

{计算尺度调整的基本参数}
Procedure CalBasicScalePars;
Begin
try
Self.Scaled:=False;
fScrResolutionRateH:=screen.height/OriHeight;
fScrResolutionRateW:=screen.Width/OriWidth;
LocFontRate:=Min(fScrResolutionRateH,fScrResolutionRateW);
except
Raise;
end;
End;

{保存原有坐标位置:利用递归法遍历各级容器里的控件,直到最后一级}
Procedure ControlsPostoList(vCtl:TControl;vList:TList);
Var
locPRect:^TRect;
i:Integer;
locCtl:TControl;
Begin
try
New(locPRect);
locPRect^:=vCtl.BoundsRect;
vList.Add(locPRect);
If vCtl Is TWinControl Then
For i:=0 to TWinControl(vCtl).ControlCount-1 Do
begin
locCtl:=TWinControl(vCtl).Controls[i];
ControlsPosToList(locCtl,vList);
end;
except
Raise;
end;
End;

{计算新的坐标位置:利用递归法遍历各级容器里的控件,直到最后一层。
计算坐标时先计算顶级容器级的,然后逐级递进}
Procedure AdjustControlsScale(vCtl:TControl;vList:TList;Var vK:Integer);
Var
locOriRect,LocNewRect:TRect;
i:Integer;
locCtl:TControl;
Begin
try
If vCtl.Align<>alClient Then
Begin
locOriRect:=TRect(vList.Items[vK]^);
With locNewRect Do
begin
Left:=Round(locOriRect.Left*fScrResolutionRateW);
Right:=Round(locOriRect.Right*fScrResolutionRateW);
Top:=Round(locOriRect.Top*fScrResolutionRateH);
Bottom:=Round(locOriRect.Bottom*fScrResolutionRateH);
vCtl.SetBounds(Left,Top,Right-Left,Bottom-Top);
end;
End;
Inc(vK);
If vCtl Is TWinControl Then
For i:=0 to TwinControl(vCtl).ControlCount-1 Do

begin
locCtl:=TWinControl(vCtl).Controls[i];
AdjustControlsScale(locCtl,vList,vK);
end;
except
Raise;
end;
End;



{按照新的比例设计窗体中各组件的字体}
Procedure AdjustComponentFont(vCmp:TComponent);
Var
i:Integer;
locCmp:TComponent;
Begin
try
For i:=vCmp.ComponentCount-1 Downto 0 Do
Begin
locCmp:=vCmp.Components[i];
If PropertyExists(LocCmp,'FONT') Then
Begin
LocFont:=TFont(GetObjectProperty(LocCmp,'FONT'));
LocFontSize := Round(LocFontRate*LocFont.Size);
LocFont.Size:=LocFontSize;
End;

End;
except
Raise;
end;
End;



{释放坐标位置指针和列表对象}
Procedure FreeListItem(vList:TList);
Var
i:Integer;
Begin
For i:=0 to vList.Count-1 Do
Dispose(vList.Items[i]);
vList.Free;
End;

begin
fScrResolutionRateH:=1;
fScrResolutionRateW:=1;
LocList:=TList.Create;
Try
Try
if (Screen.width<>OriWidth)OR(Screen.Height<>OriHeight) then
begin
CalBasicScalePars;
AdjustComponentFont(Self);
ControlsPostoList(Self,locList);
locK:=0;
AdjustControlsScale(Self,locList,locK);

End;
Except on E:Exception Do
Raise Exception.Create('进行屏幕分辨率自适应调整时出现错误'+E.Message);
End;
Finally
FreeListItem(locList);
End;
end;


end.
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzllin111 2015-09-01
  • 打赏
  • 举报
回复
引用 2 楼 ksrsoft 的回复:
添加到工程后悔生成对应的头文件,包含头文件,然后调用方法
	FitDeviceResolution(this);
这样也行啊,太方便了,
缘中人 2015-09-01
  • 打赏
  • 举报
回复
添加到工程后悔生成对应的头文件,包含头文件,然后调用方法
	FitDeviceResolution(this);
缘中人 2015-09-01
  • 打赏
  • 举报
回复
别翻译了,直接存为pas文件,添加到c++builder工程里。 然后调用方法名就可以了啊。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧