我有一个例程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" 且不是位图的文件.现在我无法找到一个不涉及特殊套管的解决方案:
TBitmap.Canvas.TMetafileCanvas.你知道对我有什么想法吗?
我需要在Windows 7/Vista的文件打开对话框中预览多种CAD格式.在过去,我使用了Delphi Preview Open Dialog,我可以注册并实现我必须预览的CAD格式.我发现了一些关于如何在Vista中创建预览处理程序的文章,遗憾的是这对我不起作用.我想知道是否有一种方法可以抓住我创建的对话框的IPreviewHandler接口
我有一个表单(下面示例中的 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) 有没有办法让像一个快捷的本地化描述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
我读了这篇文章,发现虚拟库接口的概念很适合运行时加载DLL.但是它们似乎不适用于Win32.这是真的?如果是这样:为什么?我没有看到将这个想法与.NET联系起来的原因.
编辑:我在这里大部分都是罗伯已经写过的.:-)
我不是在插件或类似之后 - 它是关于普通的旧Win32 DLL.让我感兴趣的是让编译器处理在运行时加载DLL的所有细节的想法 - 不需要为DLL中的每个函数调用GetProcAddress等.
是否可以在 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) 我们有被分成不同类别的文件,说CatA... CatD.每个类别都有一个可由用户配置的关联文件夹.例如CatA去C:\Path\To\CatA,CatB到C:\Path\To\CatB和CatC和CatD去C:\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管理这个多的电话Zip和UnZip(Selected)每工作方法有点两轮牛车与路径名属性.但是我更喜欢一次调用Zip/ UnZip(Selected)以便VCLZip可以更准确地计算整体进度,并且我得到一个不那么紧张的进度条.
我能够通过(ab)使用TVCLUnzip.FilesList.Objects属性来实现这一点,将每个文件类别信息"转移"到一个OnStartZip我可以操作的处理程序中ZipHeader.directory,但这看起来太复杂和脆弱,所以我希望有一个更简单的解决方案,我只是没有看到.有任何想法吗?
我们的应用程序中的某个表单显示模型的图形视图.用户可以在其他东西的负载中启动模型的转换,这可能需要相当长的时间.有时在没有任何用户交互的情况下进行该转换,在其他时候需要频繁的用户输入.虽然它会持续,但应禁用UI(仅显示进度对话框),除非需要用户输入.
可能的方法:
//编辑:我们当前的解决方案是一个线程.然而,由于用户输入,这是一个痛苦的**.在很多例程中可能会有很多输入代码.这让我感觉线程不是正确的解决方案.
我将自己进行尴尬并发布我生成的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) 我有一个数组声明为:
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循环克隆数组的快速简便方法?
给定这样的功能
bool RequestStatus()
{
...
if (code == myCode) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
为什么编译器会抱怨"函数应该返回值".除非我遗漏了什么,否则它怎么能不归还真或假?是因为myCode的值是运行时相关的,所以编译器在逻辑路径上不确定?
delphi ×9
delphi-2007 ×3
arrays ×1
c++ ×1
c++builder-5 ×1
callback ×1
canvas ×1
image ×1
interface ×1
localization ×1
modal-dialog ×1
pane ×1
preview ×1
return-value ×1
save ×1
shortcut ×1
stayontop ×1
topendialog ×1
unzip ×1
vclzip ×1
zip ×1