DelphiXE7学习笔记Word格式文档下载.docx
《DelphiXE7学习笔记Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DelphiXE7学习笔记Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
3、在Form3上,Close;
4、Android:
再点击Form2上的TEdit控件,输入法不会弹出!
Windows:
Form1遮挡了Form2。
三、解决方法(适用于XE6和XE7):
修改FMX.Form.pas的以下代码:
1、functionTScreen.NextActiveForm(constOldActiveForm:
TCommonCustomForm):
TCommonCustomForm;
整个函数改为如下:
functionTScreen.NextActiveForm(constOldActiveForm:
var
I,CurrIndex:
integer;
begin
Result:
=nil;
CurrIndex:
=IndexFormOfObject(OldActiveForm);
(*总是优先找到OldActiveForm的前一个窗口(Z序列中的下一层).addbycyw14.9.25*)
I:
=-1;
ifCurrIndex>
0then
=CurrIndex-1;
while(I>
=0)and(notForms[I].Visible)doDec(I);
end;
ifI=-1then//如果找不到,再依据原来的逻辑,先找OldActiveForm的最上层第1个窗口可视窗口。
(*addover*)
=FormCount-1;
=0)and(I<
>
CurrIndex)and(notForms[I].Visible)doDec(I);
if(I<
0)or(I=CurrIndex)then
=0;
while(I<
FormCount)and(I<
CurrIndex)and(notForms[I].Visible)doInc(I);
CurrIndex)then
=Forms[I];
ActiveForm:
=Result;
2、procedureTScreen.SetActiveForm(constValue:
TCommonCustomForm);
procedureTScreen.SetActiveForm(constValue:
NewActiveForm:
I:
Integer;
ifAssigned(Value)then
ifnotValue.Releasedthen
=IndexFormOfObject(Value);
ifI<
raiseEInvalidFmxHandle.Create(sArgumentInvalid);
NewActiveForm:
//下面一行的条件屏蔽bycyw14.9.25
//原因:
因为在TCommonCustomForm.Activate里调用Screen.ActiveForm:
=Self;
之前,
//已经设置了FActive:
=True。
如果这里保留条件“notNewActiveForm.Active”,
//则Value窗口的Z序列就没有更新,导致所有窗口的Z序列错乱。
if{(notNewActiveForm.Active)and}(I<
FormCount-1)then
FForms.Delete(I);
FForms.Add(NewActiveForm);
forI:
=0toFormCount-1do
if(Forms[I]<
NewActiveForm)and(notIsParent(Forms[I],NewActiveForm))then
Forms[I].Deactivate;
ifnotNewActiveForm.Activethen
NewActiveForm.Activate;
end
else
原文地址后记:
2015-04-19,XE8解决了这个问题。
DelphiXE7学习笔记
(二)Android键盘处理
(2014-09-1109:
29:
39)
转载▼
分类:
XE7带了ScrollableFormDemo例子,演示如何实现输入键盘自适应当前的输入项。
实现屏幕上下自动划动,不让输入键盘遮盖住当前正在输入的项。
例子在安装目录X:
\Embarcadero\Studio\15.0\Samples\ObjectPascal\MobileSamples\UserInterface\ScrollableForm
编译并运行这个例子,在我的Note3上,效果非常好。
在测试中,还是发现利用键盘上的隐藏键,隐藏键盘后,不触发OnVirtualKeyboardHidden事件,造成界面不能还原,如下图:
第二个演示图:
可以利用龟山的方法解决。
后记:
我试着利用Timer去触发OnVirtualKeyboardHidden,结果,应用有崩溃的时候,另外,在恢复屏的内容时,位置也计算不准,最下面的Edit在再次弹出keyBoard时也没算准,不显示。
试着用backspace键,系统是正常的,问题的实质就在于emb没有处理keyboard上的隐藏键。
功力有限,精力有限,等emb来处理吧!
再后记:
后记中利用Timer的所有问题都解决了!
感谢盒子上的wang_80919,原文在这里,改后的FMX.VirtualKeyboard.Android.pas原代码在这里。
DelphiXE7学习笔记(三)多窗体间如何调用
(2014-09-1217:
36:
10)
实作一个项目,一定由多个窗口组成的,对于Android来说,如何在A窗口中调用另外一个窗口呢?
还有一个问题,当在项目中建立多个Form时,在dpr项目文件中,默认都是自动建立Form实例的,如果一个项目的Form很多,在启动项目时会非常耗时,也就是Splash显示完后,会黑屏很长时间,为了解决这个方法,我想,好的办法就是在调用时先判断这个Form是否已经建立,没有的话,先建立,再显示。
这里有一个与Win32应用不同的是,Android不支持Form.ShowModal方法,只能使用Form.Show方法显示一个窗口。
以XE7带的范例,对他做一下修改,这个例子在目录:
C:
\Embarcadero\Studio\15.0\Samples\ObjectPascal\MobileSamples\UserInterface\Forms
1.打开项目文件:
programForms;
uses
System.StartUpCopy,
FMX.Forms,
PortraitFormin'
PortraitForm.pas'
{PForm},
LandscapeFormin'
LandscapeForm.pas'
{LSForm};
{$R*.res}
Application.Initialize;
Application.CreateForm(TPForm,PForm);
//Application.CreateForm(TLSForm,LSForm);
//把这行去掉,不在运行项目时自动建立
Application.Run;
end.
2.打开PortraitForm单元,把调用第二个窗口的代码做下改造:
procedureTPForm.FormResize(Sender:
TObject);
ifnotAssigned(LSForm)then//如果LSForm没建立则创建他.
LSForm:
=TLSForm.Create(Application);
if(Height<
Width)and(Visible)then
LSForm.Show;
OK,这样改造后,就实现了上面提到的两个问题。
本文让高手见笑了,只适合初学Delphi者,别喷我!
DelphiXE7学习笔记(四)Android输入控件自适应虚拟键盘的位置转载▼
(2014-09-2209:
27:
44)
XE7带的Demo,演示了如何适应虚拟键盘,即当虚拟键盘弹出时,如果掩盖了当前的输入项,如Edit1,那么重新计算屏上所有控件的位置,让Edit1能够正常显示在键盘上面,让用户能看到输入的内容。
问题是,键盘弹出后,如果用户利用键盘上的隐藏键,隐藏了键盘后,不能恢复屏上控件的位置,这个问题,其实XE5就存在。
要感谢盒子上FlyingWang,用他的方法,很好的解决了上面的问题:
原文在这里,改后的FMX.VirtualKeyboard.Android.pas代码在这里。
DelphiXE7学习笔记(五)FMX.Types与FMX.Forms引用次序
(2014-09-2216:
34:
19)
标签:
it
学习xe7带的VirtualKeyboardDemo例子,为了快速调试,改成win32平台,结果遇到退出程序时产生AV错误,于是开始清理代码,直到清理的只剩下建立新项目时生成的基本代码,问题还是依旧。
后对比项目的源代码,再进一步测试,结论是:
fmx.types与fmx.forms的引用次序有关,就是说要先引用fmx.forms,再引用fmx.types.
附改后的dpr的代码,被我简化并修正后的:
programVirtualKeyboardDemo;
//System.StartUpCopy,//是否引用这个单元,不影响在win32与android下切换!
FMX.Forms,//先引用,否则在win32平台下会出错.
FMX.Types,//后引用
VirtualKeyboardBasein'
VirtualKeyboardBase.pas'
{VKBaseForm};
Application.CreateForm(TVKBaseForm,VKBaseForm);
DelphiXE7学习笔记(六)TBlobStream的使用
(2014-09-2308:
19:
13)
盒子上有网友遇到问题,直接用TBlobStream来做类型转换,编译时提示无法找到这个类。
查了下源码,发现这个类已经被定义在Data.DBXDataSets单元的TDBXReaderDataSet类中。
简化的看一下,象下面这样定义:
TDBXReaderDataSet=class(TDataSet)
publictype
TBlobStream=class(TMemoryStream)
private
...
对于象上面这种方式定义的类,使用时加上引用类所在的类名就可以了。
比如:
procedureTVKBaseForm.FormCreate(Sender:
b:
TDBXReaderDataSet.TBlobStream;
//声明一个变量.
TDBXReaderDataSet.TBlobStream(b).Clear;
//做类型转换.
DelphiXE7学习笔记(七)StyleBook当公共对象使用
(2014-09-2507:
37)
分类:
一个项目,肯定要有公共对象,我就遇到如StyleBook,多个窗口都要用到他来设置窗口的显示风格,怎么办呢?
按传统的方式,用一个全局的DataModule来管理。
于是我这样:
在项目中,我建立一个TDataModule,说实话,在xe7找了半天才找到在哪建立,如下图:
然后,拖放一个StyleBook上去,再通过StyleBook选择一个显示样式,准备让所有的窗口都引用这个StyleBook,好统一所有的Form都用一个显示样式。
然后,在具体的Form上引用这个StyleBook,当然,为了引用他,首先要引用TDataModule单元,然后就可以在ObjectInspector窗口中,通过选择的方式(为了选择StyleBook,需要打开DataModule单元),设置Form1的StyleBook属性,设置完属性,Form1会利用新的样式显示,所见即所得。
如下图:
这里,存在一个问题,应算是xe7的一个bug,就是按上面,在设计期设置好Form的StyleBook,则在下次打开项目时,会产生错误:
为了规避这个问题,我们可以用代码来解决,在Form的OnCreate事件中处理,去掉在设计期对DM对象的引用。
i:
{$ifdefandroid}
self.StyleBook:
=dm.StyleBook1;
{$endif}
LinkFillControlToField1.Active:
=False;
fori:
=0to50do
ClientDataSet1.AppendRecord(['
第'
+i.ToString+'
条记录.'
i]);
=True;
处理完所有的Form,就统一其风格了!
象StyleBook一样,可以把全局对象都放到DataModule中,供项目中其他单元引用,实现对全局对象的管理了。
文中DataModule是由项目自动建立的,我们也可以控制DataModule的建立过程,实现对所有全局对象的进一步管理。
后记,XE7up1XE8,不允许放置TStyleBook,会出现错误。
那怎么做呢?
有多种方法:
1.在MainForm上放stylebook,然后设置StyleBook.UseStyleManager:
=True,这样,所有的窗口就自动使用这个StyleBook.
2.在项目源文件中,调用一个Style文件
首先发布一个style文件:
这里,远程目录为:
assets\internal\,然后在项目文件中调入:
我遇到第一种方法,会产生错误,具体情况就是进入一个特定的Form,程序就死掉了,没有错误提示,在设计期,如果设置这个Form.StyleBook=MainForm.StyleBook,会提示一个错误,本以为是个Bug,后来在朋友的帮助下,终于查到,是一个控件使用了StyleBook中不存在的StyleLookup,删除就好了.
这可是花我近一个月的时间找到的,如果帮到你,一定别忘支持一下!
DelphiXE7学习笔记(八)Android发布文件
(2014-09-2512:
37:
21)
首先利用Project->
Deployment,打开发布文件窗口,增加要发布的文件。
然后设置文件发布的位置RemotePath,填写为assets\internal\
在代码中取得文件:
procedureTForm19.Button1Click(Sender:
p:
string;
p:
=System.IOUtils.TPath.Combine(System.IOUtils.TPath.GetDocumentsPath,'
test.txt'
);
memo1.Lines.LoadFromFile(p);
label1.Text:
=p;
执行后,Memo1会显示test.txt的内容。
xe6下运行正常,可惜,xe7下无法找到这个文件。
无为网友说,他的xe7正常,真是怪事了!
!
洞主也帮我测试,在他的环境中也正常,说是我的人品问题,郁闷!