為Android做一個ShowModal窗口


大家知道,用Delphi實現一個Form,並用ShowModal顯示出來,在Android平台是非阻塞的,即執行了Form.ShowModal,代碼會繼續往下執行而不是等待,這跟在Windows平台是完全不一樣的。如果我們需要類似阻塞的效果,該如何實現呢?

1.先建一個Form,跟通常的情況一樣。

2.為Form實現具體的內容,這按你的需要了。

3.在窗口的單元中實現一個方法,用來顯示這個窗口:

procedure ShowPrivacyForm(AFormResult: TProc<TModalResult>);
implementation
{$R *.fmx} //調用方法: // ShowPrivacyForm( // procedure(AResult: TModalResult) // begin // // end); var PrivacyForm: TPrivacyForm;//聲明一個私有變量 procedure ShowPrivacyForm(AFormResult: TProc<TModalResult>); begin if not assigned(PrivacyForm) then begin PrivacyForm := TPrivacyForm.Create(Application); end; PrivacyForm.ShowModal( procedure(AResult: TModalResult) begin AFormResult(AResult);//這里執行回調 TTask.Run( procedure begin TThread.Synchronize(nil, procedure begin PrivacyForm.DisposeOf;//釋放這個窗口 PrivacyForm := nil; end); end); end); end;

4.顯示這個窗口,首先引用Form所在的單元,然后調用顯示窗口的方法ShowPrivacyForm:

        ShowPrivacyForm(
                        procedure(AResult: TModalResult)
                        begin
                           if AResult=mrCancel then
                           begin
                               Close;
                           end
                           else
                           begin
                               //用戶點擊了確定接鈕 
                           end;
                        end);

5.細節處理,接管Android手機的返回鍵,當用戶按返回鍵,相當於點擊取消操作:

procedure TPrivacyForm.FormKeyUp(Sender: TObject; var Key: Word;
    var KeyChar: Char; Shift: TShiftState);
begin
  if Key = vkHardwareBack then
       self.ModalResult := mrCancel;
end;

6.注意的一個小坑,看下面的代碼:

procedure TPrivacyForm.CCButton1Click(Sender: TObject);
begin
  self.ModalResult := mrOk; //這句直接關閉窗口,不用再執行Close方法
// Close;
end;

原來我執行了Close,發現窗口返回的值為mrCancel。在Windows平台跟蹤發現原來是Close執行后的結果,把這行注釋掉,執行正常,原來Self.ModalResult:=mrOK這一句會自動關閉窗口,下面的Close是多余的了。

好了,一個完美的ShowModal窗口實現了!

核心代碼引用專家的ChinaCock組件包中的Demo,這里表示感謝!

Delphi 10.4.2測試通過。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM