标签: delphi-xe5

从Delphi XE5开始,如何以向后兼容的方式使用基于0的字符串?

我正在尝试将我当前的Delphi 7 Win32代码转换为Delphi XE5 Android,只需要很少的更改,这样我的项目就可以从一系列Delphi版本和XE5的Android交叉编译到Win32.

从XE5开始,针对未来的语言会发生重大变化.其中一个变化是从零开始的字符串.

在具有基于1的字符串的旧版本中,以下代码是正确的:

function StripColor(aText: string): string;
begin
  for I := 1 to Length(aText) do
Run Code Online (Sandbox Code Playgroud)

但现在这显然不对.建议的解决方案是使用:

for I := Low(aText) to High(aText) do
Run Code Online (Sandbox Code Playgroud)

这样,XE5 Win32处理基于1的字符串,而XE5 Android处理基于0的字符串.但是有一个问题 - 以前的Delphi版本(例如XE2)在这样的代码上输出错误:

E2198 Low cannot be applied to a long string
E2198 High cannot be applied to a long string
Run Code Online (Sandbox Code Playgroud)

我有很多字符串操作代码.我的问题是 - 如何修改和保持上面的代码可以在Delphi 7 Win32和Delphi XE5 Android中编译?

PS我知道我仍然可以在XE5中禁用ZEROBASEDSTRINGS定义,但这是不受欢迎的解决方案,因为在XE6中,这个定义可能会消失,并且所有字符串都将被强制为0.

delphi delphi-7 delphi-xe5

18
推荐指数
2
解决办法
3882
查看次数

如何在Android中使用Delphi XE5发送短信

有谁知道如何让这个工作?我得到的最接近的是下面的代码,但没有成功.首先,当它告诉您需要SEND_SMS许可时,它会给您一些希望.但在您设置此权限后,没有任何反应!

uses
 Androidapi.JNI.JavaTypes;

procedure TForm1.Button1Click(Sender: TObject);
var
  smsManager: JSmsManager;
  smsTo, smsFrom: JString;
begin
  smsManager:= TJSmsManager.JavaClass.getDefault;
  smsTo:= StringToJString('552199999999'); //replace with the right destination number
  smsFrom:= StringToJString('552499999999'); //replace with the right originator number
  smsManager.sendTextMessage(smsTo, smsFrom, StringToJString(Edit1.Text), nil, nil);
end;
Run Code Online (Sandbox Code Playgroud)

delphi sms android firemonkey delphi-xe5

17
推荐指数
1
解决办法
1万
查看次数

Delphi XE5从右到左的语言不会出现在android中

正如标题所说,来自RTL语言(如波斯语或阿拉伯语)的文本在android中没有表现出来,例如"سلام"这个词显示为"مالس".即使在文本输入(我认为它们是本机和本机android文本框支持)这个问题发生了有没有办法解决这个问题?

delphi android firemonkey delphi-xe5

17
推荐指数
2
解决办法
3071
查看次数

Embarcadero XE5中的Android NFC

尝试在Embarcadero XE5中使用NFC在Android上运行.从以下内容开始:https://forums.embarcadero.com/thread.jspa?threadID = 97574 ,它们似乎正在运行.现在想注册NFC Intent的回调

Java方法:

1. Register current activity as a listener
...
2. Receive Intent
@Override
protected void onNewIntent(Intent intent) {
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        NdefMessage[] msgs = NfcUtils.getNdefMessages(intent);
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://www.jessechen.net/blog/how-to-nfc-on-the-android-platform/

德尔福方法(我想象):

1. Define methods available in Java interface
Run Code Online (Sandbox Code Playgroud)

来源:https://forums.embarcadero.com/thread.jspa?messageID = 634212

Question:
How do I register a listener for NFC intent messages and 
how do I eventually get messages?
Run Code Online (Sandbox Code Playgroud)

我的猜测是调用enableForegroundDispatch方法.定义如下:

procedure enableForegroundDispatch; cddcl;
Run Code Online (Sandbox Code Playgroud)

从Android API调用它 …

delphi android nfc delphi-xe5

17
推荐指数
1
解决办法
1442
查看次数

应用程序需要很长时间来同步线程(或根本没有)

我在Delphi XE5(iOS和Android)中使用REST组件.我目前正在通过iOS模拟器进行测试,我的应用程序经常挂在我的代码中的以下行:

R_Request.Execute;
Run Code Online (Sandbox Code Playgroud)

经过一些调试后,我发现它专门挂在REST.Client.PAS中的这行代码中:

HandleEvent(DoAfterExecute);
Run Code Online (Sandbox Code Playgroud)

看起来像:

procedure TCustomRESTRequest.HandleEvent(AEventHandler: TMethod);
begin
  // Handle Synchronized if we are NOT already in the main thread
  // NEVER call synchronize on the MainThread - that might shift the island!
  if SynchronizedEvents and (System.MainThreadID <> TThread.CurrentThread.ThreadID) then
    TThread.Synchronize(TThread.CurrentThread, AEventHandler) // FAILS HERE
  else
    AEventHandler;
end;
Run Code Online (Sandbox Code Playgroud)

它要么不在.Synchronize中返回线程,要么花费很长时间(大约5分钟)...它在调试时工作了一次,但是从现在开始一直没有(30分钟后,在设置之后) 5分钟返回一个帖子).

救命 ?或者至少任何人都可以给我的方向感?

再次,开发iOS和Android(所以FMX ...),目前正在通过iOS模拟器进行测试.谢谢 !

delphi multithreading delphi-xe5

16
推荐指数
1
解决办法
1118
查看次数

如何处理(Delphi)Android应用程序中的后退按钮?

如何让我的Android应用程序对后退按钮作出反应?

有没有什么东西可以作为高级VCL的TApplicationEvents来处理它,或者我是否需要深入研究低级Android特定的东西?

现在,大多数演示应用程序都有一个屏幕后退按钮,可以返回上一个屏幕.按下psysical按钮似乎总是退出应用程序,在某些情况下会导致访问冲突.

delphi android back-button delphi-xe5

15
推荐指数
3
解决办法
2万
查看次数

在Delphi XE5编译设置中,"有限调试信息"和"调试信息"之间有什么区别

用于Win32的Delphi XE5编译器具有调试信息的新设置:有限调试信息.

有限调试信息调试信息有什么区别?

delphi delphi-xe5

14
推荐指数
1
解决办法
468
查看次数

如何使用Delphi XE5在Android上访问OpenGL渲染上下文?

在使用Delphi XE5开发应用程序时,如何在Android设备上创建OpenGL渲染上下文?

基本上我不知道从哪里开始.还没有OpenGL示例.

我期望存在的东西:

  • 某种事件(Panel.OnRender)将提供我可以调用OpenGL调用的现有上下文.

  • 可以放在表单设计器中的通用TOpenGLSurface控件

  • 一种在运行时在主窗体上创建上下文的方法.

从我迄今为止的研究中我可以TWindowManager.Render访问OpenGL调用并使用它们来渲染弹出窗口.

编辑:向表单添加一个计时器并调用此过程用绿色填充屏幕,这意味着GL上下文已经存在:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  glClearColor(0, 1, 0, 0);
  glClear(GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface);
end;
Run Code Online (Sandbox Code Playgroud)

问题是 - 如何正确处理它,在受控环境中对Timer进行渲染绝对是一个坏主意.

delphi android opengl-es delphi-xe5

13
推荐指数
1
解决办法
1973
查看次数

Android上的Delphi XE5串口

任何人都知道如何使用delphi XE5访问android中的串口?我正在使用带有android 4.1的Cubieboard

delphi android serial-port delphi-xe5

13
推荐指数
1
解决办法
5072
查看次数

用TArray <XXX>替换XXX数组是否安全

我有很多变量声明为

var
  Something: array of XXX;
begin
  SetLength(Something, 10);
  try
    ...
  finally
    SetLength(Something, 0);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

将它们替换为安全的范围:

var
  Something: TArray<XXX>;
begin
  SetLength(Something, 10);
  try
    ...
  finally
    SetLength(Something, 0);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

arrays delphi generics dynamic-arrays delphi-xe5

13
推荐指数
2
解决办法
1928
查看次数