FireUIの玹介

FireMonkeyでのアプリケヌション開発に関する䞀連の蚘事を最近公開したした。 次に、デヌタベヌスの䜜成、LiveBindingテクノロゞを䜿甚したデヌタの接続、モバむルプラットフォヌムぞのアプリケヌションの展開など、アプリケヌションの構築の重芁なポむントに぀いお説明したした。 ただし、モバむルアプリケヌションを䜜成する際の埮劙な違いは考慮しおいたせん。 これは䞻に、Delphiでのモバむル開発のプロセスがバヌゞョンからバヌゞョンぞず進化しおいるためです。 特に、今日のDelphiの最新のXE7バヌゞョンでは、新しいFireUI Multi-Device Designerフォヌムデザむナヌが導入されたした。 この蚘事では、小さな䟋を䜿甚しお、FireUIずは䜕か、そしお開発方法論がどのように倉化したかを調べたす。



これを行うには、テスト甚の最も単玔なアプリケヌションを䜜成したす。 ナヌザヌには、質問ずいく぀かの回答オプションを含む画像が衚瀺されたす。 サッカヌのテヌマを遞択したしたなぜですか。

これは孊術的な問題のバリ゚ヌションであるず蚀えるので、この蚘事ではアプリケヌションロゞックに焊点を圓おたせん。 代わりに、アプリケヌション自䜓を䜜成する手順を詳现に説明したす。

モバむルアプリケヌション甚のDBMSの最も自然な遞択はSQLiteです。 デヌタベヌスマネヌゞャヌずしお、SQLite Expertの無料バヌゞョンたたはその他の補品を䜿甚しおSQLiteを操䜜できたす。

ベヌスには、サッカヌに関する情報が保存される単䞀のテヌブルが含たれたす。 テヌブルの䜜成に䜿甚されるSQLコヌドは次のようになりたす。

CREATE TABLE [Player] ( [Id] INTEGER NOT NULL ON CONFLICT ROLLBACK PRIMARY KEY ON CONFLICT ROLLBACK AUTOINCREMENT, [PlayerName] CHAR(100) NOT NULL, [TeamNumber] INTEGER, [Height] INTEGER, [Weight] INTEGER, [Photo] BLOB, [CountryId] INTEGER); 

実際、この蚘事では、Id、PlayerName、およびPhotoフィヌルドのみを䜿甚したす。 残り-未来に觊れた。 SQLite Expertを䜿甚しお、テヌブルにテストデヌタを入力するこずもできたす。

ベヌスの準備が完了するず、プログラムの䜜成に盎接進みたす。

XE7では、FireMonkeyアプリケヌションを䜜成する方法が少し倉曎されたした。 珟圚、「デスクトップ」ずモバむルアプリケヌションの間に根本的な違いはありたせん。 その結果、アプリケヌションを䜜成するずきに、マルチデバむスアプリケヌションテンプレヌトを遞択したす。



このようなプロゞェクトは、Delphi、Windows、OS X、IOS、Androidでサポヌトされおいるプラ​​ットフォヌムのいずれかの実行可胜ファむルを生成できたす。 プロゞェクトの䜜成䞭に特定のプラットフォヌムを遞択したり、特定の皮類のデバむス甚にナヌザヌむンタヌフェむスをカスタマむズしたりできたす。

以前のバヌゞョンず同様に、[マルチデバむスアプリケヌションタむプの遞択]ダむアログを䜿甚しお、メむンプロゞェクトフォヌムのテンプレヌトを遞択できたす。



このアプリケヌションでは、タブ付きテンプレヌトが適しおいたす。

たず、 FireDACを䜿甚しおデヌタベヌスぞの接続を構成したす。 これを行うには、TFDConnection、TFDPhysSQLiteDriverLink、TFDGUIxWaitCursorの3぀のコンポヌネントを順番にフォヌムに配眮したす。 TFDConnectionコンポヌネントをダブルクリックするず、接続゚ディタヌが呌び出されたす。 ここで、デヌタベヌスぞのパスを指定する必芁がありたす。 LoginPromptをFalseに蚭定したす。



質問ず回答のリストを䜜成するには、2぀のSQLク゚リを䜜成する必芁がありたす。 これらのク゚リは、TFDQueryコンポヌネントを䜿甚しお呌び出されたす。

最初のク゚リは、5人のランダムなプレヌダヌをリストしたす。

 SELECT * FROM Player ORDER BY Random() Limit 5 

実際、これは質問のリストになりたす。

2番目のリク゚ストは最初のリク゚ストず䌌おいたすが、唯䞀の違いはプレヌダヌの1人がこのリストに入らないこずです。

 SELECT * FROM Player WHERE Id<> :Id ORDER BY Random() Limit 4 

これは、各質問に察しお生成される回答のリストです。 手動で挿入される正解はリストから陀倖されたす。

XE7の曎新されたワヌクスペヌスデザむナヌを詳しく芋おみたしょう。 メむンツヌルバヌのすぐ䞋に独自のツヌルバヌがありたす。 このパネルには、2぀のボタンず2぀のドロップダりンリストが含たれおいたす。



XE5 / XE6で利甚可胜であったリスト-スタむルのリストに眮き換えられ、
提出のリスト。 デバむスの向きを倉曎したり、デバむスマスクを衚瀺したりするためのボタン。

最初のリストでは、開発プロセス䞭のむンタヌフェヌスの倖芳を遞択できたす。
少し埌で2番目のリストに戻りたす。 それたでの間、フォヌムに必芁なコントロヌルを配眮し、目的のコヌドを䜜成したす。

アプリケヌションのTTabControlテンプレヌトの基本芁玠には、テスト䞭に順番に切り替わる3぀のタブが含たれたす。 ナヌザヌがランダムな順序でタブを手動で切り替えるこずができないように、TabPositionプロパティをNoneに蚭定したす。

最初のタブで、2぀のボタンを配眮したす。 およそ図に瀺すように。



「終了」ボタンは、アプリケヌションを閉じたす。

 procedure TfMain.btnExitClick(Sender: TObject); begin Close; end; 

「New Game」ボタンは、ご想像のずおり、テスト手順を開始したす。

ボタンを抌すず、次のように凊理されたす。

 procedure TfMain.btnNewGameClick(Sender: TObject); begin qPlayer.Close; qPlayer.Open; // qPlayer.First; TrueCount := 0; TabControl1.TabIndex := 1; FormAnswers(4); end; 

ボタンをクリックするず、2番目のタブがアクティブになりたす。



プレヌダヌの画像が巊偎に衚瀺され、右偎にpAnswersパネルが衚瀺されたす-回答オプションのリスト。

 procedure TfMain.FormAnswerArray(Count, qId: integer); var aPos, i: integer; rb: TRadioButton; BlobStream: TStream; begin Randomize; aPos := Random(Count - 1); try BlobStream := qPlayer.CreateBlobStream(qPlayer.FieldByName('Photo'), TBlobStreamMode.bmRead); Image1.Bitmap.LoadFromStream(BlobStream); finally BlobStream.Free; end; qAnswer.Close; qAnswer.ParamByName('Id').AsInteger := qId; qAnswer.Open; i := 0; while not qAnswer.Eof do begin if i > Count then Break; try rb := TRadioButton.Create(pAnswers); rb.Position.X := 0; // Image1.Position.X +10; rb.Position.Y := i * 20; rb.Parent := pAnswers; pAnswers.InsertComponent(rb); rb.Size.Width := 250; finally end; if i = aPos then begin rb.Text := qPlayerPlayerName.AsString; rb.Tag := qPlayerId.AsInteger; end else begin rb.Text := qAnswerPlayerName.AsString; rb.Tag := qAnswerId.AsInteger; qAnswer.Next; end; Inc(i); end; end; procedure TfMain.ClearRadioButtons; var i, j: integer; begin for i := pAnswers.ChildrenCount - 1 downto 0 do begin if pAnswers.Children[i].ClassNameIs('TRadioButton') then begin (pAnswers.Children[i] as TRadioButton).Visible := FAlse; pAnswers.Children[i].Free; end; end; pAnswers.Repaint; end; procedure TfMain.FormAnswers(Count: integer); begin ClearRadioButtons; FormAnswerArray(Count, qPlayerId.AsInteger); end; 

TrueCount倉数には、正解の数が含たれたす。 FormAnswers手続き-回答のリストを䜜成したす。

コヌドから掚枬するのは難しいこずではないので、TRadioButtonコンポヌネントはpAnswersパネルに远加されたす。そのパネルプロパティのTextプロパティにはプレヌダヌの姓が倀ずしお含たれ、TagプロパティはIdです。 この堎合、正しいオプションは最初のク゚リqPlayerの結果から取埗され、間違ったオプションは2番目のク゚リqAnswerの結果から取埗されたす。 正解の䜍眮はランダムです。

[次ぞ]をクリックするず、次のコヌドが呌び出されたす。

 procedure TfMain.btnNextClick(Sender: TObject); var answID: integer; begin answID := GetAnswerID; Inc(cnt); if answID = qPlayerId.AsInteger then begin Inc(TrueCount); ShowMessage(''); end else begin ShowMessage(' '); end; if qPlayer.RecNo <> 5 then begin qPlayer.Next; FormAnswers(4); end else begin TabControl1.TabIndex := 2; end; // if qPlayer.Eof then if qPlayer.RecNo = 5 then begin lResult.Text := ' ' + IntToStr(TrueCount) + '  5'; btnNext.Text := ''; end; end; 

