TPopup bestaat uit twee subcontrols DisplayLijst en PopupLijst DisplayLijst wordt gebruikt voor het tekenen van de geselecteerde items tijdens LostFocus en Hibernate PopupLijst wordt gebruikt voor het tekenen van al de items tijdens onFocus De geselecteerde items worden opgeslagen in property Selected als een $LB (alleen de keys worden opgeslagen), $LB wordt ook gebruikt als het slechts een single value (geen multiple) is DataSet De default dataset wordt tijdens de initialisatie gecreëerd indien deze niet zelf wordt doorgegegen. De dataelementen zijn KEY, OMS Via het onLoad Event wordt het dataelement SELECTED toegevoegd De items worden geladen in een QueryCache er wordt geen gebruikt gemaakt van een global De default DataSet kan overruled worden, alleen moeten de dataelements KEY en SELECTED bestaan waarbij SELECTED via het onLoad event bepaald wordt De DataSet is dezelfde voor de TPOPUP als voor de PopupLijst Enkele speciale keys zijn : $$$pkSeparator duidt op een separatorlijn. Formatering gebeurt door het frame $$$lfnSeparator #SELECTGEEN# als alle geselecteerde items moeten gewist worden. Formatering gebeurt door het frame $$$lfnNoKey. #SELECTALLES# als alle (selecteerbare) items moeten geselecteerd worden. Formatering gebeurt door het frame $$$lfnNoKey. #key# als het item geen sleutel heeft, dan wordt de key tussen # geplaatst. Formatering gebeurt door het frame $$$lfnNoKey. De key kan dan gebruikt worden om een speciale actie te triggeren via het onChangeEvent DisplayLijst : De DisplayLijst is een TLIJST control. De displayframe wordt default gedefinieerd door de method DefaultFrames. De DEFAULT displayframe bevat afhankelijk van de options (K en O) de KEY en/of OMS kolommen. De breedte van de kolommen wordt bepaald door de maximale lengte van resp. KEY en OMS. Deze max. lengte wordt ingevuld in de properties MaxKeyLen en MaxOmsLen Voor de Paint wordt er via de method BuildDisplayDataSet, de DataSet van de DisplayLijst wordt opgebouwd uit alleen de geselecteerde items van de volledige dataset Bij std lijstjes kan er gebruik gemaakt worden van de defaulting maar men kan de DisplayLijst volledig naar zijn hand zetten. PopupLijst : De PopupLijst is een TLIJST control. Drie popupframes worden default gedefinieerd door de method DefaultFrames. Je kan deze frame wijzigen zoals bij elke lijst. De DEFAULT popupframe bevat afhankelijk van de options (K en O) de KEY en/of OMS kolommen en afhankelijk of het een multiple is ook nog de checkbox of het volgnr. De breedte van de kolommen wordt bepaald door de maximale lengte van resp. KEY en OMS. Deze max. lengte wordt ingevuld in de properties MaxKeyLen en MaxOmsLen Voor de Paint wordt er via de method BuildDisplayDataSet, de DataSet van de DisplayLijst wordt opgebouwd uit alleen de geselecteerde items van de volledige dataset De SEPARATOR frame wordt default gedefinieerd om scheidings lijnen te tonen De NOKEY frame wordt default gedefinieerd om records waarvan KEY begint met # en verschillend is van #SEPARATOR# te tonen, hierbij wordt alleen de omschrijving getoond. Bij std lijstjes kan er gebruik gemaakt worden van de defaulting maar men kan de DisplayLijst volledig naar zijn hand zetten. Event onChange(Key) Dit event krijgt het dataelement KEY mee als parameter, deze wordt doorgegeven als .Key en kan dus gewijzigd worden Tevens staat de DataSet gepositioneerd op het laatst geselecteerde. Als de key begint met # en verschillend is van $$$pkSeparator dan is het een speciale key. De onChange kan de property Selected manipuleren om de selectie te wijzigen. Er zijn twee standaard triggers #SELECTALLES# en #SELECTGEEN# die std door TPOPUP worden behandeld Initialisatie code als het gaat over een standaard popup (KEY en OMS) Set ..Regio=##class(TCHUI.TPopup).Create(%this,"Regio","Regios",5,20,5,40,3,3,1,$LB(),"R") Do ..Regio.InitSpec(,"MRKO",,,15,60) Do ..Regio.DataSet.AppendResource("KLANT","REGIO") ; Fill dataset - de dataset moet gevuld zijn voor dat DefaultFrames wordt opgeroepen Do ..Regio.DefaultFrames() Set ..Regio.Selected=$LB(...) vhLib.Macro 1 TControl ListBuild van geselecteerde items %String ListBuild van geselecteerde items %String Idem aan selected, werkt via Get en Set method, houdt rekening met opMultiSelect %String TDataSetList TLijst TKader TLijst wordt ingevuld door method DefaultFrames %Integer wordt ingevuld door method DefaultFrames %Integer Compatibilty met frame %String 1 Indien ingevuld, dan wordt bij gewone weergave de geselecteerde items weergegeven aan de hand van één lijn, gescheiden door het teken opgegeven in Separator %String %String "(geen)" OPTIONS %Boolean 0 %Boolean 0 %Boolean 0 %Boolean 1 %Boolean 0 %Boolean 1 %Boolean 1 %Boolean 1 %Boolean 0 %Boolean 0 %String "Gelieve een waarde te selecteren." Events Method OnChanged(Sender As %String) %String Method OnChanging(Sender As %String, Key As %String) %String Method OnEdit(Sender As %String, Value As %String) Omvormen van Value naar een editdisplay value Wordt elke keer opgeroepen als het veld de focus krijgt en de EditWaarde wordt getoond, deze kan verschillend zijn van de DisplayWaarde %String Method OnValidate(Sender As %String, Value As %String) Omvormen van Value naar een storage value Wordt elke keer opgeroepen als het veld de focus verliest en veranderd is %String ============================================================================================================== TreeView extension . ============================================================================================================== %Boolean 0 1 Top,Left,Height,Width:%Integer,OnQueryInit:%String="" Text,Key:%String="",Expanded:%Boolean=0,FrameToUse:TCHUI.TFrame=$$$NULLOREF %String Parent,Text,Key:%String="",Expanded:%Boolean=0,FrameToUse:TCHUI.TFrame=$$$NULLOREF %String Groep,SubGroep,Sep:%String=":",Expanded:%Boolean=0 Expanded:%Boolean=1 ============================================================================================================== KillFocusOk:%Boolean FontSelected Value %Status AValue:%String %Status %String Key,Checked %Boolean 0) ..Selected=$$$LBDeleteAt(..Selected,VolgNr) Quit $S(VolgNr>0:0,1:1) ]]> Key Key Parent:%String,Checked:%Boolean Sender:TControlBasis,KeyCode:%String Button:%String,Row:%Integer,Col:%Integer OnRow event Sender,LijstRow Sender,LijstRow Sender,LijstRow Inititialisatie DataSet optioneel, indien niet meeggeven dan wordt een default dataset met KEY, OMS aangemaakt Top, Left, Height en Width zijn optioneel, de positie en afmetingen van de popuplijst (zonder kader) DataSet,Top,Left,Height,Width,OnQueryInit:%String="",InitForTree:%Boolean=0 MaxHeight) Height=MaxHeight Set MaxWidth=%Screen.Width-ScreenLeft-1 Set:(Width>MaxWidth) Width=MaxWidth Set ..PopupLijst=##class(TLijst).Create(%this,"PopupLijst","",Top,Left,Height,Width,1,,,,) Set ..PopupLijst.Visible=0 ;m %fonts=..PopupLijst.Fonts zw %fonts r k Set ..PopupLijst.OnRow=$LB(%this,"PopupLijstRow") Set ..PopupLijst.FocusMode=$$$fmFocused If $isObject($G(DataSet)) Do . Set ..DataSet=DataSet Else If InitForTree Do . Set DataSet=..PopupLijst.CreateTreeDataSet() Else Do . Set DataSet=..DefaultDataSet() Set DataSet.OnLoad=$LB(%this,"OnLoad") Set DataSet.OnQueryInit=OnQueryInit Do ..PopupLijst.InitSpec(.DataSet,,,,..TextWhenEmpty,0,0) Set ..PopupLijst.FormSubType=$$$ftAddPopup Set BGFont=..PopupLijst.GetFont($$$fsLijn) Do ..PopupLijst.AddScrollBar(BGFont) Set ..PopupKader=##class(TKader).Create(%this,"PopupKader",..Caption,Top-1,Left-1,Height+2,Width+2,1,,,BGFont) Merge ..DisplayLijst.DataSet.LoadExec=DataSet.LoadExec Do:(..opDefaultContextMenu) ..DefaultContextMenu() ]]> Default dataset die vertrekt van data in de QueryCache met als data $LB(KEY,OMS) Value:%Boolean %Status Key,Text,Data... ClassName,QueryName,TextColName,KeyColName="",aParams... %String Groep,SubGroep SelList:%ListOfDataTypes SelList:%ListOfDataTypes %Screen.Width Do . Set FittingLen=%Screen.Width-..PopupLijst.Left-1 If Cnt=0 Do . Set Cnt=1 //Cnt=0->geen items, aangezien we dit visueel duidelijk maken in een Popuplijst row "geen items" -> Cnt=1 . Set tmpEmptyFrame=$G(..PopupLijst.Controls($$$lfnEmpty)) . Set:($IsObject(tmpEmptyFrame)) FittingLen=tmpEmptyFrame.Width Set ..PopupLijst.Width=FittingLen Set ..PopupKader.Width=..PopupLijst.Width+2 //Height If Cnt+..PopupLijst.Top>(%Screen.Height-1) Do . Set ..PopupLijst.Height=%Screen.Height-..PopupLijst.Top-1 //-1:schaduw Else Do . Set ..PopupLijst.Height=Cnt Set ..PopupKader.Height=..PopupLijst.Height+2 //Width afzonderlijke cmps Set (MainCtrlName,SubCtrlName)="" For Set MainCtrlName=$O(..PopupLijst.Controls(MainCtrlName)) Quit:(MainCtrlName="") Do . Set MainCtrl=..PopupLijst.Controls(MainCtrlName) . Quit:(MainCtrlName=$$$lfnEmpty) //Empty-frame heeft steeds dezelfde lengte, deze dus niet aanpassen . If MainCtrl.%ClassName(1)="TCHUI.TFrame" Do .. Set MainCtrl.Width=FittingLen .. For Set SubCtrlName=$O(MainCtrl.Controls(SubCtrlName)) Quit:(SubCtrlName="") Do ... Set SubCtrl=MainCtrl.Controls(SubCtrlName) ... Set:(SubCtrl.Left+SubCtrl.Width=(OrigWidth+1)) SubCtrl.Width=FittingLen-(SubCtrl.Left-1) //Left begint op 1... Set ..PopupLijst.ScrollBar.Left=..PopupLijst.Left+FittingLen Set ..PopupLijst.ScrollBar.Length=..PopupLijst.Height ]]> Aanmaken default context menu Sender Sender Creatie van de display en de popupframes geen items, aangezien we dit visueel duidelijk maken in een Popuplijst row "geen items" -> Cnt=1 Set:(..PopupLijst.Height>Cnt) ..PopupLijst.Height=Cnt,..PopupKader.Height=Cnt+2 Set:(..PopupLijst.Height<1) ..PopupLijst.Top=%Screen.Height-Cnt-1,..PopupKader.Top=..PopupLijst.Top-1,..PopupLijst.Height=Cnt,..PopupKader.Height=Cnt+2 ; Aanmaken row frame Set tmpFrame=..PopupLijst.CreateRowDef($$$lfnMain,$$$ftAddPopup) If ..opMultiSelect Do . If ..opSorted Do .. Do ..PopupLijst.AddLabelDBToRowDef(tmpFrame,$$$pcidSelected,2) . Else Do .. Do ..PopupLijst.AddCheckBoxDBToRowDef(tmpFrame,$$$pcidSelected,1) . Do ..PopupLijst.AddLabelToRowDef(tmpFrame,," ") If ..opShowKey Do . Do ..PopupLijst.AddLabelDBToRowDef(tmpFrame,$$$pcidKey,..MaxKeyLen) . If ..opShowText Do .. Do ..PopupLijst.AddVLineToRowDef(tmpFrame," | ") If ..opShowText Do . Do ..PopupLijst.AddLabelDBToRowDef(tmpFrame,$$$pcidText) ;Lengte niet opgeven, deze jongen gaat tot het einde... ; Nadat de grote bepaalt is kunnen de andere frames/controls gegenereerd worden Do ..PopupLijst.AddScrollBar(..PopupLijst.GetFont($$$fsLijn)) Set tmpFrame=..PopupLijst.CreateRowDef($$$lfnSeparator,$$$ftAddPopup) Do ..PopupLijst.AddHLineToRowDef(tmpFrame) Set tmpLabelDB=..PopupLijst.AddLabelDBToRowDef(tmpFrame,$$$pcidText,,$$$alCenter) Set tmpLabelDB.Sizing=$$$lsAuto Set tmpFrame=..PopupLijst.CreateRowDef($$$lfnNoKey,$$$ftAddPopup) Do ..PopupLijst.AddLabelDBToRowDef(tmpFrame,$$$pcidText) ]]>