小编WeG*_*ars的帖子

如何将 FastMM 添加到 C++ Builder 项目?

我正在尝试配置FASTMM4Builder C++ 6我遵循的步骤是:

  1. sourceforge下载了zip。
  2. 菜单下Project -> Options -> Linker我取消勾选了"Use Dynamic RTL"
  3. 解压缩以下内容C:/tools/FASTMM并将FASTMM4.pas文件添加到我的测试 C++ VCL 项目中。
  4. 只需从“项目”菜单编译该单元并FastMM4.hpp在 FastMM 文件夹中获得一个新文件。
  5. 将文件包含FastMM4BCB.cpp在我的项目中,并写#include <FASTMM4.hpp>在顶部。
  6. 添加了路径FastMM_FullDebugMode.dllFastMM_FullDebugMode.lib移动FastMM_FullDebugMode.dll到安装目录Bin中的文件夹Builder C++
  7. {$define FullDebugMode}启用来自 的线路FastMM4Options.inc

我错过了什么吗?为什么我会出现以下错误?

链接器错误

c++ c++builder fastmm

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

长度有多快?

我需要s在程序中经常读取字符串的长度.我设置了s一次字符串,所以我可以在变量(NoOfChars)中记住它的大小,如下所示:

type
  MyClass= class
    Public
     s: string;
     NoOfchars: integer;  
  end;

procedure MyClass.SetS(const MyString: String); 
begin
  s:= MyString;
  NoOfchars := Length(s); // <-- store it once, read it often
end;
Run Code Online (Sandbox Code Playgroud)

我想我读到的地方Length(s)和读取常量一样快,因为它只访问存储在字符串前面"hidden"字段中的字符串的长度.这很有意义,但由于我们没有源代码,我们只能猜测.也许还有其他涉及的计算?

那么,我应该使用Length(s)还是应该记住变量中的长度?

delphi delphi-xe

3
推荐指数
2
解决办法
549
查看次数

如何在C++中定义常量?

我通过Mingw在Windows上编写了一个linux程序.但是,转换并不完美.例如,在Windows上输出是这样的(我得到'zu'而不是实数):

Approximated minimal memory consumption:
Sequence        : zuM
Buffer          : 1 X zuM = zuM
Table           : 1 X zuM = zuM
Miscellaneous   : zuM
Total           : zuM
Run Code Online (Sandbox Code Playgroud)

事实证明,Mingw不支持%zu,但它提供了一种解决方法.在他们的网站上,他们说:

由于您使用的是Microsoft的实现,因此无法使用.在包含stdio.h之前,直接使用mingw_printf或将USE_MINGW_ANSI_STDIO定义为1.

所以,我在我的程序中进行了搜索,我发现cdhit-common.h是唯一一个有#include行的文件.所以,我在该行上方定义了USE_MINGW_ANSI_STDIO并编译:

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdlib>
#define USE_MINGW_ANSI_STDIO 1
#include<stdio.h>
...
Run Code Online (Sandbox Code Playgroud)

它编译但程序仍然输出'zu'而不是数字.我做的不错吗?为什么没用?

注意:使用mingw时,使用USE_MINGW_ANSI_STDIO的解决方案适用于mingw64.我希望是适用于这两个平台.

c++ linux gcc mingw

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

如何在高DPI系统中获得真实的屏幕分辨率?

因此,Delphi程序不支持DPI。直到最近,当我需要具有高DPI的计算机上的真实屏幕分辨率(“让屏幕上的内容变得更容易阅读”时,Screen.Width报告的错误分辨率为150%)时,这并没有给我带来多少麻烦。建议的一些建议是使应用程序具有高DPI感知能力(XML清单),但其他警告我们这涉及很多工作!因此,由于懒惰(或缺少时间),我想知道是否有技巧来计算实际分辨率。

我想到的一个非常肮脏的技巧是创建一个DPI感知的辅助工具(微型控制台应用程序)。然后,我要做的就是调用此工具并从中获取真正的分辨率。漂亮的斯巴达人,但它应该工作。无论如何,一定有更好的方法可以做到!

delphi resolution dpi delphi-xe

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

如何在TWebBrowser中始终加载新页面?

我正在尝试使用Browser.Navigate(URL)将网页加载到TWebBrowser中.但是,浏览器不会关心页面是否在线更新,所以只要我不重启程序就不会显示新页面.

一个更具体的例子:如果我导航到具有访问者计数器(作为图像)的网页,计数器将递增.如果我离开那个页面,然后我返回(不使用Back),计数器将不会递增.在Firefox中,它会增加.

这是我尝试过的,不会起作用:

const
  DLCTL_PRAGMA_NO_CACHE = $00004000;

procedure TBrowserFrm.LoadURL(URL: string);
var
  Flag: OleVariant;
begin
  Flag:=DLCTL_PRAGMA_NO_CACHE;
  Browser.Navigate(URL, Flag);
end; 


procedure TBrowserFrm.LoadURL(URL: string);
var
Flags: OleVariant;
begin
 Flags := 'navNoHistory, navNoReadFromCache, navNoWriteToCache';
 Browser.navigate2(URL, Flags);
end;
Run Code Online (Sandbox Code Playgroud)

有关如何使TWebBrowser加载真实页面的任何想法?

delphi twebbrowser

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

将ASM与非asm代码(或需要SwapInt64 ASM功能)相结合

我需要处理一个来自旧Mac时代的文件(旧摩托罗拉CPU).字节是大端,所以我有一个函数交换和Int64到英特尔小端.该函数是ASM,适用于32位CPU但不适用于64位.对于64位,我有一个不同于ASM的不同功能.我想用IFDEF组合这些功能.我可以这样做吗?会有问题吗?

interface 

function SwapInt64(Value: Int64): Int64; assembler;  

implementation

{$IFDEF CPUx86}        
function SwapInt64(Value: Int64): Int64; assembler;        { Does not work on 64 bit }                                                                      { 
asm
 MOV     EDX,[DWORD PTR EBP + 12]
 MOV     EAX,[DWORD PTR EBP + 8]
 BSWAP   EAX
 XCHG    EAX,EDX
 BSWAP   EAX
end;

{$else}

 function SwapInt64 (Value: Int64): Int64;
 var P: PInteger;
 begin
  Result: = (Value shl 32) or (Value shr 32);
  P: = @Result;
  P ^: = (Swap (P ^) shl 16) or (Swap (P ^ shr 16)); …
Run Code Online (Sandbox Code Playgroud)

delphi assembly pascal inline-assembly

3
推荐指数
2
解决办法
263
查看次数

System.IOUtils.TDirectory.GetParent 奇怪的行为?

的结果GetParent('c:\1\2\')'c:\1\2'

的结果GetParent('c:\1\2')'c:\1'

这是正常/预期的行为吗?如果是,其背后的逻辑是什么?

delphi

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

如何知道USER何时更改了TMemo/TEdit中的文本?

我总是被TMemo(和其他类似控件)只有OnChange事件的事实所困扰.我想知道USER何时更改了文本,而不是以编程方式更改文本.

我知道两种方法来区分用户更改的文本和以编程方式更改的文本:

  1. 在以编程方式更改文本之前放置OnChange:= NIL.然后恢复OnChange.这很容易出错,因为每次更改代码中的文本时都需要记住这一点(以及要应用此特殊处理的备忘录/编辑).现在我们知道每次调用OnChange时,控件都是由用户编辑的.
  2. 捕获OnKeyPress,MouseDown等事件.确定文本是否实际更改并手动调用用户编辑ext时需要调用的代码.这可能会为已经很大的文件添加大量过程.

有一种更优雅的方式吗?

delphi

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

TDirectory.Delete 似乎是异步的

我观察到在调用 TDirectory.Delete(x) 后立即调用 DirectoryExists(x) 返回 true,如果要删除的文件夹中的文件很少并且文件夹处于打开状态(在 Total Commander 中)。

换句话说:

begin 
  TDirectory.Delete('x', true);  <-- 'Delete' exited but the folder is still not fully deleted
  if SysUtils.DirectoryExists('x')...  <-- This returns true
end;
Run Code Online (Sandbox Code Playgroud)

这是正常行为吗?

“解决方案”是这样的:

begin 
  TDirectory.Delete('x', true); 
  Sleep(1000);          //wait for Delete to finish
  if SysUtils.DirectoryExists('x')...
end;
Run Code Online (Sandbox Code Playgroud)

问题:我如何知道 Delete 何时准备就绪(如何消除睡眠)?

注意:Total Commander 不会阻止文件夹的删除(我猜),因为文件夹无论如何都会被删除(一段时间后)。

delphi delphi-xe7

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

如何暂停一个帖子?

我想画一些东西.因为GUI冻结我想在一个线程中绘制.但有时我想暂停绘图(几分钟).

Delphi的文档说暂停/恢复已经过时,但没有说明哪些功能取代了它们.

不推荐使用Suspend和Resume.Sleep和SpinWait显然是不合适的.令人惊讶的是,德尔福没有提供这样的基本属性/功能.

那么,我如何暂停/恢复一个线程?

delphi multithreading bitmap delphi-xe7

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