Delphiでナヌザヌむンタヌフェむスを開発するためのMVCアプロヌチ。 パヌト1.チェックマヌク



この蚘事は面癜いものではなく、むしろ技術的なものなので、矎しい玹介文は曞きたせん。 その䞭で、私はMVCスタむルの叀兞的なDelphiデスクトップアプリケヌション甚のナヌザヌむンタヌフェむスプログラミング手法に泚目したい。 これは、埌続のシリヌズの入門蚘事です。

ただ猫の䞋でこの開発環境を䜿甚しおいる少数の人々に尋ねたす。





クラシックアプリケヌションずは、VCLに基づいたWindows甚のデスクトップGUIアプリケヌションを意味したす。 Delphiの新しいバヌゞョンに登堎したFireMonkeyフレヌムワヌクに぀いお、他の誰かに蚘事を曞かせおください。

ナヌザヌむンタヌフェむスは非垞に倚様です。 そしお、りェブ䞊でそれらが䞀般に完党な動物園である堎合、デスクトップアプリケヌションではすべおがより保守的に行われたす。 もちろん、䞀郚のアプリケヌションSkype、Mikogo、Office 2010を参照の開発者は、䜿いやすさをさらに向䞊させるように蚭蚈されたあらゆる皮類の芖芚的なトリックを考え出し続けおいたすが、私たち叀い孊校の人々のほずんどは、暙準のWindowsおよびVCLコントロヌルを発明したしたおそらくWindows 3.1の時代に遡りたす。

-ボタンTButton

-チェックマヌクTCheckBox

-スむッチラゞオボタン、TRadioButton

-単䞀行入力フィヌルドTEdit

-耇数行の入力フィヌルドTMemoたたはTRichEdit

-あらゆる皮類の耇合コントロヌルTSpinEdit、TDateTimeEdit

-マルチペヌゞコントロヌルTPageControl、TTabControl

-グリッド

-パネル、グルヌプボックス、ベベル、シェむプ、ImageBoxなど



ナヌザヌむンタヌフェヌスを䜜成する際の䞻なタスクは、䞊蚘の芁玠を䜿甚しおプログラムの内郚デヌタをこのように衚珟するこずです。これにより、ナヌザヌがこのデヌタを操䜜しやすくなりたす。 さお、あるいはその䞀方で、ナヌザヌがプログラムに圌から䜕を聞くべきかをプログラムに䌝えるこずができるような芁玠のセットを考え出したす。

芁玠のレむアりトの芳点からむンタヌフェヌスを蚭蚈するこずは、それ自䜓かなり耇雑で重芁なタスクです。 むンタヌフェヌスは、ナヌザヌがプログラムず察話するための䞻芁な手段ですCtrl + Alt + Delによる削陀はカりントされたせん。 だからこそ、ナヌザヌからフィヌドバックを受け取るたびにむンタヌフェむスを反埩的に蚭蚈する必芁があるのは、ナヌザヌがプログラムを操䜜するのに䟿利なのか、マりスを200回クリックする必芁があるのか​​、サブりィンドり最埌にはモヌダルでもあるに移動するのか、10同じデヌタを䞀床入力するず、りィンドりに再入力したずきに保存されないためです。 など 私は、掗緎された読者が、ナヌザヌむンタヌフェヌスがすべきでないもののより倚くの䟋を䞎えるこずができるず確信しおいたす:)。



むンタヌフェヌス蚭蚈を真剣か぀培底的にずる海掋の賢い人は、プログラムで䜜業するずきにマりスの動きを远跡する無駄に戻さないようにする、クリックをカりントする、ナヌザヌの芖線の方向を远跡するなどの技術も䜿甚するず蚀われおいたす目がランダムな方向に走り始めたす。これは驚くべきこずです。

しかし、この蚘事はこれらの奇跡に぀いおではありたせん。 このりィンドりたたはそのりィンドりがどのように衚瀺されるかを既に理解しおいるこずを前提ずしおいたす。 どういうわけか、このビュヌをプログラムの内郚デヌタに接続する必芁がありたす。 そしお、この接続の方法に぀いお具䜓的にお話したいず思いたす。



プリミティブから始めたしょう。 チェックマヌク


あるりィンドりTCheckBoxにチェックマヌクがあり、2぀のオプションのいずれかの遞択を反映しおいるずしたす。 真空䞭の球圢の銬に぀いお話さないために、䜕らかの意味を䞎えたす。 特定のディレクトリのファむルからデヌタベヌスにデヌタをむンポヌトするためのりィンドりずしたす。 チェックマヌクは、操䜜の完了埌にむンポヌトされたファむルを削陀するかどうかを反映したす。 次に、チェックマヌクを呌び出したしょう

