powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / По поводу префикса пемеренных m.
48 сообщений из 48, показаны все 2 страниц
По поводу префикса пемеренных m.
    #35075746
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

Скажите, кто знает, есть ли смысл в программе указывать сей префикс в операциях, присущих исключительно переменным, таким как, например, присвоение значения (=) или RELEASE?
Понятно что при ссылке на перменную указание префикса ускоряет/оптмизирует работу, а вот что по поводу вопроса, инетересно.
К примеру ясно что так выгоднее:
Код: plaintext
    lcRes = m.lcTextPart1 + LTRIM(m.lcTextPart2)
но есть ли смысл писать вот так (кроме, скажем, принципа там... красивости кода и тп):
Код: plaintext
1.
2.
    m.lcRes = m.lcTextPart1 + LTRIM(m.lcTextPart2)
    LOCAL m.lcRes, m.lcTextPart1, m.lcTextPart2
    RELEASE m.lcRes, m.lcTextPart1, m.lcTextPart2

спасибо!
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075749
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пеМЕРЕнных = пеРЕМЕных
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075780
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторускоряет/оптмизирует работу

откуда информация?


Специфрикатор "m." для переменных памяти используется только в тех случаях когда имя переменной совпадает с именем поля в таблице (при создании переменных командой SCATTER MEMVAR).

....

Cпецификатор «m.» перед именем переменной при присвоении значений перемен-ным и при сравнении значений переменных мы не используем. Спецификатор «m.» перед именем переменной мы используем только в тех случаях, когда имя переменной совпадает с именем поля в таблице и при создании переменных командой SCATTER MEMVAR (в старших версиях FoxPro имеется опция в команде Scatter, которая позволяет считывать зна-чения записи курсора в объект Empty, что дает возможность не использовать спецификатор «m.») . Данное соглашение призволит исключить случаи совпадения имен переменных и имен полей в таблицах и курсорах
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075800
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://fox.wikis.com/wc.dll?Wiki~EssentialMDot~VFP
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075804
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну правильно, я так по памяти скажу, типа если указываешь в ссылке имя перменной, то фокса будет СНАЧАЛА искать поле в текущей бд с таким именем, а затем, еси не найдет, будет искать такую перменную. если ты сразу скажешь что это перменная, то и поиск в бд исключатеся = ускорение. вроде так...
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075819
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и + стандарт
http://www.craigberntson.com/Articles/kb015.htm
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075824
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
впрочем спасибо за ответ - в операциях, присущих исключительно переменным, идентификатор m. не нужен (он там, впрочем и не помешает само собой).
А вот в операциях с макроподстановкой так и вообще, как я заметил, идентификатор m. почему-то вреден для здоровья
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35075828
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть соглашение
по им-ю перем-х а есть соглашение по им-ю полей курсоров и таблиц

если придерживаться этих соглашений,
то именованных перем-х и полей не будет
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35076220
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл правил не столько в самих правилах, сколько в экономии мышления. Не надо задумываться, а что это программист имел в виду в данном случае? Нет, решение, разумеется, будет найдено. Проблема только в том, что надо будет затратить дополнительные усилия для того, чтобы это решение найти.

Если всегда придерживаться правил (не важно каких, важен сам факт наличия правил), то это позволяет сэкономить время и силы программиста. Он всегда будет знать, о чем же в данном случае идет речь, поскольку есть вот такое правило.

Если же "здесь придерживаться, а здесь - нет", то возвращаемся к тому, с чего начали. Каждый раз придется затрачивать дополнительные усилия для понимания кода.

CTAC-KOА вот в операциях с макроподстановкой так и вообще, как я заметил, идентификатор m. почему-то вреден для здоровья
При использовании символа макроподстановки "&" первая точка после этого символа воспринимается как символ конкатенации (сложения) символьных строк. Т.е. сначала выполняется макроподстановка, потом к ее результату прибавляется то, что стоит после точки.

Например

Код: plaintext
1.
2.
3.
4.
5.
aa= 1 
aa1= 2 
bb="aa"
?&bb	&& вернет значение  1  из переменной aa
?&bb. 1 	&& вернет значение  2  из переменной aa1

Т.е. в команде макроподстановки проблема не в префиксе, а в точке. Точнее, в особенностях работы самой команды макроподстановки. Использовать префикс можно, но такими способами

Код: plaintext
1.
2.
3.
4.
?m.&bb
?m.&bb. 1 
?evaluate(m.bb)
?evaluate(m.bb+"1")
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35083555
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМТ.е. в команде макроподстановки проблема не в префиксе, а в точке. Точнее, в особенностях работы самой команды макроподстановки. Использовать префикс можно, но такими способами

Код: plaintext
1.
2.
3.
4.
?m.&bb
?m.&bb. 1 
?evaluate(m.bb)
?evaluate(m.bb+"1")
Ну и еще точка заменяема на "->"
Т.е. можно вот так:
Код: plaintext
?&m->myvar
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35084164
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага, вот как! Спасибо, буду знать!

я уже заметил что именно первую точку после & фокс обычно "съедает", когда обращался к свойствам/методам объектов через макро. Однако у меня все получилось, когда я перед точкой ставил пробел, т.е.:
(oListBox = SomeListBox)

пробовал безуспешно и с немалым удивлением :)
thisform.&oListBox.Init - не канает, т.к. на выходе получицо thisform.SomeListBoxInit

так сейчас у меня:
thisform.&oListBox .Init - проканает, т.к. на выходе получицо thisform.SomeListBox.Init

а вот так, видимо, будет правильнее (я уже такое видел, но не понял зачем там 2 точки)?
thisform.&oListBox..Init - на выходе получицо thisform.SomeListBox.Init
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35084222
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(я уже такое видел, но не понял зачем там 2 точки)?
thisform.&oListBox..Init - на выходе получицо thisform.SomeListBox.Init
Первая точка завершает макоподстановку, вторая должна тут быть по месту.
А лучше не заниматься всеми этими извращениями и хорошенько продумывать свои проги.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085446
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, без мп - никак! практически все это используют :)
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085469
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторбез мп - никак!

так, ради интереса ...
короткий пример,
а я покажу как без
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085540
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не, без мп - никак! практически все это используют :)
Та шо ви бачите?! Кто бы мог подумать! И как это многие за много же лет обошлись без нее?!
Наверно, они что-то не так делают. :)
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085611
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KOне, без мп - никак! практически все это используют :)
Поаккуратней на религиозные темы высказывайся, а то война начнется страниц на пять
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085621
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov. не, без мп - никак! практически все это используют :)
Та шо ви бачите?! Кто бы мог подумать! И как это многие за много же лет обошлись без нее?!
Наверно, они что-то не так делают. :)
В принципе можно и без префикса переменной, но.. как только вы начинаете писать свое приложение с использованием классов, то без нее практически уже не обойтись. Открые курсоры и их поля, фактически, представляются как PUBLIC переменные в пределах своих DataSession и нет никакой гарантии, что где-то в методе вашего класса у нас переменная не совпадет с полем текущего курсора (таблицы).
С уважением, Алексей.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085628
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, ладно, давайте не будем обсуждать все используют мп или многие или только я :)
Лучше скажите - обязательно ли завершать точкой мп?
т.е.
Код: plaintext
WITH this.parent.&lcLenLabel
или
Код: plaintext
WITH this.parent.&lcLenLabel.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085659
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Она завершается точкой или пробелом. Ни то, ни другое читабельности ей не добавляет.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K... нет никакой гарантии, что где-то в методе вашего класса у нас переменная не совпадет с полем текущего курсора (таблицы).
С уважением, Алексей.
При использовании венгерской нотации гарантия 100%. Сложнее защититься от использования одноименных курсоров.
Для переменных название строится [видимость][тип][название]
для полей таблицы и свойств объектов [тип][название]
где [видимость] - область видимости (g, p, t, l)
например:
lcName - локальная символьная переменная
cName - символьное поле из текущего алиаса.
никаких m. никогда не использую. Проблемы бывают иногда если в LOCAL локальную переменную добавить забуду.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085672
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сложнее защититься от использования одноименных курсоров.
Сей проблем довольно неплохо решается сессиями данных. Но ими надо уметь пользоваться. :)
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085688
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимо авторбез мп - никак!
так, ради интереса ...
короткий пример,
а я покажу как безну давайте. это в любом случае - хорошо и полезно, чем меньше мп, тем надо понимать стабильнее прога?
знач намалевал я класс текстбокса. захотел чтоб ён мне символы считал...
кастомный метод CharsCount
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
LPARAMETERS m.llHide
IF NOT (VARTYPE(this.Value)="C" AND this.MaxLength> 0 ) OR this.ReadOnly
   RETURN .F.
