在我的应用程序中使用 Tmemo,允许用户输入笔记,我发现在编辑文本或使用退格键时,会发生非常奇怪的事情。
例如,无法将光标移动到文本的末尾,或者删除单词的某些字母,在这种情况下,文本将完全被其他意想不到的单词替换。我发布了一段视频,展示了这种奇怪的行为。
不知道有没有相关性,但是当文本来自键盘提供的语音听写,或者文本是由软键盘的预测建议选择的单词组成时,问题似乎更明显.
这个问题在旧版本的 Delphi (Xe 10.1) 中已经存在,但是通过修改一些 pas 文件并将 calssex 文件替换为在网上找到的新 classex.dex 来解决。
现在我正在使用 Delphi 10.4 Sydney patch3
经过测试
无论如何,我也附上了一个测试的来源,在那里可以看到Tmemo的奇怪行为。
我还在 Embarcadero 质量支持 ( RSP-31362 )上开了一张票
视频(链接在这里)
源代码(链接在这里)
我在 Embarcadero 质量支持RSP-31134 的另一张票中发现了同样的问题
我遇到了 delphi XE3 编译器的一些奇怪行为(我为 x86 架构编译)。
想象一下,我有一个包含一个字段的类 - 具有多个简单类型字段的自定义记录:
TPage = class
type
TParagraph = record
public
FOwner: TPage;
FFirst: Integer;
FSecond: Integer;
procedure Select;
end;
public
FSelected: TParagraph;
end;
procedure TPage.TParagraph.Select;
begin
FOwner.FSelected:=Self;
end;
Run Code Online (Sandbox Code Playgroud)
逻辑是我的页面可以包含多个段落,在某些时候我希望选择其中一个段落(以便能够在程序的其他部分中使用它执行一些操作):
procedure TMainForm.Button1Click(Sender: TObject);
var
lcPage: TPage;
lcParagraph: TPage.TParagraph;
begin
lcPage:=TPage.Create;
try
<...>
lcParagraph.FOwner:=lcPage;
lcParagraph.FFirst:=1;
lcParagraph.FSecond:=2;
lcParagraph.Select;
<...>
finally
lcPage.Free;
end;
Run Code Online (Sandbox Code Playgroud)
当我的记录不超过一定大小时,一切都可以。一个引用和两个整数就可以了,在这种情况下,我得到如下汇编指令:
MainUnit.pas.350: FOwner.FSelected:=Self;
00C117B3 8B45FC mov eax,[ebp-$04]
00C117B6 8B00 mov eax,[eax]
00C117B8 8B55FC mov edx,[ebp-$04]
00C117BB 8B0A mov ecx,[edx]
00C117BD 894804 mov [eax+$04],ecx
00C117C0 …
Run Code Online (Sandbox Code Playgroud) 我注意到 Delphi 中支持一些表情符号和特殊字符作为变量名称,例如
\n\nvar\n \xe2\x9d\xa4 : string;\n \xe2\x85\x96 : double;\nbegin\n \xe2\x9d\xa4 := 'My heart';\n ShowMessage(\xe2\x9d\xa4);\n \xe2\x85\x96 := 0.4;\n ShowMessage(\xe2\x85\x96.ToString);\nend;\n
Run Code Online (Sandbox Code Playgroud)\n\n有谁知道可以使用的有趣字符的完整列表吗?\n可以通过Win+[.](Windows 键加点)在 Win10 中调出表情符号字符。
\n当在 VCL 控件上调用 TRttiContext.GetType 时,为什么某些属性会重复(例如Action
和Align
),而其他属性则不会 ( AlignWithMargins
)?
uses
System.RTTI,
System.Generics.Collections,
System.Generics.Defaults;
//....
procedure TForm11.btnShowPropertiesClick(Sender: TObject);
var
R: TRttiContext;
Props: TArray<TRttiProperty>;
Prop : TRttiProperty;
begin
memo1.Clear;
R := TRttiContext.Create;
Props := R.GetType(Sender.ClassType).GetProperties;
//Sort properties by name
TArray.Sort<TRttiProperty>(props,
TComparer<TRttiProperty>.Construct(
function(const Left, Right: TRttiProperty): Integer
begin
result := CompareText(Left.Name, Right.Name);
end
)
);
for prop in Props do
begin
try
Memo1.Lines.Add(
Prop.Name + ' : ' +
Prop.PropertyType.ToString + ' = ' +
Prop.GetValue(Sender).ToString);
except
Memo1.Lines.Add(Prop.Name + ' …
Run Code Online (Sandbox Code Playgroud) 我在 Delphi 10.4 上。
我正在寻找一种在任务栏上的应用程序图标上动态插入数字的方法,以便用户可以知道到目前为止应用程序完成了多少任务。这将是动态的,只要应用程序执行新任务,它就会增加图标的数量。
类似于下图。
这可能吗 ?
我没有任何代码可以在这里发布,因为我不知道如何做到这一点。
在阅读Delphi中匿名方法的文档时,我开始怀疑。我一直使用这样的东西:
type TMathFn = Function(A, B: Integer): Integer;
var fn: TMathFn;
Run Code Online (Sandbox Code Playgroud)
一直为我工作。但是这个文件告诉我改用这个:
type TMathFn = Reference to Function(A, B: Integer): Integer;
var fn: TMathFn;
Run Code Online (Sandbox Code Playgroud)
因为我从 1994 年到 2010 年一直在 Delphi 中进行开发,所以我对这个“参考”部分有点陌生。尽管如此,这两个选项似乎工作相同。所以……
它们是一样的吗?
我正在尝试制作自己的组件,其主题与应用程序的其余部分相同(主题在 中设置Project > Options > Application > Appearance
)。
该控件源自TWinControl
(下图红框中)。如何将应用程序主题应用到我的组件?我将在上面使用很多标准控件,如按钮、编辑等。
我试图在谷歌中找到一些东西,但也许我的英语是问正确问题的问题:)
在 Delphi 10.4 中,当尝试使用Winapi.ShLwApi.StrFormatByteSize64
将Int64
文件大小值转换为格式化字符串时,出现运行时错误:
var
ThisSize: Int64;
pszBuf: PWideChar;
cchBuf: Cardinal;
Winapi.ShLwApi.StrFormatByteSize64(ThisSize, pszBuf, cchBuf);
Run Code Online (Sandbox Code Playgroud)
错误信息:
--------------------------- MyApp.exe - 未找到入口点
--------------- ------------ 在 DLL "C:\DELPHI\MyApp\Win32\Debug\MyApp.exe" 中找不到过程入口点 "StrFormatByteSize64W"。
- - - - - - - - - - - - - - 好的
如何解决这个问题呢?
在 Windows 10 x64 中的 Delphi 10.4.2 Win32 VCL 应用程序中,我使用此代码以编程方式为弹出菜单项上的 DELETE 键创建快捷方式字符串:
mGalleryDeleteSelected.Caption := mGalleryDeleteSelected.Caption + #9 + MyShortcutToString(VK_DELETE, []) + ' ';
Run Code Online (Sandbox Code Playgroud)
这是源代码:
function MyGetKeyName(AKey: Integer): string;
var
name: array[0..128] of Char;
begin
FillChar(name, SizeOf(name), 0);
GetKeyNameText(MapVirtualKey(AKey, 0) shl 16, @name[0], Length(name));
Result := name;
end;
function MyModifierVirtualKey(AModifier: Integer): Integer;
begin
case AModifier of
Ord(ssShift):
Result := VK_SHIFT;
Ord(ssCtrl):
Result := VK_CONTROL;
Ord(ssAlt):
Result := VK_MENU;
else
Result := 0;
end;
end;
function MyShortcutToString(AKey: Integer; AShiftState: TShiftState = []): …
Run Code Online (Sandbox Code Playgroud) delphi ×10
android ×1
delphi-xe3 ×1
filesize ×1
firemonkey ×1
icons ×1
rtti ×1
vcl ×1
winapi ×1
windows ×1