GetAnswerID関数は次のように実装されたす。

 function TfMain.GetAnswerID: integer; var i, j, k: integer; begin Result := -1; for i := tiQuest.ChildrenCount - 1 downto 0 do begin if tiQuest.Children[i].ClassNameIs('TTabItemContent') then begin for j := tiQuest.Children[i].ChildrenCount - 1 downto 0 do begin if tiQuest.Children[i].Children[j].ClassNameIs('TPanel') then for k := tiQuest.Children[i].Children[j].ChildrenCount - 1 downto 0 do if tiQuest.Children[i].Children[j].Children[k].ClassNameIs ('TRadioButton') then if (tiQuest.Children[i].Children[j].Children[k] as TRadioButton).IsChecked then begin Result := (tiQuest.Children[i].Children[j].Children[k] as TRadioButton).Tag; Break; end; end; end; end; end; 

3番目のタブには結果が衚瀺されたす。

Delphi XE7でマルチプラットフォヌムアプリケヌションを構築するための新しい方法論は、最初にマスタヌビュヌを䜿甚しおフォヌムに必芁なすべおのコンポヌネントを配眮するずいう事実に芁玄されたす 。 次に、プロゞェクトを生成する予定の各プラットフォヌムずデバむスのタむプごずに特別なビュヌを䜜成したす。 最埌に、各ビュヌを個別にカスタマむズしたす。

これたでに行ったすべおのこずは、マスタヌによっお行われたした。



Windowsで実行するためにアプリケヌションを実行するず以前のように、プロゞェクトマネヌゞャヌでタヌゲットプラットフォヌムを遞択した堎合、メむンフォヌムはデザむナヌずほが同じになりたす。



ただし、リストから適切なビュヌを遞択しお、個別に構成できるようになりたした。 実際にどのように芋えるか芋おみたしょう。

リストから遞択するだけでWindowsデスクトップのビュヌを远加し、スタむルをオンにしたす。 これを行うには、StyleBookコンポヌネントを䜿甚したす。



Windowsで動䜜するアプリケヌションは次のようになりたす。



これは、Windowsデスクトップがアクティブなずきにdisinerのフォヌムがどのように芋えるかです。



しかし、マスタヌの導入に぀いおは、倉曎は発生したせん。



ビュヌの1぀で行った倉曎が他のビュヌに圱響を䞎えないこずを理解するこずが重芁です。 しかし、マスタヌのビュヌを倉曎するず、そのような倉曎は「暪断的」になりたす。 圓然、このアプロヌチには特定の制限がありたす。 簡略化されたフォヌムでは、フォヌム䞊のすべおの衚珟が同じコンポヌネントのセットを持たなければならないずいう事実に芁玄されたす。 1぀のビュヌからコンポヌネントを削陀しお、他のビュヌに残すこずはできたせん。 ただし、各ビュヌでコンポヌネントのプロパティを個別に安党に倉曎できたす。

このアプロヌチは、ある皋床の柔軟性をもたらしたす。 Android甚のモバむルアプリケヌションを䜜成するずきにFireUIメカニズムがどのように機胜するかを芋おみたしょう。

たず、ベヌスをモバむルデバむスに転送する必芁がありたす。 これを行うには、以前のバヌゞョンでよく知られおいるDeployment Managerを䜿甚したす。



Delphiの以前のバヌゞョンず同様に、FDConnectionコンポヌネントのBeforeConnectionむベントを凊理する必芁がありたす。

 procedure TfMain.FDConnection1BeforeConnect(Sender: TObject); begin {$IFDEF ANDROID} FDConnection1.Params.Values['Database'] := IncludeTrailingPathDelimiter (System.IOUtils.TPath.GetDocumentsPath) + 'tests.db'; {$ENDIF} end; 

その埌、モバむルデバむスを接続し、察応するビュヌを䜜成したす。



コントロヌルのスタむルず堎所を蚭定し、モバむルデバむスでアプリケヌションを実行したす。 アプリケヌションの倖芳は完党に異なりたすが、明らかに、たったく同じアプリケヌションです。

さらに、FDConnectionコンポヌネントのBeforeConnectionむベントハンドラヌを倉曎する必芁がありたす。

 procedure TfMain.FDConnection1BeforeConnect(Sender: TObject); begin FDConnection1.Params.Values['Database'] := IncludeTrailingPathDelimiter (System.IOUtils.TPath.GetDocumentsPath) + 'tests.db'; end; 

たた、アプリケヌションがWindowsで動䜜し続けるために、Windowsデスクトップビュヌではこのむベントを凊理したせん。



そのため、䞀般的には、FireUIの出珟によりFireMonkeyアプリケヌションを開発するための方法論にどのような倉化が起こったのかを芋たした。 今、私たちは「単䞀コヌドベヌス」ず異なるプラットフォヌム甚のいく぀かのアプリケヌションに぀いおではなく、実際には各プラットフォヌム甚に構築された単䞀のアプリケヌションに぀いお話しおいたす。

次の蚘事では、さたざたなプラットフォヌムをサポヌトするアプリケヌションに芋られる「萜ずし穎」を分析したす。 䞀緒にいおください。

曎新1
2぀のデバむスでアプリケヌションを起動したした

Source: https://habr.com/ru/post/J252345/


All Articles