ENDIF

* àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
IF EMPTY(this.WasSetConfirm)
   this.Wassetconfirm = SET("CONFIRM")
   SET CONFIRM ON
ENDIF

* 2hide or not2hide da counter
IF VARTYPE(m.llHide) = "U"
   m.llHide = .F.
ENDIF

LOCAL m.lcLenLabel, m.lnWidth, m.lcWasSet
lcLenLabel = this.Parent.Name + this.Name + "LenLabel"
IF m.llHide
   IF VARTYPE(this.parent.&lcLenLabel)="O"
      this.parent.&lcLenLabel..Visible = .F.
      * àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
      IF !EMPTY(this.WasSetConfirm)
         lcWasSet = this.WasSetConfirm
         SET CONFIRM &lcWasSet
         this.Wassetconfirm = ""
      ENDIF
   ENDIF
ELSE
   IF VARTYPE(this.parent.&lcLenLabel)#"O"
      this.parent.AddObject(m.lcLenLabel,"Label")
      WITH this.parent.&lcLenLabel
         .Left = this.Left+ 5 
         .Top = this.top- 5 
         .BackStyle =  1 
         .FontSize =  6 
      ENDWITH
   ENDIF
   WITH this.parent.&lcLenLabel
      .Caption = IIF(this.MaxLength> 0 ,LTRIM(STR(LEN(RTRIM(this.value))))+" / "+LTRIM(STR(this.MaxLength)),"")
      .Visible = .T.
      .AutoSize =  1 
      m.lnWidth = .Width
      .AutoSize =  0 
      .Width = m.lnWidth
      .Height =  9 
      .Refresh
   ENDWITH
ENDIF
RELEASE m.lcLenLabel, m.lnWidth, m.lcWasSet
он вызываеццо с GotFocus
Код: plaintext
1.
* Ñ÷åò÷èê ñèìâîëîâ
this.CharsCount()

и с LostFocus
Код: plaintext
1.
* Ñ÷åò÷åã ñèìâîëîâ
this.Charscount(.T.)
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085729
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну как обычно! Вместо того, чтоб работать со ссылкой на объект, работаем с именем объекта.

Код: plaintext
MyLabel = eval(this.Parent.Name + this.Name + "LenLabel")
И дальше вместо this.parent.&lcLenLabel использовать MyLabel.

Это первое и, скажем так, достаточно общее решение.
Но у меня есть подозрения, что это всего лишь this.LenLabel
Угадал?
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085741
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KO...
знач намалевал я класс текстбокса. захотел чтоб ён мне символы считал...

Да уж, точно намалевал
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085751
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если к TextBox привязан Label, то надо их собирать в класс-контейнер. Как понимаю у тебя еще есть жесткие правила именования объектов чтобы они правильно меж собой взаимодействовали?
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085807
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.Ну как обычно! Вместо того, чтоб работать со ссылкой на объект, работаем с именем объекта.

Код: plaintext
MyLabel = eval(this.Parent.Name + this.Name + "LenLabel")
И дальше вместо this.parent.&lcLenLabel использовать MyLabel.

Это первое и, скажем так, достаточно общее решение.
Но у меня есть подозрения, что это всего лишь this.LenLabel
Угадал?хорошо, с evaluate я понял, исправлюсь (поди MyLabel нада loMyLabel поименовати?), а че с SET CONFIRM-ом?
this.LenLabel - это мсотря кто этот this - еси контейнер, то да. но дальше составное имя - имя контейнера+имя_тект_бокса+_"LenLabel". Ваще еси контейнер - форма Form1, а текстбокс на ём - Textbox1 то получиццо ващето
this.parent.Form1Textbox1LenLabel

Dima TЕсли к TextBox привязан Label, то надо их собирать в класс-контейнер. Как понимаю у тебя еще есть жесткие правила именования объектов чтобы они правильно меж собой взаимодействовали?А зачем нам контейнер?
смысёл строки
Код: plaintext
lcLenLabel = this.Parent.Name + this.Name + "LenLabel"
в том, чтобы для каждава текстбокса создать уникально именованный лейбл-счетчег. да и все. А еси он не нуж0н, то и не создаеццо. никаких взаимоСОдействий нема
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085824
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и какие проблемы?
Код: plaintext
1.
2.
3.
4.
if lcWasSet=='ON'
  Set confirm on
else
  Set confim off
endif
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085843
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как параметр обзывается???

tlValue
tnValue

t вначале - лок-й парам-р

строка
IF VARTYPE(m.llHide) = "U" - не нужна

по всему твоему коду
m. не нужны
release для лок-х перем-х аналогично - мертвому припарка

где-то конечно нужно создать св-во-ссылку на объект

если уж макроп-ка необходима - то ее делают один раз
loObj = ....
и дальше ссылаются на loObj

в Вашем случае, если уж по имени искать собрались,
что как Вам уже сказали в ООП не делают, то
обратите вним-е на getpem
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085866
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример ООП без макроп-к
для примера.
почерпни для себя синтаксис и подход к разр-ке
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
637.
638.
639.
640.
641.
642.
643.
644.
645.
646.
647.
648.
649.
650.
651.
652.
653.
654.
655.
656.
657.
658.
659.
660.
661.
662.
663.
664.
665.
666.
667.
668.
669.
670.
671.
672.
673.
674.
675.
676.
677.
678.
679.
680.
681.
682.
683.
684.
685.
686.
687.
688.
689.
690.
691.
692.
693.
694.
695.
696.
697.
698.
699.
700.
701.
702.
703.
704.
705.
706.
707.
708.
709.
710.
711.
712.
713.
714.
715.
716.
717.
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
729.
730.
731.
732.
733.
734.
735.
736.
737.
**************************************************
DEFINE CLASS cus_refresh AS custom


	Height =  17 
	Width =  20 
	*-- Таймер, используется для обновления данных на форме
	orefreshtimer = ""
	*-- ID редактируемого документа
	nlinkdoc =  0 
	nparentobj_codelink =  0 
	naccess =  0 
	*-- Наименование док-та, используемое в сообщениях
	cdocname = ""
	*-- Строка, используемая в запросе
	cselectrecordssqlcmd = ""
	*-- Объект, в которм отображаются записи из курсора в котором они обновляются
	osourcerecordscontrol = .F.
	*-- Имя объекта, в котором отображаются обновляемые записи
	csourcerecordscontrol = .F.
	*-- список имен полей (через запятую), которые нужно заменить на сервере при групповой замене (метод GroupUpdate)
	ccadupdatablefieldlist = ""
	*-- Имя таблицы на SQL сервере, в которую вносятся изменения
	csql_updatetablename = ""
	*-- ключевое поле в таблице, в которую вносим изменения (используется в методе GroupUpdate)
	ccadkeyfieldlist = "LINK"
	ncadconnection =  0 
	ccadcursorschema = ""
	Name = "cus_refresh"

	*-- имя настройки для получения настроенного интервала обновлений
	cpropertynamerefreshtimerinterval = .F.
	cdocrevision = .F.
	clockrevision = .F.

	*-- имя буферной таблицы
	csql_tmptablename = .F.

	*-- Наименование объета, которому принадлежит документ
	cparentobjname = .F.

	*-- обновляемый локальный курсор
	clocalalias = .F.

	*-- Строка, которая используется в методе ChangeRecordInDoc
	cupdaterecordsqlcmd = .F.

	*-- Код документа в объектной структуре
	cobj_name = .F.

	*-- Уникальный идентификатор -код просесса (позволяет удалить затем группу блокировок, имеющих совпадающий код)
	cprocessid = .F.


	*-- Вспомогательный метод. позволяет заблокировать обновление в необходимых случаях, (до полного завершения процессов)
	PROCEDURE lockrefresh
		this.oRefreshTimer.Enabled = .f.
	ENDPROC


	*-- Вспомогательный метод. снимает ранее наложенную блокировку  периодического обновления
	PROCEDURE unlockrefresh
		this.oRefreshTimer.Enabled = .t.
	ENDPROC


	*-- Метод пытается наложить блокировку на документ, в случае успеха возвращает .t.
	PROCEDURE setdoclock
		*!*	Флаг блокировки:
		*!*	Значение
		*!*	Тип блокировки
		*!*	 1  Монопольный доступ
		*!*	 2  Совместный доступ
		*!*	 3  Непосредственная модификация документа при совместном доступе 
		*!*	(устаналвивается только при наличии ранее установленной совместной блокировки  
		*!*	и при ревизии документа не превышающей ревизию ранее установленной блокировки)
		lparameters tnLock
		if empty(tnLock)
			return .f.
		endif
		local lcSqlCmd, lcTempAlias, lcRevision
		text to lcSqlCmd noshow textmerge pretext  15 
			DocumentLock
				@Operation  = 'SET',
				@LinkDoc  = <<ltrim(str(this.nLinkDoc))>>,
				@Object = <<ltrim(str(this.nParentObj_codeLink))>>,
				@Lock  = <<ltrim(str(tnLock))>>,
				<<iif(!empty(this.cProcessId),"@Processes = '"+ this.cProcessId+"',", "")>>
				@OutputCursor =  1 
		endtext
		lcTempAlias = sys( 2015 )
		if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
			select (lcTempAlias)
			if nRet= 1 
				this.cDocRevision = RevDoc
				this.cLockRevision = RevLock
			else
				use in select(lcTempAlias)
				return .f.
			endif
			use in select(lcTempAlias)
		else
			return .f.
		endif
		return .t.
	ENDPROC


	PROCEDURE cparentobjname_assign
		LPARAMETERS tcNewVal
		if vartype(tcNewVal)='C' and !empty(tcNewVal)
			THIS.cParentObjName = tcNewVal
			this.nParentObj_codeLink = j_getobject(tcNewVal)
		endif
	ENDPROC


	*-- Метод позволяет получить значение текущей ревизии документа
	PROCEDURE getdocrevision
		local lcSqlCmd, lcTempAlias, lcRevision
		text to lcSqlCmd noshow textmerge pretext  15 
			DocumentRevision
		               @operation = 'GET',
		               @LinkDoc = <<ltrim(str(this.nLinkDoc))>>,
		               @Object = <<ltrim(str(this.nParentObj_codeLink))>>,
		               @OutputCursor =  1 
		endtext
		lcTempAlias = sys( 2015 )
		if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
			select (lcTempAlias)
			if nRet= 1 
				lcRevision = revDoc
			    this.nAccess = 	access
			else
				use in select(lcTempAlias)
				return .f.
			endif
			use in select(lcTempAlias)
		else
			return .f.
		endif
		return lcRevision
	ENDPROC


	PROCEDURE naccess_assign
		LPARAMETERS tnNewVal
		THIS.nAccess = tnNewVal
		if bittest(tnNewVal, 1 )
			local lcMessage
			text to lcMessage noshow textmerge pretext  7 
				Редактирование данного документа:"<<this.cDocName>>"
				в многопользовательском режиме невозможно!
			endtext
			messagebox( lcMessage,  16 , PCNAMEAPP + "Внимание")
			* закрываем форму, на которой лежит этот объект
			if type("this.parent")="O" and pemstatus(this.parent, "release",  5 )
				this.parent.Release()
			endif
		endif
	ENDPROC


	*-- переносит изм-я в лок-й курсор, привязанный к гриду или другому объекту
	PROCEDURE updatelocalcursor
		lparameters tcAliasFrom
		if !empt(this.cLocalAlias) and !empty(tcAliasFrom) and used(tcAliasFrom)
			local lnRecno
			lnRecno = recno(this.cLocalAlias)
			this.cmdUpdateLocalCursor(this.cLocalAlias, tcAliasFrom)
			if !empty(lnRecno) and recno(this.cLocalAlias)<>lnRecno
				select (this.cLocalAlias)
				locate record lnRecno
			endif
			use in select(tcAliasFrom)
		endif
	ENDPROC


	*-- Фоксовая команда для  обновления записи в локальном курсоре
	PROCEDURE cmdupdatelocalcursor
		lparameters tcTempAlias_refrTo, tcAliasFrom
		*  пример апдейта (необходимо переписать для каждой формы на свой)
		*!*	update t1 set t1.inreys=t2.inreys, t1.username=t2.username ;
		*!*						from (tcTempAlias_refrTo) t1, (tcAliasFrom) t2 ;
		*!*						where t1.link=t2.link
	ENDPROC


	*-- Метод внесения изменений в конкретную запись (строку детализации) документа
	PROCEDURE changerecordindoc
		lparameters tnLink, tuOldValue, tuNewValue
		this.lockRefresh()
		if this.BeforeChangeRecordInDoc(tnLink, tuOldValue) and this.CreateUpdateCmd(tnLink,tuNewValue)
			local llSuccess
			* изменяем значение
			if l_sqlexec(,this.cUpdateRecordSqlCmd)> 0  and this.AfterUpdateSql()
				llSuccess = .t.
			endif
			this.UnlockRefresh()
			return llSuccess
		else
			this.UnlockRefresh()
			return .f.
		endif
	ENDPROC


	*-- формирователь строки cUpdateRecordSqlCmd, используемой в методе ChangeRecordInDoc
	PROCEDURE createupdatecmd
		* метод формирует строку, используемую в методе 
		lparameters tnLink, tuValue
		* для каждого документа этот апдейт должен быть исправлен
		* пример
		*!*		text to this.cUpdateRecordSqlCmd noshow textmerge pretext  15 
		*!*			update <<this.cSql_updateTableName>> set marker =  1 , inreys = <<ltrim(str(tuValue))>>
		*!*					where link=<<ltrim(str(tnLink))>>
		*!*		endtext
		return .t.
	ENDPROC


	*-- Метод выполняется до выполнения метода ChangeRecordInDoc   если этот метод вернет ложь, то никакого апдейта выполнено не будет
	PROCEDURE beforechangerecordindoc
		lparameters tnLink, tuOldValue
		* необходимо проверять перед изменением
		* редактировалась ли запись кем-то
		return .t.
		*!*	local lcSqlCmd, lcTempAlias
		*!*	local lcTempAlias
		*!*	lcTempAlias = sys( 2015 )
		*!*	* смотрим, не изменил ли еще кто-то значение
		*!*	text to lcSqlCmd noshow textmerge pretext  15 
		*!*		select marker, username
		*!*			from <<this.cSql_tmpTableName>>
		*!*					where link=<<ltrim(str(tnLink))>>
		*!*	endtext
		*!*	if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
		*!*		select (lcTempAlias)
		*!*		if marker<>tnOldValue
		*!*			with this
		*!*				.UpdateLocalCursor(lcTempAlias)
		*!*				.aGrid1.refresh()
		*!*			endwith
		*!*			*messagebox('Значение изменено!')
		*!*			return .f.
		*!*	    endif
		*!*	else
		*!*		return .f.
		*!*	endif 
		*!*	return .t.
	ENDPROC


	PROCEDURE refreshdoc
		lparameters tlRefreshAlways
		* tlRefreshAlways = .t.
		* производит обновление без сравнения .cDocRevision > .cLockRevision
		with this
			local lcAllertMessage
			text to lcAllertMessage noshow textmerge pretext  7 
				Другим пользователем закрыт доступ к документу '<<.cDocName>>'.
				Выйти из режима редактирования?
			endtext
			if !.SetDocLock( 2 ) and MESSAGEBOX(lcAllertMessage, 68 ,'Внимание')= 6  ;
				and type("this.parent")="O" and pemstatus(this.Parent, "release",  5 )
					this.parent.Release()
			endif
			if tlRefreshAlways or (.cDocRevision > .cLockRevision)
				* кто-то изменил документ,
				* нужно сделать на клиенте данные актуальными
				.ShowWaitMsg()
				local lcSqlCmd
				lcSqlCmd = .cSelectRecordsSqlCmd
				if !empty(lcSqlCmd)
					local lcTempAlias
					lcTempAlias = sys( 2015 )
					if l_sqlexec(, lcSqlCmd, lcTempAlias)> 0 
						* получили назад курсор
						this.UpdateLocalCursor(lcTempAlias)
						if vartype(.oSourceRecordsControl)='O' and pemstatus(.oSourceRecordsControl,'tt', 5 )
							.oSourceRecordsControl.refresh()
						endif
					endif
				endif
				.CleareWaitMsg()
			endif
		endwith
	ENDPROC


	*-- Метод для отображения процесса обновления
	PROCEDURE showwaitmsg
		* метод может быть переписан под конкретные нужды
		if type("this.parent")="O" and pemstatus(this.Parent, "OleStatusBar",  5 )
			this.Parent.OleStatusBar.Panels( 1 ).Text = "Ждите... Происходит обновление данных ..."
		endif
	ENDPROC


	*-- Метод очистки сообщений, используемых для отображения процесса обновления
	PROCEDURE clearewaitmsg
		* метод может быть переписан под конкретные нужды
		if type("this.parent")="O" and pemstatus(this.Parent, "OleStatusBar",  5 )
			this.Parent.OleStatusBar.Panels( 1 ).Text = ""
		endif
	ENDPROC


	*-- формирователь строкиcSelectRecordsSqlCmd, используемой в методе RefreshDoc
	PROCEDURE createselectcmd
		* метод переписывается под конкретные нужды
		* формирователь строки cSelectRecordsSqlCmd,
		* используемой в методе RefreshDoc
		* этот запрос возвращает назад все актуальные записи в док-те
		* пример:
		*!*	text to this.cSelectRecordsSqlCmd noshow textmerge pretext  15 
		*!*		Exec select_doc_x401002_mu  @nMode =  2 , @nLink = <<ltrim(str(this.nLinkDoc))>>, @cInto = <<this.cSql_tmpTableName>>
		*!*	endtext 
		return .t.
	ENDPROC


	PROCEDURE csourcerecordscontrol_assign
		LPARAMETERS tcNewVal
		if empty(tcNewVal) or vartype(tcNewVal)<>C
			this.cSourceRecordsControl  = tcNewVal
			try
				this.oSourcerecordscontrol = evaluate(tcNewVal)
			catch
				messagebox('Ошибка привязки объекта cus_Refresh к объекту отображ-я данных.', 16 )
			endtry
		endif
	ENDPROC


	*-- Метод снимает блокировку с документа, в случае успеха возвращает .t.
	PROCEDURE unlockdoc
		local lcSqlCmd, lcTempAlias
		text to lcSqlCmd noshow textmerge pretext  15 
			Exec DocumentLock
				@Operation  = 'DEL',
				@LinkDoc  = <<ltrim(str(this.nLinkDoc))>>,
				@Object = <<ltrim(str(this.nParentObj_codeLink))>>,
				@OutputCursor =  1 
		endtext
		* Exec select_doc_x401002_mu  @nMode =  3 , @cInto = <<this.cSql_tmpTableName>>
		lcTempAlias = sys( 2015 )
		if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
			select (lcTempAlias)
			if nRet<> 1 
				use in select(lcTempAlias)
				return .f.
			endif
			use in select(lcTempAlias)
		else
			return .f.
		endif
		return .t.
	ENDPROC


	PROCEDURE groupupdate
		* tuValue - передаем и разбираем в методе cmdGroupUpdateLocalCursor
		lparameters tuValue &&одно значение, или объект-пакет со свойствами - значениями
		if empty(this.cCADkeyFieldList) or empty(this.cCADupdatableFieldList)
			messagebox('КАД. Неверно настроены свойства у класса!', 16 )
			return .f.
		endif
		local lnConnection
		if this.nCadConnection> 0 
			lnConnection = this.nCadConnection
		else
			local llSuccess
			for lnConnection= 1  to  1000 
				if sqlexec(lnConnection,"select @@SERVERNAME")> 0 
					llSuccess = .t.
					exit
				endif 
			endfor
			use in select("sqlresult")
			lnConnection = iif(llSuccess, lnConnection,  0 )
		endif
		if lnConnection> 0 
			this.lockRefresh()
			this.ShowWaitMsg() 
			local loCad
			loCad = createobject('cad_updater')
			if vartype(loCad)='O'
				with loCad
					.DataSource     	= cast(lnConnection as integer)
					text to .SelectCmd noshow textmerge pretext  15 
						select <<this.cCADkeyFieldList>>, <<this.cCADupdatableFieldList>>
							from <<this.cSql_updateTableName>>
					endtext
					.Tables             = this.cSql_updateTableName
					.keyFieldList		= this.cCADkeyFieldList
					.cursorsChema 		= this.cCADcursorSchema  &&"Fld c(16)"
					.UpdatableFieldList = this.cCADupdatableFieldList &&'Fld1, Fld2'
					local laFieldsArr( 1 ), lnUpdFields, lnField, lcField, lcLocalFldsUpdCmdADD
					lnUpdFields = alines(laFieldsArr,.UpdatableFieldList,',')
					* формируем строку
					.updateNameList 	=  this.cCADkeyFieldList + ' ' + .Tables+'.'+this.cCADkeyFieldList
					lcLocalFldsUpdCmdADD = ''
					for lnField= 1  to lnUpdFields
						lcField = alltrim(laFieldsArr(lnField))
						if !empty(lcField)
							lcLocalFldsUpdCmdADD = lcLocalFldsUpdCmdADD + iif(!empty(lcLocalFldsUpdCmdADD) ,', ','') + lcField + '=t2.' + lcField
							.updateNameList = .updateNameList +iif(!empty(.updateNameList),', ','') + lcField + ' ' + .Tables+'.'+lcField
						endif
					endfor
					if .CursorFill(!empty(.cursorschema)) && тянем таблицу с сервера
						* вносим изменения в курсор КАДа
						local lnLocalRecno, lnSqlTranOld
						lnLocalRecno = recno(this.cLocalAlias)
						if this.cmdGroupUpdateLocalCursor(loCad,tuValue) 
							if !empty(lnLocalRecno) and recno(this.cLocalAlias)<>lnLocalRecno
								select (this.cLocalAlias)
								locate record lnLocalRecno
							endif
							if !empty(getNextModified( 0 ,.Alias))
								* если шо-то потрогали
								* сохраняем изменения на сервер
								lnSqlTranOld = sqlgetprop(lnConnection,"Transactions")
								if sqlsetprop( lnConnection, "Transactions",  2 )= 1 
									if !tableupdate(.t.,.t.,.Alias)
										* ошибка, не смогли сохранить изменения на сервер
										=sqlrollback(lnConnection)
										local laErrors, lcErrMessage
										=aerror(laErrors)
										text to lcErrMessage noshow textmerge pretext  7 
											КАД. Ошибка сохранения изменений в таблице <<.Tables>>.
											<<iif(alen(laErrors)>= 2 ,laErrors[ 2 ],'Ошибка не идентифицирована.')>>
										endtext
						    			messagebox(lcErrMessage, 16 )
						    			this.CleareWaitMsg()
						    			this.UnLockRefresh()
										return .f.
									else &&!tableupdate(.t.,.t.,.Alias)
										* все хорошо, сохранились
										=sqlcommit(lnConnection)
										if !this.AfterUpdateSql() 
						    				this.CleareWaitMsg()
						    				this.UnLockRefresh()
						    				return .f.
										endif
										this.refreshDoc(.t.)
										this.oRefreshTimer.Reset()
									endif &&!tableupdate(.t.,.t.,.Alias)
								else
									=sqlsetprop(lnConnection, "Transactions", lnSqlTranOld)
									=messagebox('КАД. Ошибка выполнения транзакции на сервере.', 16 )
					    			this.CleareWaitMsg()
					    			this.UnLockRefresh()
									return .f.
								endif
								=sqlsetprop(lnConnection, "Transactions", lnSqlTranOld)
							endif
						else
							if !empty(lnLocalRecno) and recno(this.cLocalAlias)<>lnLocalRecno
								select (this.cLocalAlias)
								locate record lnLocalRecno
							endif
						endif
					else
						messagebox('КАД. Ошибка чтения записей на сервере.', 16 )
		    			this.CleareWaitMsg()
		    			this.UnLockRefresh()
						return .f.
		 			endif
				endwith
			else
				messagebox('КАД. Ошибка при инициализации.', 16 )
				this.CleareWaitMsg()
				return .f.
			endif
		else
			messagebox('КАД. Ошибка соединения.', 16 )
			this.nCadConnection = lnConnection
			this.CleareWaitMsg()
			return .f.
		endif
		if this.nCadConnection<>lnConnection
			this.nCadConnection = lnConnection
		endif
		this.CleareWaitMsg()
		this.UnLockRefresh()
		return .t.  && благополучно ушли взад
	ENDPROC


	*-- Фоксовая команда для обновления записей в КАДе в зависимости от выбранных записей в локальном курсоре вызывается из метода GroupUpdate
	PROCEDURE cmdgroupupdatelocalcursor
		lparameters toCad, tuValue
		*  пример апдейта (необходимо переписать для каждой формы на свой)
		*!*	update t1 set t1.marker= 1 , t1.inreys=tuValue ;
		*!*		from (toCad.Alias) t1, (this.cLocalAlias) t2 ;
		*!*		where t1.link=t2.link and t2.checked= 1 
		return .t.
	ENDPROC


	*-- метод выполняется  в методе GroupUpdate после успешного внесения изменений во врем.таблицы
	PROCEDURE afterupdatesql
		local lcSqlCmd, lcTempAlias, lcRevision
		local lcTempAlias
		lcTempAlias = sys( 2015 )
		lcSqlCmd = this.cSelectRecordsSqlCmd
		if !empty(lcSqlCmd) and l_sqlexec(,lcSqlCmd, lcTempAlias)> 0 
			text to lcSqlCmd noshow textmerge pretext  15 
				Exec DocumentRevision
					@operation = 'SET',
					@LinkDoc = <<ltrim(STR(this.nLinkDoc))>>,
					@Object = <<ltrim(str(this.nParentObj_codeLink))>>,
					@OutputCursor =  1 
			endtext 
			if l_sqlexec(,lcSqlCmd, lcTempAlias)> 0 
				select (lcTempAlias)
				this.cDocRevision = revDoc
				this.nAccess = 	access
			endif
			use in select(lcTempAlias)
		else
			return .f.
		endif
		return .t.
	ENDPROC


	PROCEDURE cselectrecordssqlcmd_access
		with this
			if empty(.cSelectRecordsSqlCmd)
				.CreateSelectCmd()
			endif
			return .cSelectRecordsSqlCmd
		endwith
	ENDPROC


	*-- Устанавливает необходимую блокировку на необходимую запись в док-те, в случае успеха возвращает .t.
	PROCEDURE setrecordlock
		*!*	Флаг блокировки:
		*!*	Значение
		*!*	Тип блокировки
		*!*	 1  Монопольный доступ
		*!*	 2  Совместный доступ
		*!*	 3  Непосредственная модификация документа при совместном доступе 
		*!*	(устаналвивается только при наличии ранее установленной совместной блокировки  
		*!*	и при ревизии документа не превышающей ревизию ранее установленной блокировки)
		lparameters tnLock, ;
					tnRecordLink, ;
					tnRecordObj_codeLink, ;
					tcRecordRevision, ;
					tnRecordLockRevision

		if empty(tnLock)
			return .f.
		endif
		local lcSqlCmd, lcTempAlias, lcRevision
		text to lcSqlCmd noshow textmerge pretext  15 
			DocumentLock
				@Operation  = 'SET',
				@LinkDoc  = <<ltrim(str(tnRecordLink))>>,
				@Object = <<ltrim(str(tnRecordObj_codeLink))>>,
				@Lock  = <<ltrim(str(tnLock))>>,
				<<iif(!empty(this.cProcessId),"@Processes = '"+ this.cProcessId+"',", "")>>
				@OutputCursor =  1 
		endtext
		lcTempAlias = sys( 2015 )
		if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
			select (lcTempAlias)
			if nRet= 1 
				tcRecordRevision = RevDoc
				tnRecordLockRevision = RevLock
			else
				use in select(lcTempAlias)
				return .f.
			endif
			use in select(lcTempAlias)
		else
			return .f.
		endif
		return .t.
	ENDPROC


	*-- Метод снимает блокировку с записей документа,(отличен от метода UnlockDoc тем, что имеется возможность указать линк док-та и код документа (списочной части док-та) (детализации), возвращает .t. в случае успеха
	PROCEDURE unlockrecord
		lparameters tnRecordLink, ;
					tnRecordObj_codeLink

		local lcSqlCmd, lcTempAlias
		text to lcSqlCmd noshow textmerge pretext  15 
			Exec DocumentLock
				@Operation  = 'DEL',
				@LinkDoc  = <<ltrim(str(tnRecordLink))>>,
				@Object = <<ltrim(str(tnRecordObj_codeLink))>>,
				@OutputCursor =  1 
		endtext
		lcTempAlias = sys( 2015 )
		if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
			select (lcTempAlias)
			if nRet<> 1 
				use in select(lcTempAlias)
				return .f.
			endif
			use in select(lcTempAlias)
		else
			return .f.
		endif
		return .t.
	ENDPROC


	*-- Возвращает имя пользователя, установившего блокировку
	PROCEDURE getlockusername
		lparameters tnLinkDoc, tnObject, tcRevision
		local lcSqlCmd, lcTempAlias, lcUserName
		text to lcSqlCmd noshow textmerge pretext  15 
			select top  1  UserName
				from Documents_Lock
				where LinkDoc = <<ltrim(str(iif(empty(tnLinkDoc),  0 , tnLinkDoc)))>>	and
					  Object = <<ltrim(str(iif(empty(tnObject),  0 , tnObject)))>>
					  <<iif(!empty(tcRevision), " and Revision='"+tcRevision+"'", " order by revision desc")>>
		endtext
		lcTempAlias = sys( 2015 )
		if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0  and used(lcTempAlias)
			select (lcTempAlias)
			lcUserName = alltrim(nvl(UserName,""))
			use in select(lcTempAlias)
		else
			store "" to lcUserName
		endif
		return lcUserName
	ENDPROC


	*-- Снятие блокировки со всего документя, включая его записи (детализацию)  (возможно при заранее установленном свойстве cProcessId)
	PROCEDURE unlockall
		if empty(this.cProcessId)
			return .f.
		else
			local lcSqlCmd, lcTempAlias
			text to lcSqlCmd noshow textmerge pretext  15 
				Exec DocumentLock
					@Operation  = 'DEL',
					@Processes  = '<<this.cProcessId>>',
					@OutputCursor =  1 
			endtext
			lcTempAlias = sys( 2015 )
			if l_sqlexec(,lcSqlCmd,lcTempAlias)> 0 
				select (lcTempAlias)
				if nRet<> 1 
					use in select(lcTempAlias)
					return .f.
				endif
				use in select(lcTempAlias)
			else
				return .f.
			endif
			return .t.
		endif
	ENDPROC


	PROCEDURE generatecprocessid
		if !empty(this.nParentobj_codelink) and !empty(this.nLinkDoc)
			this.cProcessId = d_chr_10to36(this.nParentobj_codelink, 3 ) + ;
							  d_chr_10to36(this.nLinkDoc, 4 ) + ;
							  ltrim(str(arm_user.user_id))
		endif
	ENDPROC


	PROCEDURE Destroy
		this.lockRefresh()
		store .f. to this.oSourceRecordsControl 
		if !empty(this.cLockRevision)
			* снимаем блокировку с документа
			this.unlockDoc()
		endif
		*!*	if !empty(this.nCadConnection)
		*!*		sqldisconnect(this.nCadConnection)
		*!*	endif
	ENDPROC


	PROCEDURE Init
		with this
			.oRefreshTimer = createobject('MuRefreshTimer')
			if vartype(.oRefreshTimer)<>'O'
				=messagebox('Ошибка создания объекта таймера обновлений!', 16 )
				return .f.
			endif
			local lnRefreshInterval
			* если есть настройка, то смотрим интервал
			if !empty(.cPropertyNameRefreshTimerInterval)
				try
					lnRefreshInterval = abs(A_GET_PROP ("", .cObj_name, .cPropertyNameRefreshTimerInterval)* 1000 )
				catch 
				endtry
				if vartype(lnRefreshInterval)<>'N' or empty(lnRefreshInterval)
					local lcErrMsg
					text to lcErrMsg noshow pretext  7 
						Проверьте значение настройки [Интервал отображения изменений (сек.)]
						Интервал установлен в  10  сек. (по умолчанию)
					endtext 
					messagebox(lcErrMsg, 64 ,PCNAMEAPP + "Внимание")
					lnRefreshInterval =  10000 
				endif
			else
				lnRefreshInterval =  10000 
			endif &&!empty(.cPropertyNameRefreshTimerInterval)
			with .oRefreshTimer
				.oParent = this
				.enabled = .f.
				.interval = lnRefreshInterval
			endwith 
			if !empty(.cParentObjName) and empty(.nParentObj_CodeLink)
				.cParentObjName_Assign(.cParentObjName)
			endif
			if !empty(.cSourceRecordsControl) and vartype(.oSourceRecordsControl)<>'O'
			  	.cSourceRecordsControl_Assign(.cSourceRecordsControl)
			endif
		endwith
	ENDPROC


	*-- Метод формирует стандартный идентификатор
	PROCEDURE getrecordaccess
	ENDPROC


ENDDEFINE
*
*-- EndDefine: cus_refresh
**************************************************
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085949
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Sizov.Ну как обычно! Вместо того, чтоб работать со ссылкой на объект, работаем с именем объекта.

Код: plaintext
MyLabel = eval(this.Parent.Name + this.Name + "LenLabel")
И дальше вместо this.parent.&lcLenLabel использовать MyLabel.

Это первое и, скажем так, достаточно общее решение.
Но у меня есть подозрения, что это всего лишь this.LenLabel
Угадал? все же возвращаясь к eval() - не работает или я пока не допер как его применять.
чем отличаеся содержимое переменной lcLenLabel, которая = this.Parent.Name + this.Name + "LenLabel" от MyLabel, которая = eval(this.Parent.Name + this.Name + "LenLabel")?
в итоге избавился от мп только в случае с SET.

2прошелмимо Что до Вашего примера - слишком многа букаф :) Вы уж извините, но я там нихрена не понял по вопросу...
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085968
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я Вам показал
как ссылаются объекты друг на друга
как писать без макроподстановок

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
local lcObjName, loCus1, loObj 
loCus1 = createobject("custom")
loCus1.addproperty("oCus2", createobject("custom"))
loCus1.oCus2.addproperty("cValue", "123")

