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:=''无论何时声明字符串。只是你总是在某个时候分配它。