Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

[ Image Removed |../../index.htm#lansa/vlfonetutorials_0420.htm]
Visual LANSA フレームワーク ガイド > チュートリアル > VLF-ONE Web アプリケーションのチュートリアル > フィルターとコマンド・ハンドラーの手動作成 > コマンド・ハンドラーの手動によるコーディングとスナップイン > コマンド・ハンドラー用の再利用可能パーツを作成

...

Wiki MarkupVisual LANSA エディターで、\[ファイル\] > \ [作成\] > \ [再利用可能パーツ\] を選択します。

Image Added 

を選択します。 !worddavaf485e25f57cd86bb5b0fc63f3f1b1cc.png|height=32,width=32!   \[VLF-ONE 再利用可能パーツ\] \ [基本コマンド・ハンドラー\] を選択します。 !worddavaf485e25f57cd86bb5b0fc63f3f1b1cc.png|height=32,width=32!   コマンド・ハンドラーの名前と記述を入力し、ターゲット プラットフォームは Web ブラウザにします。 !worddavaf485e25f57cd86bb5b0fc63f3f1b1cc.png|height=32,width=32! \[作成\] をクリックします。   コマンド・ハンドラーがエディターで開かれたら、これをダブルクリックして詳細を表示します。祖先が、すべての VLF-ONE コマンドの共通祖先である #VF_AC010O になっていることに注意してください。 !worddavaf485e25f57cd86bb5b0fc63f3f1b1cc.png|height=32,width=32!   \[ソース\] タブに切り替えて、コードを次のコードに置き換えます。 を選択します。

Image Added 

コマンド・ハンドラーの名前と記述を入力し、ターゲット プラットフォームは Web ブラウザにします。

Image Added

[作成] をクリックします。
 
コマンド・ハンドラーがエディターで開かれたら、これをダブルクリックして詳細を表示します。祖先が、すべての VLF-ONE コマンドの共通祖先である #VF_AC010O になっていることに注意してください。

Image Added 
[ソース] タブに切り替えて、コードを次のコードに置き換えます。

Code Block
Begin_Com Role(*EXTENDS #VF_AC010O) Height(281) Width(513)
 
Define_Com Class(#xEmployeeIdentification.Visual) Name(#xEmployeeIdentification) Displayposition(1) Height(21) Left(23) Parent(#COM_OWNER) Tabposition(1) Top(42) Width(237) Readonly(True)
Define_Com Class(#xEmployeeSurname.Visual) Name(#xEmployeeSurname) Displayposition(2) Left(23) Parent(#COM_OWNER) Tabposition(2) Top(64)
Define_Com Class(#xEmployeeGivenNames.Visual) Name(#xEmployeeGivenNames) Displayposition(3) Left(23) Parent(#COM_OWNER) Tabposition(3) Top(86)
Define_Com Class(#xEmployeeStreet.Visual) Name(#xEmployeeStreet) Displayposition(4) Height(21) Left(23) Parent(#COM_OWNER) Tabposition(4) Top(108) Width(479)
Define_Com Class(#xEmployeeCity.Visual) Name(#xEmployeeCity) Displayposition(5) Height(21) Left(23) Parent(#COM_OWNER) Tabposition(5) Top(130) Width(479)
Define_Com Class(#xEmployeeState.Visual) Name(#xEmployeeState) Displayposition(6) Height(21) Left(23) Parent(#COM_OWNER) Tabposition(6) Top(152) Width(479)
Define_Com Class(#xEmployeePostalCode.Visual) Name(#xEmployeePostalCode) Displayposition(7) Height(21) Left(23) Parent(#COM_OWNER) Tabposition(7) Top(174) Width(249)
Define_Com Class(#PRIM_PHBN) Name(#Button_Save) Caption('Save') Displayposition(8) Left(376) Parent(#COM_OWNER) Tabposition(8) Top(216) Width(129) Enabled(False)
 

...



* Make pressing the enter key the same as pressing the search button

...


Define_Com Class(#prim_stpg) Name(#Enter) Shortcut(Enter) Parent(#COM_OWNER)

...


 

...


* The employee currently being viewed and edited

...


Define_Com Class(#vf_lm003O) Name(#DisplayedEmployeeDataItem) Reference(*DYNAMIC)

...


 

...


* ------------------------------------------------------------------------------

...


Define_Com Class(#Prim_ACol<#prim_evp>) Name(#PanelFields)

...


 

...


* ------------------------------------------------------------------------------

...


* Handle initialization

...


Mthroutine Name(uInitialize) Options(*Redefine)

...


Define_Com Class(#prim_evp) Name(#TempField) Reference(*DYNAMIC)

...


 

...


* Build collection of Editable fields

...


For Each(#Control) In(#Com_Owner.ComponentControls)

...


If_Ref Com(#Control) Is(*INSTANCE_OF #prim_evp)

...


#TempField <= #Control *As #prim_evp

...


#PanelFields.Insert( #TempField )

...


Endif

...


Endfor

...


 

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


* Handle termination

...


Mthroutine Name(uTerminate) Options(*Redefine)

...


 

...


* Clean out any reference to the last item (very important)

...


#DisplayedEmployeeDataItem <= *null

...


 

...


* Clean up the collection of fields on the panel

...


Invoke Method(#PanelFields.RemoveAll)

...


 

...


* Do any termination defined in the ancestor

...


Invoke Method(#Com_Ancestor.uTerminate)

...


 

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


* This runs when the Details command handler is shown for an employee

...


Mthroutine Name(uExecute) Options(*REDEFINE)

...


 

...


* Do the ancestor thing

...


#Com_Ancestor.uExecute Gotofreestate(#GotoFreeState) Switchcallerreference(#SwitchCallerReference)

...


 

...


* Check for any unsaved chanegs from previous displays and

...


* only proceed is their is nothing that needs to be saved

...


If (#COM_OWNER.CheckForUnsavedChanges( False ))

...


* This is going to be the employee we are working with

...


#DisplayedEmployeeDataItem <= #AVLISTMANAGER.CurrentInstance

...


* Clear any messages from the previous employee

...


#AVFRAMEWORKMANAGER.avClearMessages Requester(#COM_OWNER)

...


* Get the employee data from the server

...


#Com_Owner.GetDataFromServer

...


* GetDataFromServer will release the Busy State itself

...


#GotoFreeState := False

...


Endif

...


 

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


* Get the Data for an employee

...


Mthroutine Name(GetDataFromServer)

...


* The locally scoped return code

...


Define_Com Class(#IO$STS) Name(#IOStatusReturnCode)

...


* Define the Server Module method routine used to get data from the server

...


Define_Com Class(#SModule1.Find) Name(#Find)

...


 

...


* Group of fields

...


Group_By Name(#DataFields) Fields(#xEmployeeSurname #xEmployeeGivenNames #xEmployeeStreet #xEmployeeCity #xEmployeeState #xEmployeePostalCode #xEmployeeHomeTelephone #xEmployeeBusinessTelephone #xEmployeeStartDate #xEmployeeTerminationDate #xDepartmentCode #xEmployeeSalary)

...


 

...


* Clear any messages

...


#AVFRAMEWORKMANAGER.avClearMessages Requester(#COM_OWNER)

...


 

...


* Get the data from the server by doing an asynchronous call to the Server Module DF_T42DSO

...


* The data is returned as the #DataFields Group of fields

...


 

...


#xEmployeeIdentification := #DisplayedEmployeeDataItem.avAKey1

...


 

...


#Find.Execute Status(#IOStatusReturnCode) Xemployee(#DataFields) Xemployeeidentification(#xEmployeeIdentification)

...


 

...


* Handle asynchronous completion of the server operation

...


Evtroutine Handling(#Find.Completed)

...


If (#IOStatusReturnCode *EQ OK)

...


* The data from the #datafields Group_by is displayed in the fields on the screen

...


Else

...


#AVFRAMEWORKMANAGER.avIssueMessage Text('Data not found on the Server') Requester(#Com_Owner)

...


Endif

...


* Employee has not been changed yet and is freshly display

...


#Button_Save.Enabled := False

...


* Go back to display free state

...


#com_Owner.avGotoFreeState

...


Endroutine

...


 

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


* Start the save

...


Evtroutine Handling(#Button_Save.Click #Enter.Pressed)

...


If (#Button_Save.Enabled)

...


#COM_OWNER.SaveEmployee

...


Endif

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


Mthroutine Name(SaveEmployee)

...


* The locally scoped return code

...


Define_Com Class(#IO$STS) Name(#IOStatusReturnCode)

...


* Define the Server Module method routine used to save data to the server

...


Define_Com Class(#SModule1.Save) Name(#Save)

...


* Fields to be passed to Server Module DF_T42DSO

...


Group_By Name(#SaveFields) Fields(#xEmployeeIdentification #xEmployeeSurname #xEmployeeGivenNames #xEmployeeStreet #xEmployeeCity #xEmployeeState #xEmployeePostalCode #xEmployeeHomeTelephone #xEmployeeBusinessTelephone #xEmployeeStartDate #xEmployeeTerminationDate #xDepartmentCode #xEmployeeSalary)

...


 

...


* Note: Clear messages in status bar otherwise old messages are too confusing

...


#AVFRAMEWORKMANAGER.avClearMessages Requester(#COM_OWNER)

...


* Indicate to the user that a save is occuring

...


#COM_OWNER.avGotoBusyState Showbusytext('Saving') Animated(False)

...


 

...


* Now initiate the save asynchronously

...


#Save.ExecuteAsync Status(#IOStatusReturnCode) Xemployee(#SaveFields)

...


 

...


* Handle the asynchronous result

...


Evtroutine Handling(#Save.Completed)

...


* Get server messages and issue them in the Framework

...


#avFrameworkManager.avReceiveSystemMessageQueue Requester(#Com_owner)

...


 

...


If (#IOStatusReturnCode = OK)

...


* Message indicating successful update

...


#avFrameworkManager.avIssueMessage Text('Save was successful') Requester(#COM_OWNER)

...


* Update the instancelist entry if required and if it still viable exists

...


If (#DisplayedEmployeeDataItem.avVisualID2 *IsNot *Null)

...


#DisplayedEmployeeDataItem.avVisualid2 := #xEmployeeSurname + ', ' + #xEmployeeGivenNames

...


#DisplayedEmployeeDataItem.avUpdateDisplay

...


Endif

...


* Data has been saved so no need to allows save button now

...


#Button_Save.Enabled := False

...


Else

...


#avFrameworkManager.avIssueMessage Text('Save was NOT successful') Requester(#COM_OWNER) Type(WARN)

...


Endif

...


* Go back to display free state

...


#com_Owner.avGotoFreeState

...


 

...


Endroutine

...


 

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


* Enable the save button when the user changes something

...


Evtroutine Handling(#PanelFields<>.Changed)

...


 

...


#Button_Save.Enabled := True

...


 

...


Endroutine

...


 

...


* ------------------------------------------------------------------------------

...


* Indicate back to framework whether a close operation is currently allowed

...


Mthroutine Name(uQueryCanClose) Options(*REDEFINE)

...


 

...


#COM_OWNER.CheckForUnsavedChanges Timeoutinprogress(#TimeOutinProgress) Allowtoproceed(#Allow)

...


 

...


Endroutine

...


 

...


* --------------------------------------------------------------------------

...


* Returns True (Go ahead) or False (there are changes AND the user wants to save them)

...


Mthroutine Name(CheckForUnsavedChanges)

...


Define_Map For(*INPUT) Class(#prim_boln) Name(#TimeOutinProgress)

...


Define_Map For(*result) Class(#prim_boln) Name(#AllowtoProceed)

...


 
* If a save operation is pending and not timed out
If (#Button_Save.Enabled And #TimeOutinProgress.Not)
#AllowtoProceed := (#SYS_WEB.Confirm( ('Changed details of ' + #xEmployeeGivenNames + ' ' + #xEmployeeSurname + ' have not been saved. Do you want to save them first?') ) = Cancel)
Else
#AllowtoProceed := True /* Default */
Endif
 
Endroutine
 
End_Com

...

[デザイン

...

]

...

タブに切り替えて、自分のコマンド・ハンドラーのユーザー・インターフェースを確認します。

Image Added

コマンド・ハンドラーをコンパイルします。