lcObjName = "oCus2"

loObj = getpem(loCus1, lcObjName)
? loObj.cValue


осиль то, что я написал
а то всю жисть будешь макропадстановки пулить
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085984
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
но я там нихрена не понял по вопросу...


обратите внимание на отсутствие макроподстановок,
исп-е нотации

обратите внимание на стиль и стратегию разр-ки с прим-ем ООП

ну и т.д. ....
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35085985
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
чем отличаеся содержимое переменной lcLenLabel, которая = this.Parent.Name + this.Name + "LenLabel" от MyLabel, которая = eval(this.Parent.Name + this.Name + "LenLabel")?
Тем, что в первом случае в переменной лежит только имя объекта в виде текста, который фоксу ничего не говорит о самом объекте, он даже не подозревает, что тут что-то связано с объектом.
Во втором случае в переменной получается ссылка на объект, точно такая же как при loMyObject = CreateObject('Label') со всеми вытекающими последствиями в виде возможности обращаться к свойствам и методам объекта без необходимости при каждом обращении вычислять ту же самую ссылку на объект. К тому же, макроподстановка сам по себе медленная
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086030
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прошелмимоя Вам показал
как ссылаются объекты друг на друга
как писать без макроподстановок

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
local lcObjName, loCus1, loObj 
loCus1 = createobject("custom")
loCus1.addproperty("oCus2", createobject("custom"))
loCus1.oCus2.addproperty("cValue", "123")