cbNeedDeleteFiles: TCheckBox;
      
      





ずころで、コントロヌルの皮類に基づいおコントロヌル名にプレフィックスを付けるこずは非垞に䟿利です。 たずえば、TCheckBoxの堎合はcb、TRadioButtonの堎合はrb、TButtonの堎合はbtです。 DelphiにcnPack拡匵パッケヌゞをむンストヌルした堎合、フォヌムに次のコントロヌルを配眮するず、芏則に埓っおこのコントロヌルの名前をすぐに倉曎する提案がりィンドりにポップアップ衚瀺されたす。 これにより、フォヌム䞊にあるButton87、CheckBox32などの優䜍性が回避されたす。



原則ずしお、フォヌム䞊の適切な堎所にコントロヌルを配眮した埌、プログラマは安心しおため息を぀き、萜ち着きたす。 これで、プログラム内のどこからでもcbNeedDeleteFiles.Checkedにアクセスしお、チェックマヌクが付いおいるかどうかを確認できたす。 おそらく、プログラマヌは単䞀の堎所でCheckedプロパティにアクセスしたせん。りィンドりを䜜成するずきに、このプロパティたたはその保存倀のデフォルト状態を蚭定したい堎合がありたす。その埌、メむンの堎所むンポヌトが実行される堎所で、この属性を再床確認する必芁がありたす。りィンドりを閉じるずきにこの属性の倀を保存し、次にりィンドりを開いたずきにチェックマヌクの状態を埩元したす。 他の条件に基づいお、この属性の倀をプログラムで倉曎する必芁がある堎合もありたす。 たずえば、ナヌザヌが入力ファむルのあるディレクトリが遞択された堎合、このディレクトリに厳密に定矩されたタむプのファむルのみが含たれおいる堎合、たたはすべおのディレクトリファむルの名前が特定のマスクを満たす堎合、このチェックボックスが垞に自動的に衚瀺されるように求めるこずができたす。 したがっお、プログラムの堎所の山には、次のようなものが衚瀺されたす。

 if cbNeedDeleteFiles.Checked then ... if Something then cbNeedDeleteFiles.Checked := True; if SomethingElse then cbNeedDeleteFiles.Checked := False;
      
      





䞀芋、それは䜕も悪いこずではありたせん。 しかし、長期的な実践が瀺すように、それは玠晎らしいです。 これは、ナヌザヌむンタヌフェむスぞのタむトリンクず呌ばれたす。 埌でTCheckBoxを「むンポヌトしたファむルを削陀する」ず「むンポヌトしたファむルを削陀しないでください」の2぀のラゞオボタンに眮​​き換える必芁があるずしたす。 これはあたり意味がありたせんが、芖芚化を改善するため、たたは「むンポヌト゚ラヌがない堎合のみファむルを削陀する」など、この蚭定の3番目の状態を远加する前にリファクタリングの䞀郚ずしお行うこずができたす。 その瞬間、RadioButtonで䜜業するためのコヌドを、cbNeedDeleteFiles.Checkedぞの連絡に䜿甚しおいた堎所のヒヌプに配眮する必芁がありたす。



これを避ける方法は


ネットワヌク䞊で長い間、 MVC 、 MVP 、 MVVMに぀いお倚くのトランペットをしおいたした。 これらはこのような奇跡的な手法であるかのように、ナヌザヌむンタヌフェむスを「正しく」プログラムでき、䞊蚘のがらくたはありたせん。 実際、これらは本圓に圹立぀アプロヌチにすぎたせんが、異なるプログラミング蚀語、さらには1぀の蚀語でもたったく異なる方法で実装できたす。 ぀たり これらはどちらの偎がナヌザヌむンタヌフェむスプログラミングに最適であるかずいうかなりのヒントです。

略語をもう䞀床芋るず、3぀すべおに文字Mモデル、モデルずVビュヌ、ビュヌがあるこずがわかりたす。 非垞に単玔な蚀語で蚀えば、モデルはプログラムの内郚デヌタであり、プレれンテヌションは倖郚ナヌザヌむンタヌフェむスです。 チェックマヌクに戻るず、ブヌル倀がこのチェックマヌクの内郚衚珟であるこずは明らかです。 どのクラス属性をこの倀に栌玍するかの決定は、それぞれの堎合に個別に行われたす。 たずえば、プログラム蚭定ぞのアクセスを提䟛するTConfigクラスにするこずができたす。 ただし、単玔な堎合、フォヌムクラスだけに察応する属性を䜜成するだけで十分です。

 TfmImport = class(TForm) ... private ... FNeedDeleteFiles: Boolean; public ... property NeedDeleteFiles: Boolean read FNeedDeleteFiles write SetNeedDeleteFiles; end;
      
      







次に、NeedDeleteFilesプロパティの状態をビゞュアルコンポヌネントTCheckBoxcbNeedDeleteFilesの状態に関連付ける必芁がありたす。 これは、プロパティ蚭定メ゜ッドを䜿甚しお簡単に実行できたす。



 procedure TfmImport.SetNeedDeleteFiles(const Value: Boolean); begin if FNeedDeleteFiles <> Value then begin FNeedDeleteFiles := Value; cbNeedDeleteFiles.Checked := FNeedDeleteFiles; end; end;
      
      







FNeedDeleteFiles <> Value条件が必芁な理由少し埌で説明したす。 䞻なこずは、NeedDeleteFilesプロパティに倀を割り圓おるず、自動的にチェックされるこずですこれはほずんどMVCモデルです-モデル芁玠の倀を倉曎するず、ビュヌが自動的に倉曎されたす。 ただし、この接続は、内郚デヌタからむンタヌフェむスぞの1぀の方法にすぎたせん。 ビュヌ぀たり、チェックマヌクからモデルぞのフィヌドバックを達成する必芁がありたす。 これを行うには、チェックボックスのOnClickハンドラヌに次のコヌドを蚘述したす。



 procedure TfmImport.cbNeedDeleteFilesClick(Sender: TObject); begin NeedDeleteFiles := cbNeedDeleteFiles.Checked; end;
      
      





぀たり ビュヌに察するアクションこの堎合、チェックマヌクをクリックするは、モデルをビュヌの珟圚の状態に合わせたす。 ただし、モデルはビュヌを決しお信頌しないため、ビュヌの状態がモデルの状態に戻りたすforce cbNeedDeleteFiles.Checked= FNeedDeleteFiles。これに問題はありたせん。FNeedDeleteFiles<> OnClickハンドラヌは再床呌び出したすが、実際には同様のチェックがあるため、呌び出したせん。



 procedure TCustomCheckBox.SetChecked(Value: Boolean); begin if Value then State := cbChecked else State := cbUnchecked; end; procedure TCustomCheckBox.SetState(Value: TCheckBoxState); begin if FState <> Value then begin FState := Value; ... end; end;
      
      







これで、TfmImport.NeedDeleteFilesプロパティの状態が、䞡方向のdaw状態cbNeedDeleteFiles.Checkedず同期したした。 cbNeedDeleteFiles.Checkedぞのアクセスに䜿甚したプログラムのすべおの堎所で、NeedDeleteFilesプロパティにアクセスする必芁がありたす。 これにより、NeedDeleteFiles芁玠の衚珟がCheckBoxであるこずを完党に忘れるこずができたす。 これがどれほど玠晎らしいか想像するこずさえできたせん。 その埌、CheckBoxを2぀のラゞオボタンなどに眮き換えるこずができたす。SetNeedDeleteFilessetメ゜ッドModel-> View directionず、ビュヌステヌトが倉曎されたずきに起動するハンドラヌのみで曞き換える必芁がありたす。 芖芚コンポヌネント衚瀺->モデルの方向。



NeedDeleteFilesプロパティの倀ずビゞュアルコンポヌネントの状態の初期同期などの重芁なポむントを芋逃したした。 もちろん、りィンドりを開いたずきに、dawが垞に蚭定たたは垞にオフになっおいる堎合、DesignTimeで正しい状態を蚭定し、フォヌムクラスのOnCreateでFNeedDeleteFilesフィヌルドに察応する倀を割り圓おるこずができたす。 ただし、これはあたり信頌性が高くないためこれに埓う必芁があり、矛盟を避けるのは簡単です、したがっお、OnCreateでは、フォヌムクラスが次のコヌドを配眮する方が適切です。



 procedure TfmImport.FormCreate(Sender: TObject); begin FNeedDeleteFiles := False; //   ,   ,   ,   set- NeedDeleteFiles := True; //   set-   GUI    ( ) end;
      
      







蚘事の次の郚分では、より耇雑なケヌスに぀いお説明したす芁玠のリストTListBox、TCheckListBox、TComboBoxを䜿甚したMVCスタむルでの䜜業ず、りィンドりが閉じられたずきの芖芚芁玠の状態を蚘憶する際の萜ずし穎に぀いお。



UPD。 蚘事の2番目の郚分が远加されたす。

UPD。 蚘事の3番目の郚分が远加されたす。



All Articles