
Есть такой ADIQueue.tpl может поможет
#Template(AdiQueueHandler,'Templates related to handcoded listbox v2'),Family('ABC','CW20')
#Extension(HandCodedListbox,'Handle queue field listbox with locator'),Multi
#Boxed('Info')
#Display('Remember to sort the queue')
#Prompt('Specify list',From(%Control,%ControlType='LIST')),%TheListbox
#Button('Conditional locator'),Multi(%Sortorders,%SortCondition & '-' &%Locator),Inline
#Prompt('Condition',Expr),%SortCondition,Default('TRUE')
#Prompt('Queue Locator',Field),%Locator
#Prompt('Locator is',Option),%LocatorIs
#Prompt('UPPER',Radio)
#PROMPT('lower',Radio)
#Prompt('Sentence',Radio)
#Prompt('AsIs',Radio)
#Prompt('Incremental',Check),%Inc,Default(1)
#EndButton
#Prompt('Use entrylocator',Check),%UseEntry
#Enable(%UseEntry)
#Prompt('EntryLocator',Control),%EntryLocator
#EndEnable
#Prompt('Refresh control',Control),%RefreshControl
#Prompt('Use EIP',Check),%UseEip
#Enable(%UseEip)
#Prompt('Disabled fields',Field),%DisabledFields,Multi('Select disabled fields')
#Prompt('Enter does not scroll down',Check),%EscOnEnter
#EndEnable
#Display('Bjarne Havnen,2002')
#Endboxed
#AtStart
#Declare(%LastValid)
#Set(%LastValid,'LastValid'&%ActiveTemplateInstance)
#Declare(%Direction)
#Set(%Direction,'Direction'&%ActiveTemplateInstance)
#Equate(%EipActive,'EipActive'&%ActiveTemplateInstance)
#Declare(%MaxColumns)
#Set(%MaxColumns,0)
#Declare(%ListControl)
#Set(%ListControl,%TheListBox)
#Declare(%columnno)
#Declare(%EipControl)
#Set(%EipControl,'EipControl'&%ActiveTemplateINstance)
#Declare(%LocatorVar)
#Set(%LocatorVar,'HandLocator'&%ActiveTemplateInstance)
#Fix(%Control,%ListControl)
#Declare(%ListQueue)
#Set(%ListQueue,%ControlFrom)
#For(%ControlField)
#Set(%MaxColumns,%MaxColumns+1)
#EndFor
#!Declare(%Looped)
#!Declare(%IfElsif)
#Endat
#At(%DataSectionBeforeWindow)
%LastValid Long
%EipActive Byte(0)
%LocatorVar cString(255)
%EipControl Long
%Direction Long
#Endat
#!Refreshing the listbox
#At(%ControlEventHandling,%RefreshControl,'Accepted'),Priority(5500),Where(%RefreshControl)
SetKeycode(F5Key);Post(EVENT:AlertKey,%ListControl) #<!Refresh %Listcontrol according to condition
#EndAT
#At(%ControlEventHandling,%EntryLocator,'Accepted'),Priority(5500),Where(%UseEntry)
#Declare(%IfElsif)
#Declare(%Looped)
#Set(%Looped,0)
If %EntryLocator{Prop:Use}
#For(%SortOrders)
#If (%Looped=%True)
#Set(%IfElsif,'Elsif')
#Else
#Set(%IfElsif,'If')
#Set(%Looped,%True)
#EndIf
%IfElsif(%SortCondition) Then
#Case(%LocatorIs)
#Of('UPPER')
%Locator = Upper(%EntryLocator{prop:Use})
#Of('lower')
%Locator = Lower(%EntryLocator{prop:Use})
#Of('Sentence')
%Locator = Lower(%EntryLocator{Prop:Use})
%Locator[1] = Upper(Sub(%Locator,1,1))
#Else
%Locator = %EntryLocator{Prop:Use}
#EndCase
#EndFor
#If(%Looped)
End
#EndIf
N#=Position(%ListQueue)
If Inrange(N#,1,Records(%ListQueue))
Select(%ListControl,N#) !Pointer(%ListQueue))
Get(%ListQueue,Choice(%ListControl))
End
End
#EndAT
#At (%ControlEventHandling,%ListControl,'AlertKey'),Priority(5500)
Case Keycode()
Of MouseLeft2 OROF EnterKey
%EipActive = True
%ListControl{Prop:column}=Choose(%ListControl{Proplist:MouseDownField}>0,%ListControl{Proplist:MouseDownField},1)
Post(event:NewSelection,%ListControl)
Cycle
Of InsertKey
#Embed(%AdiQBeforeAdding,'Before adding a new record'),Where(%ActiveTemplateInstance)
%ListControl{Proplist:MouseDownField}=0 #<!to ensure we start with the first post
Clear(%ListQueue)
Add(%ListQueue,Choice(%ListControl)+1) #<!add after
If Errorcode()
Message(Error())
End
Select(%ListControl,Pointer(%ListQueue))
SetKeycode(Mouseleft2)
Post(Event:AlertKey,%ListControl)
Cycle
Of DeleteKey
Get(%ListQueue,Choice(%ListControl))
If Not Errorcode()
Delete(%ListQueue)
Display(%ListControl)
Post(Event:NewSelection,%ListControl)
End!if
Of F5Key
#For(%SortOrders)
If (%SortCondition) Then Sort(%ListQueue,%Locator).
#EndFor
Else
IF KeyCode() <> BSKey
If KEYCODE() = SpaceKey OR KeyChar()
%LocatorVar = %LocatorVar & CHOOSE(KEYCODE()=SpaceKey,' ',CHR(Keychar()))
ELSE
Clear(%LocatorVar)
END
#Insert(%LocatorHandling)
ELSE
IF LEN(%LocatorVar) > 0
%LocatorVar = SUB(%LocatorVar,1,LEN(%LocatorVar)-1)
END
#Insert(%LocatorHandling)
END
End
#Endat
#At (%ControlEventHandling,%ListControl,'NewSelection'),Priority(5500)
#Fix(%Control,%ListControl)
Get(%ControlFrom,Choice(%Control))
#If(%UseEip)
#Set(%Columnno,0)
If %EipActive
If Not %Direction #<!Same column
%Direction=1
Last#=%ListControl{Prop:Column}
ElsIf %LastValid>%ListControl{Prop:Column}
Last#=%Direction
%Direction=-1
Elsif %LastVAlid<%ListControl{Prop:Column}
Last#=%Direction
%Direction=+1
End
Loop
If Inc#=%ListControl{Prop:Column}
%ListControl{Prop:Column}=%LastValid
End
Inc#=%ListControl{Prop:Column}
Case(%ListControl{Prop:Column})
Of 0 !is this possible
%ListControl{Prop:Edit,%LastValid}=0
%ListControl{Prop:Column}=0
%EipActive = False
Break
Cycle
#For(%ControlField)
#Set(%Columnno,%Columnno+1)
Of %Columnno
#If(Inlist(%ControlField,%DisabledFields))
#If(%Columnno=%MaxColumns)
SetKeyCode(TabKey)
Post(Event:AlertKey,%EipControl)
Break
#Else
%ListControl{Prop:Column}=%ListControl{PRop:Column}+%Direction
Cycle
#EndIf
#Else
%EipControl{Prop:Use}=%ControlField
%EipControl{Prop:Text}=%ListControl{Proplist:picture,%Columnno}
%ListControl{Prop:Edit,%Columnno}=%EipControl
%LastValid=%Columnno
Display(%EipControl)
Select(%EipControl)
Break
#EndIf
#EndFor
Else
%ListControl{Prop:Column}=0
Cycle
!Break
End!case
End!loop
End!If
Clear(%Direction)
#EndIf
#EndAt
#At (%ControlEventHandling,%ListControl,'Accepted'),Priority(5500)
#Fix(%Control,%ListControl)
Get(%ControlFrom,Choice(%Control))
#EndAt
#At (%ControlEventHandling,%ListControl,'ScrollDown'),Priority(5500)
Clear(%Locatorvar)
#Fix(%Control,%ListControl)
If Choice(%Control)<Records(%ControlFrom)
Select(%Control,Choice(%Control)+1)
Post(Event:NewSelection,%Control)
End
#EndAt
#At (%ControlEventHandling,%ListControl,'ScrollUp'),Priority(5500)
#Fix(%Control,%ListControl)
Clear(%Locatorvar)
If Choice(%Control)>1
Select(%Control,Choice(%Control)-1)
Post(Event:NewSelection,%Control)
End
#EndAt
#At (%ControlEventHandling,%ListControl,'ScrollTop'),Priority(5500)
#Fix(%Control,%ListControl)
Clear(%Locatorvar)
Select(%Control,1)
Post(Event:NewSelection,%Control)
#Endat
#At (%ControlEventHandling,%ListControl,'ScrollBottom'),Priority(5500)
#Fix(%Control,%ListControl)
Clear(%Locatorvar)
Select(%Control,Records(%ControlFrom))
Post(Event:NewSelection,%Control)
#Endat
#At (%ControlEventHandling,%ListControl,'PageUp'),Priority(5500)
#Fix(%Control,%ListControl)
Clear(%Locatorvar)
If (Choice(%Control)- %Control{Prop:Items})>=1
Select(%Control,(Choice(%Control)- %Control{Prop:Items}))
Else
Select(%Control,1)
End
Post(Event:NewSelection,%Control)
#Endat
#At (%ControlEventHandling,%ListControl,'PageDown'),Priority(5500)
#Fix(%Control,%ListControl)
Clear(%Locatorvar)
If (Choice(%Control) + %Control{Prop:Items}+1)<Records(%ControlFrom)
If Choice(%Control)<%Control{Prop:Items}
Sel#=Choice(%Control)-1
Else
Sel# = (Choice(%Control)% %Control{Prop:Items})-1
.
Select(%Control,Choice(%Control)+ %Control{Prop:Items}+2-Sel#)
%Control{Prop:Selected} = %Control{Prop:Selected}-2
Else
Select(%Control,Records(%ControlFrom))
End
Post(Event:NewSelection,%Control)
#Endat
#!-----------------------------------------------------------------------------
#!EIPhandling goes here to the extend it is possilbe
#!-----------------------------------------------------------------------------
#!At(%WindowManagerMethodCodeSection,'Init','(),Byte'),Priority(8900)
#AT(%PrepareAlerts)
#Insert(%CreateEip)
%ListControl{Prop:Alrt,255}=MouseLeft2
%ListControl{Prop:Alrt,255}=EnterKey
%ListControl{Prop:Alrt,255}=F5Key
%ListControl{Prop:Alrt,255}=DeleteKey
#Endat
#AT(%AcceptLoopAfterFieldHandling)
#Declare(%Col)
Case Field()
Of %EIPControl
Case Event()
Of Event:Accepted
Put(%ListQueue)
Of Event:AlertKey
#$ This is how you can check for content in the first column
#$ Case ?ListControl{Prop:Column}
#$ Of 1
#$ Update(%EIPControl)
#$ If Not Contents(%EIPControl)
#$ Select(%EIPControl)
#$ Cycle
#$ End
#$ End
#Embed(%AdiQBeforeSavingData,'Before saving data')
Case Keycode() #<!what key has been pressed
Of UpKey #<!user has pressed the up arrow
Update(%EipControl) #<!Write to usevariable
Put(%ListQueue) #<!So store
Select(%ListControl,Choice(%ListControl)-1) #<!Select the above line
Post(Event:NewSelection,%ListControl)#<!the rest is handled in this event
Of DownKey #<!user has pressed down arrow
Update(%EipControl)
Put(%ListQueue) #<!So store
Select(%ListControl,Choice(%ListControl)+1) #<!Select the next line
Post(Event:NewSelection,%ListControl)!the resit is handled in this event
Of LeftKey
Update(%EipControl)
Put(%ListQueue) #<!So store
%Direction=%ListControl{Prop:Column}
%ListControl{Prop:Column}=%ListControl{Prop:Column}-1 #<!Select the previous column
Post(Event:NewSelection,%ListControl)#<!the resit is handled in this event
Of RightKey
Update(%EipControl)
Put(%ListQueue) #<!So store
%Direction = %ListControl{Prop:Column}
%ListControl{Prop:Column}=%ListControl{Prop:Column}+1
Post(Event:NewSelection,%ListControl)#<!the resit is handled in this event
Of EnterKey
Update(%EipControl)
Put(%ListQueue)
If Choice(%ListControl)=Records(%ListQueue)
%ListControl{Prop:Edit,%ListControl{Prop:Column}}=0
%ListControl{Prop:Column}=0
%EipActive = False
Else
#If(%EscOnEnter)
SetKeycode(EscKey)
#Else
SetKeycode(DownKey)
#EndIf
Post(Event:AlertKey,?)
End
Of ShiftTab
Update(%EipControl)
Put(%ListQueue)
SetKeycode(Leftkey)
Post(Event:AlertKey,?)
Of TabKey
Update(%EipControl)
Put(%ListQueue)
If %ListControl{Prop:Column}=%MaxColumns And Choice(%ListControl)<Records(%ListQueue)
%ListControl{Prop:Column}=1
Select(%ListControl,Choice(%ListControl)+1) #<!Select the next line
Post(Event:NewSelection,%ListControl)#<!the resit is handled in this event
Elsif %ListControl{Prop:Column}<%MaxColumns
SetKeycode(RightKey)
Post(Event:AlertKey,?)
Else
%ListControl{Prop:Edit,%LastValid}=0
%ListControl{Prop:Column}=0
%EipActive = False
End!if
Of EscKey
%ListControl{Prop:Edit,%ListControl{Prop:Column}}=0
%ListControl{Prop:Column}=0
%EipActive=False
Else
End!Case Keycode
If %EipActive = False #<!Turned off
#Embed(%AdiQAfterFinishingUpdate,'After finishing Queue update'),Where(%ActiveTemplateInstance)
Select(%ListControl,Choice(%ListControl))
End!if
End!Case event
End!Case Field
#Endat
#!-----------------------------------------------------------------------------
#!local groups
#!-----------------------------------------------------------------------------
#Group(%CreateEip)
If Not %EipControl
%EipControl = Create(0,Create:entry)
%EipControl{Prop:Alrt,255}=UpKey #<!
%EipControl{Prop:Alrt,255}=DownKey #<!
%EipControl{Prop:Alrt,255}=LeftKey #<!
%EipControl{Prop:Alrt,255}=RightKey #<!normal behaviour
%EipControl{Prop:Alrt,255}=EnterKey #<!Save and move down a column
%EipControl{Prop:Alrt,255}=TabKey #<!moving through list and save
%EipControl{Prop:Alrt,255}=ShiftTab #<!Backwards please
%EipControl{Prop:Alrt,255}=EscKey #<! used for trapping cancel
End!if
#Group(%LocatorHandling),auto
#Declare(%Looped)
#Declare(%IfElsif)
#Set(%Looped,%False)
#Fix(%Control,%ListControl)
If %LocatorVar
#For(%SortOrders)
#If (%Looped=%True)
#Set(%IfElsif,'Elsif')
#Else
#Set(%IfElsif,'If')
#Set(%Looped,%True)
#EndIf
%IfElsif %SortCondition
#Insert(%IncOrWhat)
#EndFor
#If(%Looped=%True)
End
#EndIf
End!if
#Group(%IncOrWhat)
#case(%LocatorIs)
#Of ('UPPER')
%Locator=Upper(%LocatorVar)
#Of ('lower')
%Locator=Lower(%LocatorVar)
#of ('Sentence')
%Locator=Upper(%LocatorVar[1])&Lower(%LocatorVar[2:Len(%LocatorVar)])
#Else
%Locator = %LocatorVar
#EndCase
#If(%Inc)
N#=Position(%ControlFrom)
Get(%ControlFrom,N#)
If Inrange(N#,1,Records(%ControlFrom))
Select(%Control,N#)!Pointer(%ControlFrom))
.
Get(%ControlFrom,Choice(%Control))
#Else
Get(%ControlFrom,%Locator)
If Not Errorcode()
Select(%Control,Pointer(%ControlFrom))
End
Get(%ControlFrom,Choice(%Control))
#EndIf
#Return