lcObjName = "oCus2"

loObj = getpem(loCus1, lcObjName)
? loObj.cValue


осиль то, что я написал
а то всю жисть будешь макропадстановки пулить ну че, вот loObj = getpem(loCus1, lcObjName) создана ссылка на дочерний объект, который oCus2, это понятно. причем изначально в loCus1 попадает ссылка на объет-родитель. А мне-то че делать, я форму-родителя не создаю методом createobject. Она у меня в дизайнере создана. Я ее через do form запускаю и все. Как получить ссылку на нее в runtime? Ссылка на нее мне нужна вместо loCus1
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086046
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я ее через do form запускаю и все. Как получить ссылку на нее в runtime? Ссылка на нее мне нужна вместо loCus1
Ну а хелп-то хоть иногода читается или как?



DO FORM FormName | ? [NAME VarName [LINKED]] [WITH cParameterList]
[TO VarName] [NOREAD] [NOSHOW]

NAME VarName [LINKED]
Specifies a variable or array element with which you can reference the form or form set. If you specify a variable that doesn't exist, Microsoft Visual FoxPro automatically creates it. If you specify an array element, the array must exist before you issue DO FORM. If the variable or array element you specify already exists, its contents are overwritten.

If you omit the NAME clause, Visual FoxPro creates an object type variable with the same name as the form or form set file.

