Помогите с ABC классами

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Igor
Бывалый
Сообщения: 75
Зарегистрирован: 08 Июль 2005, 11:03
Откуда: Королев

Сообщение Igor »

Виноват в конце рабочего дня глаз замылился :cry:
Есть такой 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
mike_ch
Бывалый
Сообщения: 62
Зарегистрирован: 11 Июль 2007, 14:21
Откуда: Беларусь, Минск

Сообщение mike_ch »

Подскажите на верном ли пути.
необходимо просто програмно закрыть окно (завершить процедуру).
close(window) и post(event:closewindow) - работают
но почему-то мне кажется что это нерпавильно
зачем тогда нужен метод thiswindow.takecloseevent(), который кстати не работает, ну в смысле не завершает процедуру
я наверно чего-то не догоняю, объясните pls
Аватара пользователя
NickTsigouro
Новичок
Сообщения: 5
Зарегистрирован: 16 Июнь 2006, 13:00
Откуда: Москва
Контактная информация:

Сообщение NickTsigouro »

1. close(window) - не правильно, post(event:closewindow) - правильно.
2. Методы Take... существуют для того, чтобы ты мог написать свою обработку событий, перехватив управление до и/или после работы PARENT метода. Например, в TakeCloseEvent можешь запретить закрытие окна.
Если ты в наследнике WM (ThisWindow) ничего не написал, то ничего и не будет. Окно закрывается не потому, что вызван TakeCloseEvent, а наоборот, TakeCloseEvent вызвывается потому, что окно получило EVENT:CloseWindow и закрывается.
WBR, Nick Tsigouro
mike_ch
Бывалый
Сообщения: 62
Зарегистрирован: 11 Июль 2007, 14:21
Откуда: Беларусь, Минск

Сообщение mike_ch »

NickTsigouro писал(а):1. close(window) - не правильно, post(event:closewindow) - правильно.
2. Методы Take... существуют для того, чтобы ты мог написать свою обработку событий, перехватив управление до и/или после работы PARENT метода. Например, в TakeCloseEvent можешь запретить закрытие окна...
Спасибо! Немного мозг прояснился после вашего ответа. Буду дальше мучать ABC.
NewUser
Старожил
Сообщения: 230
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Сообщение NewUser »

Для того, что бы не дать закрыть окно, надо в:
Local Objects – Abs Objects – Window Manager – TakeCloseEvent
после [Priority 5001]
прописать что-то типа:
ReturnValue = PARENT.???
Если да, то что надо вернуть в ReturnValue?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3285
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

Сообщение Дед Пахом »

Level:Notify
С уважением, ДП
NewUser
Старожил
Сообщения: 230
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Сообщение NewUser »

Да, с этим Level:Notify не закрывается хоть ты что…. :)
Аватара пользователя
Tolusha
Активист
Сообщения: 123
Зарегистрирован: 11 Январь 2006, 16:50
Откуда: Украина, г. Черкассы
Контактная информация:

Сообщение Tolusha »

NewUser писал(а):Для того, что бы не дать закрыть окно, надо
Надо в WindowsEvents в событии Event:CloseWindow поставить Cycle.
Анатолий.
NewUser
Старожил
Сообщения: 230
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Сообщение NewUser »

Да, есть из чего выбирать… :D
А можно ли какой-нибудь Event куда запостить, или Cycle прикрутить, что бы запретить появление ниспадающего меню, появляющегося при щелчке левой кнопки мыши по иконке окна?
Аватара пользователя
Tolusha
Активист
Сообщения: 123
Зарегистрирован: 11 Январь 2006, 16:50
Откуда: Украина, г. Черкассы
Контактная информация:

Сообщение Tolusha »

Очень мишает?
Анатолий.
NewUser
Старожил
Сообщения: 230
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Сообщение NewUser »

Мне то нет, а вот благодарным юзерам….
Имеется окно, которое не маштобируется, не закрывается, не максимизируется. И очень странно видеть пользователю активное меню с этими командами….
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3285
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

Сообщение Дед Пахом »

надо снять галочки System menu и Maximize box, а также очистить поле Icon в форматтере окна-закладка Extra
С уважением, ДП
NewUser
Старожил
Сообщения: 230
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Сообщение NewUser »

Да, это так. Но тогда будет отсутствовать иконка – это уже очень печально.
Эмулировать заголовок окна с иконкой – мне не представляется возможным – использую CoolFrames. Подумал, что можно если не выключить само меню, так хотя бы задисэйблить соответствующие пункты его.
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3285
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 48 раз
Контактная информация:

Сообщение Дед Пахом »

Задизейблить пункт "Размер" - выбрать Frame Type = Double и Single, вобщем не Resizable. А пункт "Закрыть" - надо через WinAPI убрать у окна крестик. Но вообще я бы такой ерундой не занимался.
С уважением, ДП
NewUser
Старожил
Сообщения: 230
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 4 раза

Сообщение NewUser »

У этого окна и не стоит Resizable. Frame Type = Double. Выклчючен и Maximize. Но, тем не менее – при щелчке по иконке окна – в ниспадающем меню присутствует весь джентльменский набор пунктов - Restore, Size, Minimize, Maximize. Причина всего этого в применении шаблона CoolFrame. Насколько я понял – он плевать хотел на все установки окна. Вот бы узнать – как с этим можно побороться.
Ответить