Delphi XE7 學(xué)習(xí)筆記_第1頁(yè)
Delphi XE7 學(xué)習(xí)筆記_第2頁(yè)
Delphi XE7 學(xué)習(xí)筆記_第3頁(yè)
Delphi XE7 學(xué)習(xí)筆記_第4頁(yè)
Delphi XE7 學(xué)習(xí)筆記_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、【轉(zhuǎn)】XE6/XE7多窗口操作的Z軸序列錯(cuò)亂問(wèn)題解決辦法 (2014-09-26 08:01:46) xe7分類(lèi): DelphiXE7盒子中的cywyes發(fā)現(xiàn)這個(gè)問(wèn)題,并給出的答案,轉(zhuǎn)貼過(guò)來(lái),學(xué)習(xí)了!以下為原文:-XE6/XE7多窗口操作的Z軸序列錯(cuò)亂問(wèn)題解決辦法 by cyw(QQ:26890954) 14.9.25-一、問(wèn)題現(xiàn)象:1、Win32/64MainForm -> 顯示Form2 -> 顯示Form3 -> 關(guān)閉Form3,MainForm顯示在最前面,遮擋了Form2。(理論上:應(yīng)該是Form2在前)。2、AndroidMainForm -> 顯示Form

2、2 -> 顯示Form3 -> 關(guān)閉Form3 -> 點(diǎn)擊Form2上的TEdit控件,輸入法不會(huì)彈出!二、演示步驟:1、在Form1上,F(xiàn)orm2.Show;2、在Form2上,F(xiàn)orm3.Show;3、在Form3上,Close;4、Android:再點(diǎn)擊Form2上的TEdit控件,輸入法不會(huì)彈出!Windows:Form1遮擋了Form2。三、解決方法(適用于XE6和XE7):修改FMX.Form.pas的以下代碼:1、function TScreen.NextActiveForm(const OldActiveForm: TCommonCustomForm): TC

3、ommonCustomForm;整個(gè)函數(shù)改為如下:function TScreen.NextActiveForm(const OldActiveForm: TCommonCustomForm): TCommonCustomForm;varI, CurrIndex: integer;beginResult := nil;CurrIndex := IndexFormOfObject(OldActiveForm);(* 總是優(yōu)先找到OldActiveForm的前一個(gè)窗口(Z序列中的下一層). add by cyw 14.9.25 *)I := -1;if CurrIndex > 0 thenb

4、eginI := CurrIndex - 1;while (I >= 0) and (not FormsI.Visible) do Dec(I);end;if I = -1 then /如果找不到,再依據(jù)原來(lái)的邏輯,先找OldActiveForm的最上層第1個(gè)窗口可視窗口。(* add over *)beginI := FormCount - 1;while (I >= 0) and (I <> CurrIndex) and (not FormsI.Visible) do Dec(I);if (I < 0) or (I = CurrIndex) thenbegin

5、I := 0;while (I < FormCount) and (I <> CurrIndex) and (not FormsI.Visible) do Inc(I);end;end;if (I < FormCount) and (I <> CurrIndex) thenbeginResult := FormsI;ActiveForm := Result;end;end;2、procedure TScreen.SetActiveForm(const Value: TCommonCustomForm);整個(gè)函數(shù)改為如下:procedure TScreen.S

6、etActiveForm(const Value: TCommonCustomForm);varNewActiveForm: TCommonCustomForm;I: Integer;beginif Assigned(Value) thenbeginif not Value.Released thenbeginI := IndexFormOfObject(Value);if I < 0 thenraise EInvalidFmxHandle.Create(sArgumentInvalid);NewActiveForm := FormsI;/下面一行的條件屏蔽 by cyw 14.9.25

7、/原因:因?yàn)樵赥CommonCustomForm.Activate里調(diào)用Screen.ActiveForm := Self;之前,/ 已經(jīng)設(shè)置了FActive := True。如果這里保留條件“not NewActiveForm.Active”,/ 則Value窗口的Z序列就沒(méi)有更新,導(dǎo)致所有窗口的Z序列錯(cuò)亂。if (not NewActiveForm.Active) and (I < FormCount - 1) thenbeginFForms.Delete(I);FForms.Add(NewActiveForm);end;for I := 0 to FormCount - 1 doi

