我愿意使用以下代码在Delphi XE2中无边界和无标题地设计一个应用程序:
BorderIcons = []
BorderStyle = bsNone
Run Code Online (Sandbox Code Playgroud)
但问题是右键单击任务栏上的应用程序没有菜单,就像上图中一样.然后我在FormShow事件上尝试了以下代码,但还有另一个问题.在左侧和左侧B侧创建一个边框.代码是:
procedure TForm1.FormShow(Sender: TObject);
var
r: TRect;
begin
r := ClientRect;
OffsetRect(r, 0, GetSystemMetrics(SM_CYCAPTION));
OffsetRect(r, GetSystemMetrics(SM_CXFRAME), GetSystemMetrics(SM_CYFRAME));
SetWindowRgn(Handle,
CreateRectRgn(
r.Left, r.Top,
ClientWidth + r.Left, ClientHeight + r.Top), True);
end;
Run Code Online (Sandbox Code Playgroud)
请帮我.
传递方法作为参数不是问题:
type
TSomething = class
Msg: string;
procedure Show;
end;
procedure TSomething.Show;
begin
ShowMessage(Msg);
end;
type TProc = procedure of object;
procedure Test(Proc: TProc);
begin
Proc;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Smth: TSomething;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello';
Test(Smth.Show);
end;
Run Code Online (Sandbox Code Playgroud)
我需要一些棘手的东西 - 只传递一个方法的代码部分.我知道我能做到:
procedure Test2(Code: Pointer);
var
Smth: TSomething;
Meth: TMethod;
begin
Smth:= TSomething.Create;
Smth.Msg:= 'Hello Hack';
Meth.Data:= Smth;
Meth.Code:= Code;
TProc(Meth);
Smth.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Test2(@TSomething.Show);
end;
Run Code Online (Sandbox Code Playgroud)
但这是一个黑客和不安全 - 编译器无法检查方法的参数.
问题:是否有可能以类型安全的方式做同样的事情?
所以这只是一个小小的烦恼但是当我启动delphi并开始一个新项目只是为了测试一些东西我希望它是form1,unit1等.但是它在表单2开始新的项目.我该如何解决这个问题?我怀疑为项目找到了默认的保存空间,但我没有.我正在使用delphi 2007和Windows 7.
我有以下代码序列:
program OverrideAfterConstructionEtc;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes;
type
TA = class( TInterfacedObject)
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
protected
FDummyData: array[ 1 .. 1000 ] of longint;
end;
{ TA }
procedure TA.AfterConstruction;
var
selfPtr: Pointer;
selfInt: Integer;
selfStr: string;
size: Integer;
begin
inherited AfterConstruction;
selfPtr := Addr( self );
selfInt := Integer( selfPtr );
selfStr := IntToHex( selfInt, 8 );
size := TA.InstanceSize;
WriteLn( 'TA instance allocated at 0x', selfStr );
WriteLn( 'TA size is ', size …Run Code Online (Sandbox Code Playgroud) 我偶然注意到以下代码
var
I: Integer;
begin
I:= StrToInt('0xAA');
ShowMessage(IntToStr(I)); // shows 170 = $AA
end;
Run Code Online (Sandbox Code Playgroud)
在Delphi 2009中没问题.BTW这个功能帮我从C头文件中提取十六进制常量.
我想知道是否可以使用该功能,或者该功能即将在未来版本中"修复"?
我曾经使用这个函数将十六进制字符串转换为Delphi 6中的字符串:
const
testSign = '207F8060287F585054505357FFD55861';
function Hex2Dec(const data: string): byte;
var
nH1, nH2: byte;
begin
if data[1] in ['0' .. '9'] then
nH1 := strtoint(data[1])
else
nH1 := 9 + ord(data[1]) - 64;
if data[2] in ['0' .. '9'] then
nH2 := strtoint(data[2])
else
nH2 := 9 + ord(data[2]) - 64;
Result := nH1 * 16 + nH2;
end;
function HexStrToStr(const HexStr: string): string;
var
BufStr: string;
LenHex: Integer;
x, y: Integer;
begin
LenHex := Length(HexStr) div 2;
x …Run Code Online (Sandbox Code Playgroud) 我正试图在D2010中使用RTTI克隆对象.这是我到目前为止的尝试:
uses SysUtils, TypInfo, rtti;
type
TPerson = class(TObject)
public
Name: string;
destructor Destroy(); Override;
end;
destructor TPerson.Destroy;
begin
WriteLn('A TPerson was freed.');
inherited;
end;
procedure CloneInstance(SourceInstance: TObject; DestinationInstance: TObject; Context: TRttiContext); Overload;
var
rSourceType: TRttiType;
rDestinationType: TRttiType;
rField: TRttiField;
rSourceValue: TValue;
Destination: TObject;
rMethod: TRttiMethod;
begin
rSourceType := Context.GetType(SourceInstance.ClassInfo);
if (DestinationInstance = nil) then begin
rMethod := rSourceType.GetMethod('Create');
DestinationInstance := rMethod.Invoke(rSourceType.AsInstance.MetaclassType, []).AsObject;
end;
for rField in rSourceType.GetFields do begin
if (rField.FieldType.TypeKind = tkClass) then begin
// TODO: Recursive clone …Run Code Online (Sandbox Code Playgroud) 下一个模式在C代码中很常见:
#ifndef SOMETHING
#define SOMETHING
#endif
Run Code Online (Sandbox Code Playgroud)
这种模式在Delphi代码中也是可能的:
{$IFNDEF SOMETHING}
{$DEFINE SOMETHING}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)
但这并不常见 - 我从来没有见过它.如果Delphi代码需要条件定义,它只是定义它而不IFNDEF检查.
为什么这样?C和Delphi之间条件编译的区别是什么ifndef,以便前者需要检查而后者不需要检查?
我需要将一个21位有符号整数(以三个7位字符提供)转换为32位有符号整数.我正在努力使下面的功能工作.如果我将outval定义为整数,我会在"outval:= outval或$ FFF00000"语句中检查范围.如果我将outval更改为长字,我会在"Val21bit:= outval"上进行范围检查.范围检查仅在值为负时发生.
除了关闭作业周围的范围检查之外,是否有任何"正确"的方法来完成这项工作?
function Val21bit(sx:string):integer; {Input of 3 character string, Vh, Vm, Vl}
var
outval : longword; // define as Longword to allow or-ing in high bit
{ valueH : 0scccccc
valueM : 0bbbbbbb
valueL : 0aaaaaaa
int : ssssssss sssscccc ccbbbbbb baaaaaaa }
begin
outval := byte(sx[1]); // 00000000 00000000 00000000 0scccccc highest order first
outval := (outval shl 7) or ($7F and byte(sx[2])); // 00000000 00000000 00sccccc cbbbbbbb
outval := (outval shl 7) or ($7F and …Run Code Online (Sandbox Code Playgroud) 在Delphi 2010中,VCL控件的TFont.Charset属性有什么作用?现在所有Delphi 2010组件都支持UNICODE,这个属性不相关吗?
delphi ×10
delphi-2010 ×2
delphi-7 ×2
hex ×2
arguments ×1
c ×1
delphi-2007 ×1
delphi-2009 ×1
delphi-xe2 ×1
ifndef ×1
methods ×1
rtti ×1
type-safety ×1
unicode ×1