Include LINKED to link the form to the variable associated with it so that the form is released when the variable goes out of scope. If you don't include LINKED, a form can still be active, even though there is no object variable associated with the form.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086055
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вдогонку :)

Код: plaintext
do form YourForm name loCus1 linked
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086057
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ага, значит я в принципе все правильно делал, и в случае с evaluate и с getpem. так у меня одна и та же ошибка в обоих случаях получается - Variable not found
т.к. объект еще не создан. Вы мне по моему тексту покажите пож. как это должно выглядеть?
вот в точке
Код: plaintext
1.
2.
LOCAL m.lcLenLabel, m.lnWidth, m.lcWasSet
lcLenLabel = this.Parent.Name + this.Name + "LenLabel"
loObj = GETPEM(this.Parent, lcLenLabel)
или
Код: plaintext
1.
LOCAL m.lcLenLabel, m.lnWidth, m.lcWasSet
loObj = EVALUATE(this.Parent.Name + this.Name + "LenLabel")
из-за ссылки на несуществующий объект - получаю ошибку Variable not found

В случае с мп я могу проверить, есь он или нет и в принципе на нарваться на такую ситуацию.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086059
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CTAC-KO... А зачем нам контейнер?
смысёл строки
Код: plaintext
lcLenLabel = this.Parent.Name + this.Name + "LenLabel"
в том, чтобы для каждава текстбокса создать уникально именованный лейбл-счетчег. да и все. А еси он не нуж0н, то и не создаеццо. никаких взаимоСОдействий нема
Можно и без конейнера.
Код: plaintext
this.parent.AddObject(m.lcLenLabel,"Label")
заменяшь на
Код: plaintext
1.
2.
3.
4.
this.AddProperty('oLabel')
this.Parent.AddObject('lblMySuperLongNameForLabel', 'Label')
this.oLabel = this.Parent.lblMySuperLongNameForLabel
this.Parent.lblMySuperLongNameForLabel.name = this.Parent.Name + this.Name + "LenLabel"
далее работаем с this.oLabel вместо this.parent.&lcLenLabel

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
lparameters tlhide

