小编klu*_*udg的帖子

Delphi无边框和无标题应用程序

我愿意使用以下代码在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)

请帮我.

delphi delphi-xe2

5
推荐指数
3
解决办法
4813
查看次数

以类型安全的方式将方法的代码作为参数传递

传递方法作为参数不是问题:

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 methods arguments type-safety

5
推荐指数
1
解决办法
2438
查看次数

delphi新项目不是从form1开始的

所以这只是一个小小的烦恼但是当我启动delphi并开始一个新项目只是为了测试一些东西我希望它是form1,unit1等.但是它在表单2开始新的项目.我该如何解决这个问题?我怀疑为项目找到了默认的保存空间,但我没有.我正在使用delphi 2007和Windows 7.

delphi delphi-2007

4
推荐指数
1
解决办法
629
查看次数

在Delphi 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)

delphi delphi-7

4
推荐指数
2
解决办法
4499
查看次数

Delphi中的C风格十六进制 - 未记录的功能?

我偶然注意到以下代码

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 hex delphi-2009

4
推荐指数
1
解决办法
332
查看次数

在Delphi 2010中将十六进制字符串转换为ansistring

我曾经使用这个函数将十六进制字符串转换为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)

delphi unicode hex

4
推荐指数
1
解决办法
8357
查看次数

Delphi:重写方法没有调用使用RTTI实例化的对象

我正试图在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)

delphi rtti delphi-2010

4
推荐指数
1
解决办法
801
查看次数

C和Delphi中的条件编译

下一个模式在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,以便前者需要检查而后者不需要检查?

c delphi conditional-compilation ifndef

4
推荐指数
1
解决办法
1430
查看次数

如何在没有范围检查错误的情况下从字节"构建"负32位整数?

我需要将一个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 type-conversion delphi-7

4
推荐指数
1
解决办法
470
查看次数

TFont.Charset在Delphi 2010中的作用

在Delphi 2010中,VCL控件的TFont.Charset属性有什么作用?现在所有Delphi 2010组件都支持UNICODE,这个属性不相关吗?

delphi delphi-2010

3
推荐指数
1
解决办法
852
查看次数