Delphi中的TJClipboardManager
我正在尝试使用以下命令复制选定的文本:Delphi中的TJClipboardManager,delphi,Delphi,我正在尝试使用以下命令复制选定的文本: uses Androidapi.Helpers, Androidapi.jni , AndroidAPI.JNIBridge, Androidapi.JNI.JavaTypes, FMX.Helpers.Android, Androidapi.JNI.GraphicsContentViewText; procedure TForm2.Button5Click(Sender: TObject); var myclipboard : JC
uses
Androidapi.Helpers, Androidapi.jni , AndroidAPI.JNIBridge,
Androidapi.JNI.JavaTypes, FMX.Helpers.Android,
Androidapi.JNI.GraphicsContentViewText;
procedure TForm2.Button5Click(Sender: TObject);
var
myclipboard : JClipboardManager;
s: string;
begin
myclipboard := TJClipboardManager.create;
myclipboard.getText;
showmessage(BoolToStr(myclipboard.hasText));
end;`
Java中有很多示例,但我还不足以理解它您不应该直接实例化
ClipboardManager
类,而是使用Content.getSystemService()
方法来获得正确的管理器对象。Android文档甚至这样说:
您不直接实例化这个类;相反,通过getSystemService(类)检索它
因此,您必须这样做:
function GetClipboardManager: JClipboardManager;
var
obj: JObject;
begin
obj := SharedActivityContext.getSystemService(TJContext.JavaClass.CLIPBOARD_SERVICE);
if Assigned(obj) then
Result := TJClipboardManager.Wrap((obj as ILocalObject).GetObjectID)
else
Result := nil;
end;
procedure TForm2.Button5Click(Sender: TObject);
var
myclipboard : JClipboardManager;
begin
myclipboard := GetClipboardManager;
if Assigned(myclipboard) then
begin
//...
end;
end;
请注意,根据您运行的Android版本,Context.getSystemService(剪贴板_服务)
将返回(蜂巢+)或对象。不知道Delphi处理得如何,如果有的话。您必须查看JClipboardManager
的声明,以查看它正在访问哪一个。后者在Android API级别11中被弃用
Embarcadero希望您使用FMX的跨平台界面:
uses
FMX.Platform, System.Rtti;
procedure TForm2.Button5Click(Sender: TObject);
var
Clipboard: IFMXClipboardService;
value: TValue;
hasText: boolean;
s: string;
begin
hasText := False;
if PlatformServices.Current.SupportsPlatformService(IFMXClipboardService, IInterface(Clipboard)) then
begin
value := Clipboard.GetClipboard;
hasText := value.TryAsType<String>(s);
end;
ShowMessage(BoolToStr(hasText));
if hasText then ShowMessage(s);
end;
使用
平台,系统,Rtti;
程序TForm2.按钮5点击(发送方:TObject);
变量
剪贴板:IFMXClipboardService;
价值:TValue;
hasText:布尔型;
s:字符串;
开始
hasText:=假;
如果PlatformServices.Current.SupportsPlatformService(IFMXClipboardService,IInterface(剪贴板)),则
开始
值:=Clipboard.GetClipboard;
hasText:=value.TryAsType;
结束;
ShowMessage(BoolToStr(hasText));
如果是hasText,则显示消息;
结束;
您是否尝试将myclipboard声明为TJClipboardManager
而不是JClipboardManager
?是的,结果:[DCC错误]Unit2.pas(86):E2010不兼容类型:“TJClipboardManager”和“JClipboardManager”使用平台服务您不能使用未初始化的局部变量s
;o) string
变量由编译器自动初始化。但这是一个坏习惯,也是一个不好的例子。@DavidHeffernan:为什么让编译器自动初始化声明为编译器管理的数据类型的变量是一个坏习惯?大多数Delphi开发人员都知道string
是编译器管理的数据类型之一。你真的是那种明确地写s:=''的人吗
无论在哪里声明字符串
变量?函数返回值会让它变得更有趣。它们看起来也将被初始化。但这取决于呼叫现场的情况。我知道这不是一个返回值,但如果您选择您的路径,那么您最终会得到一个包含多个例外子句的规则。在这种情况下,我更愿意直截了当,更详细一点。这并不意味着你总是写s:=''代码>无论何时声明字符串。只是你总是在某个时候分配它。