在 VCL (Delphi 2010) 中,我使用这个函数来检查是否按下了控制键:
function IsControlKeyPressed: Boolean;
begin
Result := GetKeyState(VK_CONTROL) < 0;
end;
Run Code Online (Sandbox Code Playgroud)
GetKeyState 是 Windows 库中的函数,我不想将它包含在我的项目中。
如何检查是否在 XE3 中为 firemonkey 应用程序按下了 control 或 shift 键?
大家早上好.
我目前正在尝试编写一个围绕通过Windows DWM API提供的功能(例如DWM缩略图)构建的小应用程序.一个这样的功能是能够从应用程序中动态选择缩略图区域,并将其放大/放大.可以通过某种"设置区域"功能从DWM执行此操作,但是我我想先尝试自己的路线,然后才能进入API.
最近我发现了Delphi的一个例子,我曾希望从演示中扩展并构建更具体的东西.我着手将代码移动到Firemonkey FM2应用程序(因为我更喜欢框架的视觉功能与VCL相比).通过一些调整,我设法将其构建,但不幸的是DWMRegisterThumbnail,尽管VCL版本运行完美,但在FMX应用程序中运行时似乎不会返回有效结果.
然后我再看了一下,决定给Hydra一个机会.我将工作的VCL示例复制到Hydra插件,并创建了Firemonkey主机应用程序.我正确设置了两个部分并进行了编译.DLL加载正确,我可以按预期看到FMX主机内的VCL插件接口.但是,在尝试查看窗口的DWM缩略图时,我再次遇到了运行非hydra FMX应用程序时遇到的相同问题.
然后我开始创建一个VCL主机应用程序,以确保它不是特定于VCL-FMX交互的问题.我编译了VCL主机,加载到VCL插件中,我再次看到VCL主机内的VCL插件.然而,我仍然发现我无法从DWM查看缩略图.显然,这不是Firemonkey-VCL交互问题.
因此,我已经得出结论,从DLL运行DWM代码是一个问题.理想情况下,我想要一个FMX主机应用程序只是因为我更容易删除TSelection缩略图,并以这种方式处理缩放(例如,非常少的代码,而不需要寻找自定义组件)提及额外的奖金,如MakeScreenshot.
所以,切入追逐; 是否可以从Hydra插件调用DWM API,和/或将DWM缩略图输出到Firemonkey表面?
我的Hydra插件中使用的代码与链接示例中使用的代码相同,我的宿主应用程序中使用的代码基于Remobject Youtube Channel上的简单示例.
我有一些代码可以绘制放置在TImage顶部的一组控件。然后,我抓住TImage的MakeScreenshot来保存文件。现在,它可以完美运行。我现在正在努力的是更改一个或多个标签/文本样式控件的字体属性。不管我尝试什么,标签都不会改变。下面是我的示例代码:
procedure TfrmSnapshot.Process;
var
LRect1, LRect2, LRect3, LRect4: TRectF;
X, Y, W, H: Integer;
begin
//
X := Round(Label1.Position.X);
Y := Round(Label1.Position.Y);
W := Round(X + Label1.Width);
H := Round(Y + Label1.Height);
LRect1.Create(X, Y, W, H);
X := Round(Label2.Position.X);
Y := Round(Label2.Position.Y);
W := Round(X + Label2.Width);
H := Round(Y + Label2.Height);
LRect2.Create(X, Y, W, H);
X := Round(Label3.Position.X);
Y := Round(Label3.Position.Y);
W := Round(X + Label3.Width);
H := Round(Y + Label3.Height);
LRect3.Create(X, Y, W, H);
X := Round(Rect1.Position.X);
Y …Run Code Online (Sandbox Code Playgroud) 有没有办法只通过名称动态创建表单; 这个概念是这样的.我有一个主窗体,通过一些用户选择,必须创建一些预定义的窗体并停靠在主窗体上的pagecontols上的tabitems上.我知道表单的名称,我知道何时创建其中的每一个,但我想知道是否有更好的方法通过单个过程调用创建这些表单,并且我的代码中没有所有这些信息.
它的Delphi XE3 firemonkey,获胜7.
在此先感谢您的帮助
我不知道这只是我遗漏了什么,但我对此问题感到非常沮丧.
当我尝试设置.color属性时,没有可用的值,例如claBlue.
例如:
Canvas.Stroke.Color := claBue.
Run Code Online (Sandbox Code Playgroud)
我错过了参考吗?我已经包括FMX.Types.
我正在测试一些增强的字符串相关函数,我试图使用它作为一种复制字符串的方法,以便更快,更有效地使用而无需深入研究指针.
在测试用于从TStringList创建分隔字符串的函数时,我遇到了一个奇怪的问题.当编译器为空时,编译器引用了索引中包含的字节,并且当通过move添加字符串时,索引引用了包含的字符.
这是一个小型缩小的准系统代码示例: -
unit UI;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Layouts,
FMX.Memo;
type
TForm1 = class(TForm)
Results: TMemo;
procedure FormCreate(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function StringListToDelimitedString
( const AStringList: TStringList; const ADelimiter: String ): String;
var
Str : String;
Temp1 : NativeInt;
Temp2 : NativeInt;
DelimiterSize : Byte;
begin
Result := ' ';
Temp1 := 0;
DelimiterSize := Length ( ADelimiter ) * 2;
for Str in AStringList …Run Code Online (Sandbox Code Playgroud) 我在Firemonkey中为TMemo添加了一行,我希望当有更多行可以在TMemo中显示时,添加的行被滚动到视图中.我找不到怎么做.我试过了
Display.Lines.Add (arg);
Caret.Line := Display.Lines.Count - 1;
Caret.Pos := 0;
Display.CaretPosition := Caret;
Run Code Online (Sandbox Code Playgroud)
但这没有帮助.帮助非常有限,所以我不确定我在这里做什么.
更新
在尝试受访者的代码时,我注意到我测试了代码示例错误.我为此道歉,我唯一的理由是,当我编写并测试代码时,它已接近午夜了.上面的代码确实有效.我删除了Display.CaretVisible := True;原始代码中的语句,因为这不会影响我想要的行为.
我正在尝试确定按钮的OnKeyDown中按下的键(FMX,XE3),但我目前发现自己无法区分小键盘键和常规键...
根据我按下的键,我可以使用Key或KeyChar找出已按下的键.例如,按下F1发送112和#0,这样我就可以使用VkCode,按下A发送0和'a',这样我就可以使用'a'.KeyChar在很多情况下都是#0显然是有意义的,但是如果KeyChar存在,我无法理解为什么Key被设置为0.
function GetCharFromVirtualKey(Key: Word): string;
var Buffer: array[0..255] of Char;
ScanCode: Cardinal;
begin
if Key = VK_PAUSE
then ScanCode := $45 shl 16
else ScanCode := MapVirtualKey(Key, 0) shl 16;
if Key in [33..46, 91..93, 108, 111, 144, 163, 165]
then ScanCode := ScanCode + $1000000;
GetKeyNameText(ScanCode, Buffer, SizeOf(Buffer));
result := Buffer;
end;
procedure TMyForm.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
var test: string;
begin
if (KeyChar <> #0) then Key := …Run Code Online (Sandbox Code Playgroud) 当用户登录到服务器并且服务器发送与用户名/密码匹配结果相关的响应时,我遇到此错误.具有回复数据包的数组导致错误.我不知道如何解决这个问题,这是我第一次看到这样的错误.
procedure TAgUDP.ProcessLoginPacket
( const APacket : TBytes; const ABinding : TIdSocketHandle );
var
Username : String;
Password : String;
Index : WORD;
ID : TGUID;
Reply : TBytes;
Peer : TAgUDPSPeer;
begin
// Extracting Username
SetLength ( Username, APacket [LI_LNUN] );
Index := 5 + HEADER_END + ( APacket [LI_LNIP] * 2 );
Move ( APacket [Index], Username [1], APacket [LI_LNUN] * 2 );
// Checking whether the peer is already connected
if not Assigned ( fClientsList.FindPeer …Run Code Online (Sandbox Code Playgroud) delphi ×9
delphi-xe3 ×4
firemonkey ×4
dwm ×1
fastmm ×1
fonts ×1
keyboard ×1
remobjects ×1
tmemo ×1
windows ×1