if not (vartype(this.value)="C" and this.maxlength> 0 ) or this.readonly
	return .f.
endif

if type('this.oLabel') = 'U'
	this.addproperty('oLabel')
	this.parent.addobject('lblMySuperLongNameForLabel', 'Label')
	this.olabel = this.parent.lblMySuperLongNameForLabel
	this.parent.lblMySuperLongNameForLabel.name = this.parent.name + this.name + "LenLabel"
	with this.olabel
		.left = this.left+ 5 
		.top = this.top- 5 
		.backstyle =  1 
		.fontsize =  6 
		.height =  9 
	endwith
endif

if !tlhide
	if empty(this.wassetconfirm)
		this.wassetconfirm = set("CONFIRM")
		set confirm on
	endif
	with this.olabel
		.caption = iif(this.maxlength >  0 , ltrim(str(len(rtrim(this.value)))) + " / " + ltrim(str(this.maxlength)), "")
		.autosize =  1 
		.refresh
		.visible = .t.
	endwith
else
	if !empty(this.wassetconfirm)
		if this.wassetconfirm = 'ON'
			set confirm on
		else
			set confirm off
		endif
	endif
	this.olabel.visible = .f.
endif
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086076
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создание объектов формы "на лету" - это очень не тривиальное занятие. Проблема здесь в том, как это все будет выглядеть после создания. Не получится ли некий "уродец", на который "без слез не взглянешь". Имею в виду чисто внешне. Взаимное расположение объектов.

Как следствие, такие динамические формы требуют очень жетских правил по размерам и положениям всех объектов. Задача очень сложная.

Обычно все-таки объекты не создают, а делают не доступными. Ну, или не видимыми. Тогда на этапе проектирования сразу видно красиво или не красиво расположились объекты. Даже с учетом возможного сокрытия некоторых из них.

Поскольку у Вас жетская пара: TextBox+Lable, то использование контейнера кажется вполне разумной идеей. По умолчанию устанавливаете Label.Visible = .F., а если необходимо, просто делаете его видимым.

Как правило, использование макроподстановки говорит о не продуманности общей идеологии приложения или же просто о не знании других способов добиться того же самого результата.


По поводу настройки SET CONFIRM, можно посмотреть как решают эту задачу в примерах от Microsoft.

В данном конкретном случае требуется настройка ON при открытии формы. Значит, устнавливать значение OFF при закрытии формы необходимо только в том случае, если она имела значение OFF при открытии. Зачем менять ON на то же самое ON? Тогда имеем такой код

Код: plaintext
1.
2.
3.
IF m.lcWasSet <> "ON"
	SET CONFIRM OFF
ENDIF


PS: Объектная ссылка на ту форму, внутри которой находится объект - это ключевое слово ThisForm

Код: plaintext
1.
2.
?ThisForm.Name
?ThisForm.Caption
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086077
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
короче допер я :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
LPARAMETERS m.llHide
IF NOT (VARTYPE(this.Value)="C" AND this.MaxLength> 0 ) OR this.ReadOnly
   RETURN .F.
ENDIF

* àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
IF EMPTY(this.WasSetConfirm)
   this.Wassetconfirm = SET("CONFIRM")
   SET CONFIRM ON
ENDIF

LOCAL m.lcLenLabel, m.lnWidth, m.lcWasSet
lcLenLabel = this.Parent.Name + this.Name + "LenLabel"
*loObj = GETPEM(this.Parent, lcLenLabel)
IF m.llHide
   TRY 
   *IF VARTYPE(this.parent.&lcLenLabel)="O"
   loObj = GETPEM(this.Parent, lcLenLabel)
   loObj.Visible = .F.
   CATCH
   ENDTRY
      *this.parent.&lcLenLabel..Visible = .F.
      * àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
      IF !EMPTY(this.WasSetConfirm)
		 IF this.WasSetConfirm ="OFF"
			SET CONFIRM OFF
		 ELSE
			SET CONFIRM ON
		 ENDIF
         this.WasSetConfirm = ""
      ENDIF
   *ENDIF
ELSE
   TRY 
   *IF VARTYPE(this.parent.&lcLenLabel)="O"
   loObj = GETPEM(this.Parent, lcLenLabel)
   CATCH