8、f (FormsI <> NewActiveForm) and (not IsParent(FormsI, NewActiveForm) thenFormsI.Deactivate;if not NewActiveForm.Active thenNewActiveForm.Activate;end;endelsebeginfor I := 0 to FormCount - 1 doFormsI.Deactivate;endend;原文地址 后記:2015-04-19,XE8解決了這個(gè)問(wèn)題。Delphi XE7 學(xué)習(xí)筆記(二)Android鍵盤(pán)處理 (2014-09-11 09:29

9、:39)轉(zhuǎn)載分類(lèi): DelphiXE7XE7帶了ScrollableFormDemo例子,演示如何實(shí)現(xiàn)輸入鍵盤(pán)自適應(yīng)當(dāng)前的輸入項(xiàng)。實(shí)現(xiàn)屏幕上下自動(dòng)劃動(dòng),不讓輸入鍵盤(pán)遮蓋住當(dāng)前正在輸入的項(xiàng)。例子在安裝目錄X:EmbarcaderoStudio15.0SamplesObject PascalMobile SamplesUser InterfaceScrollableForm編譯并運(yùn)行這個(gè)例子,在我的Note3上,效果非常好。在測(cè)試中,還是發(fā)現(xiàn)利用鍵盤(pán)上的隱藏鍵,隱藏鍵盤(pán)后,不觸發(fā)OnVirtualKeyboardHidden事件,造成界面不能還原,如下圖:第二個(gè)演示圖:可以利用龜山的方法解決。后記

10、:我試著利用Timer去觸發(fā)OnVirtualKeyboardHidden,結(jié)果,應(yīng)用有崩潰的時(shí)候,另外,在恢復(fù)屏的內(nèi)容時(shí),位置也計(jì)算不準(zhǔn),最下面的Edit在再次彈出keyBoard時(shí)也沒(méi)算準(zhǔn),不顯示。試著用backspace鍵,系統(tǒng)是正常的,問(wèn)題的實(shí)質(zhì)就在于emb沒(méi)有處理keyboard上的隱藏鍵。功力有限,精力有限,等emb來(lái)處理吧!再后記:后記中利用Timer的所有問(wèn)題都解決了!感謝盒子上的wang_80919,原文在這里,改后的FMX.VirtualKeyboard.Android.pas原代碼在這里。Delphi XE7 學(xué)習(xí)筆記(三)多窗體間如何調(diào)用 (2014-09-12 17:

11、36:10)轉(zhuǎn)載分類(lèi): DelphiXE7實(shí)作一個(gè)項(xiàng)目,一定由多個(gè)窗口組成的,對(duì)于Android來(lái)說(shuō),如何在A窗口中調(diào)用另外一個(gè)窗口呢?還有一個(gè)問(wèn)題,當(dāng)在項(xiàng)目中建立多個(gè)Form時(shí),在dpr項(xiàng)目文件中,默認(rèn)都是自動(dòng)建立Form實(shí)例的,如果一個(gè)項(xiàng)目的Form很多,在啟動(dòng)項(xiàng)目時(shí)會(huì)非常耗時(shí),也就是Splash顯示完后,會(huì)黑屏很長(zhǎng)時(shí)間,為了解決這個(gè)方法,我想,好的辦法就是在調(diào)用時(shí)先判斷這個(gè)Form是否已經(jīng)建立,沒(méi)有的話,先建立,再顯示。這里有一個(gè)與Win32應(yīng)用不同的是,Android不支持Form.ShowModal方法,只能使用Form.Show方法顯示一個(gè)窗口。以XE7帶的范例,對(duì)他做一下修改,這

12、個(gè)例子在目錄:C:EmbarcaderoStudio15.0SamplesObject PascalMobile SamplesUser InterfaceForms1.打開(kāi)項(xiàng)目文件:program Forms;uses System.StartUpCopy, FMX.Forms, PortraitForm in 'PortraitForm.pas' PForm, LandscapeForm in 'LandscapeForm.pas' LSForm;$R *.resbegin Application.Initialize; Application.Create

13、Form(TPForm, PForm); /Application.CreateForm(TLSForm, LSForm);/把這行去掉,不在運(yùn)行項(xiàng)目時(shí)自動(dòng)建立 Application.Run;end.2.打開(kāi)PortraitForm單元,把調(diào)用第二個(gè)窗口的代碼做下改造:procedure TPForm.FormResize(Sender: TObject);begin if not Assigned(LSForm) then/如果LSForm沒(méi)建立則創(chuàng)建他. LSForm:=TLSForm.Create(Application); if (Height < Width) and (Vi

14、sible) then LSForm.Show;end;OK,這樣改造后,就實(shí)現(xiàn)了上面提到的兩個(gè)問(wèn)題。本文讓高手見(jiàn)笑了,只適合初學(xué)Delphi者,別噴我!Delphi XE7 學(xué)習(xí)筆記(四)Android輸入控件自適應(yīng)虛擬鍵盤(pán)的位置轉(zhuǎn)載 (2014-09-22 09:27:44)分類(lèi): DelphiXE7XE7帶的Demo,演示了如何適應(yīng)虛擬鍵盤(pán),即當(dāng)虛擬鍵盤(pán)彈出時(shí),如果掩蓋了當(dāng)前的輸入項(xiàng),如Edit1,那么重新計(jì)算屏上所有控件的位置,讓Edit1能夠正常顯示在鍵盤(pán)上面,讓用戶能看到輸入的內(nèi)容。問(wèn)題是,鍵盤(pán)彈出后,如果用戶利用鍵盤(pán)上的隱藏鍵,隱藏了鍵盤(pán)后,不能恢復(fù)屏上控件的位置,這個(gè)問(wèn)題,其實(shí)

15、XE5就存在。要感謝盒子上Flying Wang,用他的方法,很好的解決了上面的問(wèn)題:原文在這里,改后的FMX.VirtualKeyboard.Android.pas代碼在這里。Delphi XE7 學(xué)習(xí)筆記(五)FMX.Types與FMX.Forms引用次序 (2014-09-22 16:34:19)轉(zhuǎn)載標(biāo)簽: it xe7分類(lèi): DelphiXE7學(xué)習(xí)xe7帶的VirtualKeyboardDemo例子,為了快速調(diào)試,改成win32平臺(tái),結(jié)果遇到退出程序時(shí)產(chǎn)生AV錯(cuò)誤,于是開(kāi)始清理代碼,直到清理的只剩下建立新項(xiàng)目時(shí)生成的基本代碼,問(wèn)題還是依舊。后對(duì)比項(xiàng)目的源代碼,再進(jìn)一步測(cè)試,結(jié)論是:fm

16、x.types與fmx.forms的引用次序有關(guān),就是說(shuō)要先引用fmx.forms,再引用fmx.types.附改后的dpr的代碼,被我簡(jiǎn)化并修正后的:program VirtualKeyboardDemo;uses/ System.StartUpCopy,/是否引用這個(gè)單元,不影響在win32與android下切換! FMX.Forms,/先引用,否則在win32平臺(tái)下會(huì)出錯(cuò). FMX.Types,/后引用 VirtualKeyboardBase in 'VirtualKeyboardBase.pas' VKBaseForm;$R *.resbegin Application

17、.Initialize; Application.CreateForm(TVKBaseForm, VKBaseForm); Application.Run;end.Delphi XE7 學(xué)習(xí)筆記(六)TBlobStream的使用 (2014-09-23 08:19:13)轉(zhuǎn)載分類(lèi): DelphiXE7盒子上有網(wǎng)友遇到問(wèn)題,直接用TBlobStream來(lái)做類(lèi)型轉(zhuǎn)換,編譯時(shí)提示無(wú)法找到這個(gè)類(lèi)。查了下源碼,發(fā)現(xiàn)這個(gè)類(lèi)已經(jīng)被定義在Data.DBXDataSets單元的TDBXReaderDataSet類(lèi)中。簡(jiǎn)化的看一下,象下面這樣定義: TDBXReaderDataSet = class(TDataS

18、et) public type TBlobStream = class(TMemoryStream) private.對(duì)于象上面這種方式定義的類(lèi),使用時(shí)加上引用類(lèi)所在的類(lèi)名就可以了。比如:procedure TVKBaseForm.FormCreate(Sender: TObject);var b:TDBXReaderDataSet.TBlobStream;/聲明一個(gè)變量.begin TDBXReaderDataSet.TBlobStream(b).Clear;/做類(lèi)型轉(zhuǎn)換.end;Delphi XE7 學(xué)習(xí)筆記(七)StyleBook當(dāng)公共對(duì)象使用 (2014-09-25 07:34:37)

19、分類(lèi): DelphiXE7一個(gè)項(xiàng)目,肯定要有公共對(duì)象,我就遇到如StyleBook,多個(gè)窗口都要用到他來(lái)設(shè)置窗口的顯示風(fēng)格,怎么辦呢?按傳統(tǒng)的方式,用一個(gè)全局的DataModule來(lái)管理。于是我這樣:在項(xiàng)目中,我建立一個(gè)TDataModule,說(shuō)實(shí)話,在xe7找了半天才找到在哪建立,如下圖:然后,拖放一個(gè)StyleBook上去,再通過(guò)StyleBook選擇一個(gè)顯示樣式,準(zhǔn)備讓所有的窗口都引用這個(gè)StyleBook,好統(tǒng)一所有的Form都用一個(gè)顯示樣式。然后,在具體的Form上引用這個(gè)StyleBook,當(dāng)然,為了引用他,首先要引用TDataModule單元,然后就可以在Object Inspe

20、ctor窗口中,通過(guò)選擇的方式(為了選擇StyleBook,需要打開(kāi)DataModule單元),設(shè)置Form1的StyleBook屬性,設(shè)置完屬性,F(xiàn)orm1會(huì)利用新的樣式顯示,所見(jiàn)即所得。如下圖:這里,存在一個(gè)問(wèn)題,應(yīng)算是xe7的一個(gè)bug,就是按上面,在設(shè)計(jì)期設(shè)置好Form的StyleBook,則在下次打開(kāi)項(xiàng)目時(shí),會(huì)產(chǎn)生錯(cuò)誤:為了規(guī)避這個(gè)問(wèn)題,我們可以用代碼來(lái)解決,在Form的OnCreate事件中處理,去掉在設(shè)計(jì)期對(duì)DM對(duì)象的引用。procedure TVKBaseForm.FormCreate(Sender: TObject);var i: integer;begin$ifdef an

21、droid self.StyleBook:=dm.StyleBook1;$endif LinkFillControlToField1.Active := False; for i := 0 to 50 do ClientDataSet1.AppendRecord('第'+i.ToString+'條記錄.',i); LinkFillControlToField1.Active := True;end;處理完所有的Form,就統(tǒng)一其風(fēng)格了!象StyleBook一樣,可以把全局對(duì)象都放到DataModule中,供項(xiàng)目中其他單元引用,實(shí)現(xiàn)對(duì)全局對(duì)象的管理了。文中DataModule是由項(xiàng)目自動(dòng)建立的,我們也可以控制DataModule的建立過(guò)程,實(shí)現(xiàn)對(duì)所有全局對(duì)象的進(jìn)一步管理。后記,XE7 up1 XE8,不允許放置TStyleBook,會(huì)出現(xiàn)錯(cuò)誤。那怎么做呢?有多種方法:1.在MainForm上放stylebook,然后設(shè)置StyleBook.UseStyleManager:=True,這樣,所有的窗口就自動(dòng)使用這個(gè)Style

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論