小编Uli*_*rdt的帖子

将图片保存为各种文件格式

我有一个例程procedure DrawStuff(ACanvas: TCanvas; const ARect: TRect),它在TCanvas上绘制一个指定的矩形.目前我DrawStuff用PaintBox的画布调用.现在我添加了一个Save as选项,用户可以从各种文件格式(bmp,wmf,jpg,... - 最好尽可能多的TGraphic后代)中选择以保存结果DrawStuff.

绘制到a TMetafile并将其保存为"bla.bmp"或将Assign其保存为a TPicture无法正常工作 - 例如,它会生成扩展名为".bmp" 且不是位图的文件.现在我无法找到一个不涉及特殊套管的解决方案:

  • bmp - 使用TBitmap.Canvas.
  • wmf/emf:使用TMetafileCanvas.
  • 等等

你知道对我有什么想法吗?

delphi canvas image save delphi-2007

7
推荐指数
1
解决办法
7084
查看次数

使用Delphi自定义预览对话框

我需要在Windows 7/Vista的文件打开对话框中预览多种CAD格式.在过去,我使用了Delphi Preview Open Dialog,我可以注册并实现我必须预览的CAD格式.我发现了一些关于如何在Vista中创建预览处理程序的文章,遗憾的是这对我不起作用.我想知道是否有一种方法可以抓住我创建的对话框的IPreviewHandler接口

delphi preview pane topendialog windows-vista

6
推荐指数
1
解决办法
2765
查看次数

fsStayOnTop 表单隐藏的模态表单

我有一个表单(下面示例中的 TBigForm),它允许操作一些复杂的数据并需要显示其他信息。我将此信息放入 fsStayOnTop 表单(示例中为 OnTopForm)中,以确保它始终可见,但可以在必要时移开。现在,当 TBigForm 中的某些用户操作显示模式表单时,它通常会隐藏在 OnTopForm 后面,这使得应用程序看起来冻结。我怎样才能避免这种情况?(搜索产生了很多很多的结果,但我无法从中提炼出解决方案。)

在我的真实应用程序中,有很多地方显示模式表单,因此我想避免更改所有这些调用。

示例:创建一个新的 VCL 应用程序,在 Form1 上放置一个 TButton,双击该按钮,并将生成的 Button1Click 实现存根替换为以下内容:

type
  TBigForm = class(TForm)
  strict private
    OnTopForm: TForm;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  protected
    procedure DoHide; override;
    procedure DoShow; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

{ TBigForm }

procedure TBigForm.Button1Click(Sender: TObject);
begin
  ShowMessage('Test');
end;

constructor TBigForm.Create(AOwner: TComponent);
begin
  inherited CreateNew(AOwner);

  Caption := 'Big form';
  WindowState := wsMaximized;

  Button1 := TButton.Create(Self);
  Button1.Parent := Self;
  Button1.Caption := 'Freeze!';
  Button1.SetBounds(10, 10, 100, 100); …
Run Code Online (Sandbox Code Playgroud)

delphi modal-dialog stayontop

6
推荐指数
1
解决办法
5105
查看次数

Delphi:如何本地化菜单快捷方式的描述?

有没有办法让像一个快捷的本地化描述Ctrl+ Z,使我得到" Ctrl+ Z",如果应用程序在英文系统和"上运行Strg+ Z"在德语系统上?

VCL函数ShortCutToText未国际化.API函数GetKeyNameText有点好但仍然不完美:如果将德语XP的区域设置切换为英语(美国),它仍会生成德语文本.除了结果是资本,这是丑陋的.

澄清:我知道如何用自定义版本替换ShortCutToText或Smkc*资源字符串.但要使用它我需要翻译的字符串.我想从OS(或类似的)获得这些.

更新:看起来微软希望开发人员自己进行翻译 - 请参阅2. 将菜单项与加速键关联.引用:

例如,要将CTRL + O分配给"文件"菜单上的"打开"命令,可以修改菜单项的标题,使其如下所示:

打开\ TCTRL + O

菜单编辑器中的菜单项会在您键入时更新以反映新标题.

请注意,快捷方式将手动附加到标题.

delphi localization keyboard-shortcuts shortcut internationalization

6
推荐指数
1
解决办法
1311
查看次数

Delphi/Win32的虚拟库接口?

我读了这篇文章,发现虚拟库接口的概念很适合运行时加载DLL.但是它们似乎不适用于Win32.这是真的?如果是这样:为什么?我没有看到将这个想法与.NET联系起来的原因.

编辑:我在这里大部分都是罗伯已经写过的.:-)
我不是在插件或类似之后 - 它是关于普通的旧Win32 DLL.让我感兴趣的是让编译器处理在运行时加载DLL的所有细节的想法 - 不需要为DLL中的每个函数调用GetProcAddress等.

delphi

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

接口方法作为事件处理程序

是否可以在 Delphi 2007 中使用接口方法作为事件处理程序?简单版本不起作用:

type
  TMyEvent = procedure of object;

  IMyInterface = interface
    procedure Handler;
  end;

  TMyClass = class(TInterfacedObject, IMyInterface)
  public
    procedure Handler;
  end;