*   IF VARTYPE(this.parent.&lcLenLabel)#"O"
    this.parent.AddObject(m.lcLenLabel,"Label")
   ENDTRY
   loObj = GETPEM(this.Parent, lcLenLabel)
      
      WITH loObj&& this.parent.&lcLenLabel
         .Left = this.Left+ 5 
         .Top = this.top- 5 
         .BackStyle =  1 
         .FontSize =  6 
   *   ENDWITH
   *ENDIF
   *WITH this.parent.&lcLenLabel
      .Caption = IIF(this.MaxLength> 0 ,LTRIM(STR(LEN(RTRIM(this.value))))+" / "+LTRIM(STR(this.MaxLength)),"")
      .Visible = .T.
      .AutoSize =  1 
      lnWidth = .Width
      .AutoSize =  0 
      .Width = m.lnWidth
      .Height =  9 
      .Refresh
   ENDWITH
ENDIF
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086086
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот и ладушки! :)
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086108
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нифига не ладушки

трай там сто лет не нужен при проверке
нал-я объекта
и св-в у него

смотри pemstatus

почему loObj не залокалил???

зачем m. у лок-х перем-х??

зачем неск-ко раз GETPEM(

недостаточно один раз перед общим ифом??
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086171
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то вроде этого? тока с PEMSTATUS пока не разобрался...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
LPARAMETERS llHide
IF NOT (VARTYPE(this.Value)="C" AND this.MaxLength> 0 ) OR this.ReadOnly
   RETURN .F.
ENDIF

LOCAL lnWidth 

* àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
IF EMPTY(this.WasSetConfirm) AND SET("CONFIRM")#"ON"
   this.Wassetconfirm = SET("CONFIRM")
   SET CONFIRM ON
ENDIF

LOCAL lnWidth, loCharzCounter
IF m.llHide
   IF TYPE(PEMSTATUS(this.Parent, this.Parent.Name + this.Name + "LenLabel", 3 )) = 'O'
      loCharzCounter = GETPEM(this.Parent, this.Parent.Name + this.Name + "LenLabel")
      loCharzCounter.Visible = .F.
   ENDIF
   * àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
   IF NOT EMPTY(this.wassetconfirm)
  	  SET CONFIRM OFF
   ENDIF
ELSE
   IF TYPE(PEMSTATUS(this.Parent, this.Parent.Name + this.Name + "LenLabel", 3 )) # 'O'
       this.parent.AddObject(this.Parent.Name + this.Name + "LenLabel","Label")
   ENDIF
   loCharzCounter = GETPEM(this.Parent, this.Parent.Name + this.Name + "LenLabel")
      WITH loCharzCounter && this.parent.&lcLenLabel
		.Left = this.Left+ 5 
		.Top = this.top- 5 
		.BackStyle =  1 
		.FontSize =  6 
		.Caption = IIF(this.MaxLength> 0 ,LTRIM(STR(LEN(RTRIM(this.value))))+" / "+LTRIM(STR(this.MaxLength)),"")
		.Visible = .T.
		.AutoSize =  1 
		lnWidth = .Width
		.AutoSize =  0 
		.Width = m.lnWidth
		.Height =  9 
		.Refresh
	  ENDWITH
ENDIF
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086177
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dima_T - твой пример уже разобрал и он работает :) спасибо!
там схороняеццо ссылка на лейбл в пропертях текстбокса. только одно маленькое но - главное чтобы при попытке создания объекта с именем MySuperLongNamedLabel не существовало. Хотя это очень маловероятно, канешна.
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086191
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
local lcObjName, loCus1, loObj 
loCus1 = createobject("custom")
loCus1.addproperty("oCus2", createobject("custom"))
loCus1.oCus2.addproperty("cValue", "123")

? pemstatus(loCus1, "oCus2",  5 )

? pemstatus(loCus1, "tutytu",  5 )
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086196
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LPARAMETERS tlHide

Дополнительные модификаторы входящих параметров функ-ций для режима передачи по ссылке.
V Private по ссылке
T Local по ссылке
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086211
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уррря!!! заработало!!! и фсе без мп :) спасибо, прошелмимо!!!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
LPARAMETERS llHide
IF NOT (VARTYPE(this.Value)="C" AND this.MaxLength> 0 ) OR this.ReadOnly
   RETURN .F.
ENDIF

* àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
IF SET("CONFIRM")#"ON"
   this.WasSetConfirmOFF = .T. && default value is .F.
   SET CONFIRM ON
ENDIF

LOCAL lnWidth, loCharzCounter

IF m.llHide
   IF PEMSTATUS(this.Parent, this.Parent.Name + this.Name + "LenLabel", 5 )
      loCharzCounter = GETPEM(this.Parent, this.Parent.Name + this.Name + "LenLabel")
      loCharzCounter.Visible = .F.
   ENDIF
   * àâòîïåðåõîä íà äðóãîå ïîëå ïðè äîñòèæåíèè MaxLength
   IF this.WasSetConfirmOFF
       SET CONFIRM OFF
   ENDIF
ELSE
   IF NOT PEMSTATUS(this.Parent, this.Parent.Name + this.Name + "LenLabel", 5 )
       this.parent.AddObject(this.Parent.Name + this.Name + "LenLabel","Label")
   ENDIF
   loCharzCounter = GETPEM(this.Parent, this.Parent.Name + this.Name + "LenLabel")
      WITH loCharzCounter && this.parent.&lcLenLabel
		.Left = this.Left+ 5 
		.Top = this.top- 5 
		.BackStyle =  1 
		.FontSize =  6 
		.Caption = IIF(this.MaxLength> 0 ,LTRIM(STR(LEN(RTRIM(this.value))))+" / "+LTRIM(STR(this.MaxLength)),"")
		.Visible = .T.
		.AutoSize =  1 
		lnWidth = .Width
		.AutoSize =  0 
		.Width = m.lnWidth
		.Height =  9 
		.Refresh
	  ENDWITH
ENDIF
...
Рейтинг: 0 / 0
По поводу префикса пемеренных m.
    #35086233
CTAC-KO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и последняя редакция :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
LPARAMETERS tlHideCounter
IF NOT (VARTYPE(this.Value)="C" AND this.MaxLength> 0 ) OR this.ReadOnly
   RETURN .F.
ENDIF

* автопереход на другое поле при достижении MaxLength
IF SET("CONFIRM")#"ON"
   this.WasSetConfirmOFF = .T. && default is .F.
   SET CONFIRM ON
ENDIF

LOCAL lnWidth, loCharzCounter

IF !PEMSTATUS(this.Parent, this.Parent.Name + this.Name + "LenLabel", 5 )
   this.parent.AddObject(this.Parent.Name + this.Name + "LenLabel","Label")
ENDIF
loCharzCounter = GETPEM(this.Parent, this.Parent.Name + this.Name + "LenLabel")

* 2hide or !2hide :)
IF tlHideCounter
   loCharzCounter.Visible = .F.
   * автопереход на другое поле при достижении MaxLength
   IF this.WasSetConfirmOFF
  	  SET CONFIRM OFF
   ENDIF
ELSE
    WITH loCharzCounter && this.parent.&lcLenLabel
	.Left = this.Left+ 5 
	.Top = this.top- 5 
	.BackStyle =  1 
	.FontSize =  6 
	.Caption = IIF(this.MaxLength> 0 ,LTRIM(STR(LEN(RTRIM(this.value))))+" / "+LTRIM(STR(this.MaxLength)),"")
	.Visible = .T.
	.AutoSize =  1 
	lnWidth = .Width
	.AutoSize =  0 
	.Width = m.lnWidth
	.Height =  9 
	.Refresh
  ENDWITH
ENDIF
...
Рейтинг: 0 / 0
48 сообщений из 48, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / По поводу префикса пемеренных m.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]