DelphiXE7学习笔记Word格式文档下载.docx

上传人:b****6 文档编号:21057419 上传时间:2023-01-27 格式:DOCX 页数:16 大小:509.89KB
下载 相关 举报
DelphiXE7学习笔记Word格式文档下载.docx_第1页
第1页 / 共16页
DelphiXE7学习笔记Word格式文档下载.docx_第2页
第2页 / 共16页
DelphiXE7学习笔记Word格式文档下载.docx_第3页
第3页 / 共16页
DelphiXE7学习笔记Word格式文档下载.docx_第4页
第4页 / 共16页
DelphiXE7学习笔记Word格式文档下载.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

DelphiXE7学习笔记Word格式文档下载.docx

《DelphiXE7学习笔记Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《DelphiXE7学习笔记Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。

DelphiXE7学习笔记Word格式文档下载.docx

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正常,真是怪事了!

洞主也帮我测试,在他的环境中也正常,说是我的人品问题,郁闷!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 判决书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1