var
  ev: TMyEvent;
  obj: TMyClass;
  intf: IMyInterface;
begin
  obj := TMyClass.Create;
  intf := obj;
  ev := obj.Handler; // compiles
  ev := intf.Handler; // <== Error E2010 (incompatible types)
end.
Run Code Online (Sandbox Code Playgroud)

将错误添加@Addr更改为 E2036(需要变量)。

更新:这个

procedure IntRefToMethPtr(const IntRef; var MethPtr; MethNo: Integer);
type
  TVtable = array[0..999] of Pointer;
  PVtable = ^TVtable;
  PPVtable = ^PVtable; …
Run Code Online (Sandbox Code Playgroud)

delphi interface event-handling delphi-2007

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

VCLZip:zip文件中的"虚拟"目录

我们有被分成不同类别的文件,说CatA... CatD.每个类别都有一个可由用户配置的关联文件夹.例如CatAC:\Path\To\CatA,CatBC:\Path\To\CatBCatCCatDC:\Path\To\CatCD.

现在我想根据类似的规范在zip文件中备份和恢复这些文件

[CatA]
SomeFile.abc
*.txt

[CatB]
File3.xyz
File4.xyz
.
.
.
Run Code Online (Sandbox Code Playgroud)

生成的zip文件应该具有类似的结构

CatA
  SomeFile.abc
  aaa.txt
  bbb.txt
  ccc.txt
CatB
  File3.xyz
  File4.xyz
.
.
.
Run Code Online (Sandbox Code Playgroud)

我通过与VCLZip管理这个的电话ZipUnZip(Selected)每工作方法有点两轮牛车与路径名属性.但是我更喜欢一次调用Zip/ UnZip(Selected)以便VCLZip可以更准确地计算整体进度,并且我得到一个不那么紧张的进度条.

我能够通过(ab)使用TVCLUnzip.FilesList.Objects属性来实现这一点,将每个文件类别信息"转移"到一个OnStartZip我可以操作的处理程序中ZipHeader.directory,但这看起来太复杂和脆弱,所以我希望有一个更简单的解决方案,我只是没有看到.有任何想法吗?

delphi zip unzip delphi-2007 vclzip

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

在长期任务中保持应用响应

我们的应用程序中的某个表单显示模型的图形视图.用户可以在其他东西的负载中启动模型的转换,这可能需要相当长的时间.有时在没有任何用户交互的情况下进行该转换,在其他时候需要频繁的用户输入.虽然它会持续,但应禁用UI(仅显示进度对话框),除非需要用户输入.

可能的方法:

  1. 忽略这个问题,只需将转换代码放在一个过程中并调用它.不好,因为在转换需要一些时间但不需要用户输入的情况下应用程序似乎挂起.
  2. 使用回调来填充代码:这是突兀的 - 你必须在转换代码中加入大量这些调用 - 以及不可预测的 - 你永远无法确定你找到了正确的位置.
  3. 使用Application.ProcessMessages填充代码:与回调相同的问题.此外,您还可以获得ProcessMessages的所有问题.
  4. 使用线程:这使我们免于2.和3的"突兀和不可预测"部分.然而,由于用户输入所需的"编组",它需要做很多工作 - 调用Synchronize,将所需的任何参数放入定制的记录等.这也是调试和容易出错的噩梦.

//编辑:我们当前的解决方案是一个线程.然而,由于用户输入,这是一个痛苦的**.在很多例程中可能会有很多输入代码.这让我感觉线程不是正确的解决方案.

我将自己进行尴尬并发布我生成的GUI和工作代码的混合组合的大纲:

type
  // Helper type to get the parameters into the Synchronize'd routine:
  PGetSomeUserInputInfo = ^TGetSomeUserInputInfo;
  TGetSomeUserInputInfo = record
    FMyModelForm: TMyModelForm;
    FModel: TMyModel;
    // lots of in- and output parameters
    FResult: Boolean;
  end;

{ TMyThread }

function TMyThread.GetSomeUserInput(AMyModelForm: TMyModelForm;
  AModel: TMyModel; (* the same parameters as in TGetSomeUserInputInfo *)): Boolean;
var
  GSUII: TGetSomeUserInputInfo;
begin
  GSUII.FMyModelForm := AMyModelForm;
  GSUII.FModel := AModel;
  // …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading callback

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

有没有一种简单的方法来克隆字符串数组?

我有一个数组声明为:

const A: array[0..3] of ShortString = (
  'Customer',
  'Supplier',
  'Stock',
  'GL'
);

var B: array of ShortString;
Run Code Online (Sandbox Code Playgroud)

我想将字符串数组A克隆到另一个数组B.使用移动或复制功能不起作用.有没有使用for循环克隆数组的快速简便方法?

arrays delphi

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

功能应该回归价值问题

给定这样的功能

bool RequestStatus()
{
    ...
    if (code == myCode) {
         return true;
    } else {
         return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器会抱怨"函数应该返回值".除非我遗漏了什么,否则它怎么能不归还真或假?是因为myCode的值是运行时相关的,所以编译器在逻辑路径上不确定?

c++ return-value c++builder-5

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