标签: delphi

当Windows字体缩放大于100%时,如何使我的GUI表现良好

在Windows控制面板中选择大字体大小(如125%或150%)时,每次按像素设置某些内容时,VCL应用程序中都会出现问题.

拿走TStatusBar.Panel.我已经设置了它的宽度,使它只包含一个标签,现在使用大字体标签"溢出".与其他组件相同的问题.

戴尔的一些新笔记本电脑已经默认设置为125%,因此在过去这个问题非常罕见,现在非常重要.

可以做些什么来克服这个问题?

windows delphi windows-7

105
推荐指数
4
解决办法
5万
查看次数

有没有办法以编程方式判断FastMM是否没有释放特定的内存块?

我试图检测是否释放了一块内存.当然,经理告诉我通过对话框或日志文件,但如果我想将结果存储在数据库中该怎么办?例如,我想在数据库表中包含分配给定块的例程的名称.

在阅读了FastMM的文档之后,我知道从版本4.98开始,我们有可能被管理员通知内存分配,释放和重新分配.例如,OnDebugFreeMemFinish事件传递给我们a PFullDebugBlockHeader包含有用的信息.PFullDebugBlockHeader缺少一件事- 如果给定的块被应用程序释放,则会显示信息.

除非OnDebugFreeMemFinish仅为未释放的块调用?这是我不知道并想知道的.

问题是,即使挂钩OnDebugFreeMemFinish事件,我也无法找出该块是否被释放.

这是一个例子:

program MemLeakTest;

{$APPTYPE CONSOLE}

uses
  FastMM4, ExceptionLog, SysUtils;


procedure MemFreeEvent(APHeaderFreedBlock: PFullDebugBlockHeader; AResult: Integer);
begin
//This is executed at the end, but how should I know that this block should be freed
//by application? Unless this is executed ONLY for not freed blocks.
end;

procedure Leak;
var
  MyObject: TObject;
begin
  MyObject := TObject.Create;
end;

begin
  OnDebugFreeMemFinish := MemFreeEvent;
  Leak;
end.
Run Code Online (Sandbox Code Playgroud)

我缺少的是回调,如:

procedure OnMemoryLeak(APointer: PFullDebugBlockHeader);
Run Code Online (Sandbox Code Playgroud)

在浏览FastMM的源代码后,我发现有一个过程: …

delphi memory-leaks delphi-2009 fastmm

103
推荐指数
1
解决办法
2609
查看次数

delphi变量是否默认使用值初始化?

我是Delphi的新手,我一直在运行一些测试来查看默认情况下初始化了哪些对象变量和堆栈变量:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;
Run Code Online (Sandbox Code Playgroud)

这是我习惯使用其他语言的行为,但我想知道在Delphi中依赖它是否安全?例如,我想知道它是否可能依赖于编译器设置,或者可能在不同的机器上以不同的方式工作.依赖于对象的默认初始化值是正常的,还是在构造函数中显式设置所有实例变量?

至于堆栈(过程级)变量,我的测试显示单位化布尔值为真,单位化整数为2129993264,未初始化对象只是无效指针(即不是nil).我猜测规范是在访问它们之前始终设置过程级变量?

delphi variables initialization

101
推荐指数
9
解决办法
6万
查看次数

如何在Delphi中的字符串中包含换行符?

我想创建一个跨越多行的字符串,以分配给Label Caption属性.这是如何在Delphi中完成的?

delphi newline

94
推荐指数
7
解决办法
15万
查看次数

是否记录了隐式接口变量的编译器处理?

不久前我问了一个关于隐式接口变量的类似问题.

这个问题的来源是我的代码中的一个错误,因为我没有意识到编译器创建的隐式接口变量的存在.拥有它的过程完成后,该变量已完成.这反过来导致了由于变量的生命周期比我预期的更长的错误.

现在,我有一个简单的项目来说明编译器的一些有趣的行为:

program ImplicitInterfaceLocals;

{$APPTYPE CONSOLE}

uses
  Classes;

function Create: IInterface;
begin
  Result := TInterfacedObject.Create;
end;

procedure StoreToLocal;
var
  I: IInterface;
begin
  I := Create;
end;

procedure StoreViaPointerToLocal;
var
  I: IInterface;
  P: ^IInterface;
begin
  P := @I;
  P^ := Create;
end;

begin
  StoreToLocal;
  StoreViaPointerToLocal;
end.
Run Code Online (Sandbox Code Playgroud)

StoreToLocal编译就像你想象的那样.局部变量I(函数的结果)作为隐式var参数传递给Create.通过StoreToLocal一次通话即可获得整齐的结果IntfClear.没有惊喜.

但是,StoreViaPointerToLocal对待方式不同.编译器创建一个传递给它的隐式局部变量Create.当Create返回时,对分配P^进行.这使例程中有两个局部变量保存对接口的引用.StoreViaPointerToLocal两次调用结果的整理结果IntfClear.

编译后的代码StoreViaPointerToLocal是这样的:

ImplicitInterfaceLocals.dpr.24: begin
00435C50 55 …
Run Code Online (Sandbox Code Playgroud)

delphi interface delphi-2010

86
推荐指数
1
解决办法
2593
查看次数

使用Delphi XML数据绑定向导时不存在必需的标记

我在Delphi XE2中使用XML数据绑定向导.架构需要此类型的标记:

<xs:element name="MyReport" type="MyReportType" />
<xs:complexType name="MyReportType">
  <xs:all>
    <xs:element name="Header" type="HeaderType" />
    <xs:element name="Values" type="ValuesType" />
    <xs:element name="Events" type="EventsType" />
  </xs:all>
</xs:complexType>
Run Code Online (Sandbox Code Playgroud)

问题是,如果我没有向Values-group添加任何元素,则不会有<Values>-tag,并且XML文件将无法针对XSD进行验证.如果接口提供"添加"Values-tag的方法,这可能不会成为问题.

有没有一种标准的处理方法,或者我是否正确使用生成的代码?

简而言之,使用数据绑定向导中的代码,有没有办法,解决方法或其他方式产生以下XML(这是在没有子节点时使用上述模式进行验证所需的),给定HeaderType ,ValuesType和EventsType属于complexType:

<MyReport>
  <Header />
  <Values />
  <Events />
</MyReport> 
Run Code Online (Sandbox Code Playgroud)

(我知道还有其他类似的问题,比如<xs:sequence>在最终的XML文件中没有强制执行正确的顺序而生成的代码,但至少对于那个问题,只需要按照正确的顺序插入子代就可以解决这个问题.我仍然如果Embarcadero提供一个完整的界面,考虑到更多的这些功能,那将会很好.)

xml delphi xsd delphi-xe2

81
推荐指数
1
解决办法
1574
查看次数

根据分隔符将字符串拆分为字符串数组

我正在尝试找到一个Delphi函数,它将输入字符串拆分为基于分隔符的字符串数组.我在谷歌上找到了很多,但似乎都有自己的问题,而我却无法让它们发挥作用.

我只需要将一个字符串拆分为: "word:doc,txt,docx"基于':'的数组.结果将是 ['word', 'doc,txt,docx'].

有没有人有他们知道的功能?

谢谢

delphi string split delimiter

79
推荐指数
11
解决办法
23万
查看次数

为什么从代码中调用eventhandler是不好的做法?

假设您有一个菜单项和一个执行相同任务的按钮.为什么将任务的代码放入一个控件的动作事件然后从另一个控件调用该事件是不好的做法?Delphi允许这和vb6一样,但是realbasic没有,并且说你应该将代码放入一个方法,然后由菜单和按钮调用

delphi vb6 coding-style realbasic

73
推荐指数
6
解决办法
6584
查看次数

Webview无法使用Delphi XE2在MacOS中显示

我已经开始转换要在Delphi中使用的Webview接口.我已设法加载webkit库,并且调用的接口方法似乎正常工作,但是,我似乎无法在主窗体上显示Webview.

下面是我声明的接口

  WebFrameClass = interface(NSObjectClass)
  ['{7BE750C8-DFEC-4870-851A-12DBCB0B78F6}']
  end;

  WebFrame = interface(NSObject)
  ['{BCFA04BE-41AB-4B78-89C0-3330F12C7695}']
    procedure loadRequest(request: NSURLRequest); cdecl;
  end;
  TWebFrame = class(TOCGenericImport<WebFrameClass, WebFrame>)  end;

  WebViewClass = interface(NSViewClass)
  ['{0D9F44B7-09FD-4E35-B96E-8DB71B9A2537}']
    {class} function canShowMIMEType(MIMEType: NSString): Boolean; cdecl;
  end;

  WebView = interface(NSView)
  ['{C36D8016-2FCB-49F0-BA1C-C9913A37F9AC}']
    procedure clos; cdecl;
    procedure setHostWindow(hostWindow: NSWindow); cdecl;
    function initWithFrame(frame: NSRect; frameName: NSString; groupName: NSString): Pointer; cdecl;
    function mainFrame: WebFrame; cdecl;
  end;
  TWebView = class(TOCGenericImport<WebViewClass, WebView>)  end;
Run Code Online (Sandbox Code Playgroud)

以下是构建WebView的代码:

procedure TForm2.Button1Click(Sender: TObject);
var
  PWebView: Pointer;
  FwkMod: HMODULE;
  MyWebView: WebView;
  urlStr: NSURL;
  urlreq: NSURLRequest;
const
  WebKitFWK: string …
Run Code Online (Sandbox Code Playgroud)

delphi macos webkit freepascal delphi-xe2

73
推荐指数
1
解决办法
2245
查看次数

Delphi XE6在iOS中链接C代码

我使用需要C代码的Delphi XE6在Android上构建了一个应用程序.但是在iOS上我无法使其工作.我怀疑这个问题与手臂/拇指状态有关,但我不确定.两个系统都没有问题从Pascal调用C代码.但是如果C代码回调一个Pascal过程,iOS会生成一个"bad system call (12)"

这是pascal代码:

function testarm(a,b:integer):integer; cdecl; external "testC.o";

Procedure testC;
Begin
  testarm(1,2);
end;

function BackToPascal(a,b:integer): integer; cdecl;
  Begin
  result := a+b;
end;

......

exports
  BackToPascal;
Run Code Online (Sandbox Code Playgroud)

这是C代码:

extern int BackToPascal(int a,int b);

extern int testarm(int a,int b)
{
   int i;
   i = BackToPascal(a,b);
   return i+1;
}
Run Code Online (Sandbox Code Playgroud)

在android上这是我编译的方式(它正在工作):

..."arm-linux-androideabi-gcc.exe" -c test.c -o test.o -O3 -mfloat-abi=softfp -mfpu=neon -marm -march=armv7-a -mtune=cortex-a8
Run Code Online (Sandbox Code Playgroud)

在ios上:

xcrun -sdk iphoneos clang -c -arch armv7 test.c -O3 -mfpu=neon -mtune=cortex-a8 -marm -march=armv7-a -mfloat-abi=softfp
Run Code Online (Sandbox Code Playgroud)

我怀疑我的xcode设置是错误的,但我无法弄清楚原因.

当我调试,错误时调用来testC在 …

c delphi pascal ios delphi-xe6

68
推荐指数
1
解决办法
713
查看次数