powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выделить дипазон записей
5 сообщений из 5, страница 1 из 1
выделить дипазон записей
    #36454734
stivap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
В гриде есть необходимость выделить дипазон записией используя windows комбинацию Ctrl+мышка или Shift +мышка

Есть ли такие решения?

Спасибо!
...
Рейтинг: 0 / 0
выделить дипазон записей
    #36454765
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
*мой клас грида.
**************************************************
*-- ParentClass:  grid
*-- BaseClass:    grid
*-- Time Stamp:   05/04/08 12:20:03 PM
*
DEFINE CLASS grid_color AS grid


	ColumnCount = - 1 
	Anchor =  0 
	DeleteMark = .F.
	Height =  200 
	Width =  320 
	*-- nRecno
	nrecno =  1 
	selectstringsource = ""
	Name = "grid_color"



	*-- Метод, для массового выделения строк
	PROCEDURE selectstring
		LPARAMETERS lcSelectString
		*По определенному полю, имя которого передается в д-ый метод выделяются строки 
		*для своеобразного мультиселекта.
		*если в поле стоит  1  - красный цвет шрифта, а если к тому же данная стока в фокусе - тогда
		*текст выделяется жирным шрифтом. 
		*Если  0  (по умолчанию) или любая другая цифра - цвет шрифта остается черным.

		*Возвращает:
		*   0  - если не передан параметр
		* - 1  - если не верно узнан параметр (не существует такого поля)
		* - 2  - если произошла другая ошибка
		*   1  - если удачно установлено свойство мультиселект в гриде
		LOCAL lnError
		lnError= 0 
		ON ERROR lnError=ERROR()
		IF TYPE(lcSelectString)='L' &&параметр не передан
			ON ERROR 
			RETURN  0  
		ENDIF 
		IF TYPE(lcSelectString)='N' &&Если таблица.поле существует и тип Num
			this.SetAll("DynamicForeColor","IIF(&lcSelectString=1, RGB(255,0,0),RGB(0,0,0))", "column")
			*Отмеченную выделенную строку (lcSelectString= 1 ) красным цветом
			this.SetAll("DynamicFontBold","IIF(&lcSelectString=1 and RECNO()=this.nrecno, .T., .F.)", "column")
			*Отмечею строку жирным, которая выделена (lcSelectString= 1 ) и находиться в фокусе
			IF lnError= 0 
				ON ERROR 
				this.selectstringsource=lcSelectString
				RETURN  1 
			ELSE 
				ON ERROR 
				RETURN - 2 
			ENDIF 
		ELSE 
			ON ERROR 
			RETURN - 1 
		ENDIF 
	ENDPROC


	PROCEDURE MouseDown
		LPARAMETERS nButton, nShift, nXCoord, nYCoord
		IF !EMPTY(this.selectstringsource) AND nButton= 1 
			this.KeyPress( 0 ,nShift)
		ENDIF 
	ENDPROC


	PROCEDURE KeyPress
		LPARAMETERS nKeyCode, nShiftAltCtrl
		IF !EMPTY(this.selectstringsource)
			LOCAL lcTableName, lcFieldName
			lcTableName=LEFT(this.selectstringsource,AT('.', this.selectstringsource)- 1 )
			lcFieldName=RIGHT(this.selectstringsource, LEN(this.selectstringsource)-AT('.', this.selectstringsource))
			DO CASE 
				CASE m.nKeyCode= 22 
					NODEFAULT
					replace &lcFieldName WITH ABS(&lcFieldName - 1 ) IN &lcTableName
					KEYBOARD '{DNARROW}'  PLAIN CLEAR 
				CASE m.nKeyCode= 50  AND m.nShiftAltCtrl= 1 
					replace &lcFieldName WITH ABS(&lcFieldName - 1 ) IN &lcTableName
					KEYBOARD '{DNARROW}'  PLAIN CLEAR 
				CASE m.nKeyCode= 56  AND m.nShiftAltCtrl= 1 
					replace &lcFieldName WITH ABS(&lcFieldName - 1 ) IN &lcTableName
					KEYBOARD '{UPARROW}'  PLAIN CLEAR 
				CASE m.nKeyCode= 0  AND m.nShiftAltCtrl= 2  &&из MouseDown передается  0  + nShiftAltCtrl( 1 -Shift,  2 -Ctrl)
					replace &lcFieldName WITH ABS(&lcFieldName - 1 ) IN &lcTableName
				CASE m.nKeyCode= 0  AND m.nShiftAltCtrl= 1  &&из MouseDown передается  0  + nShiftAltCtrl( 1 -Shift,  2 -Ctrl)
					lnRecnoEnd=RECNO(lcTableName)
					SELECT MIN(nRecno) FROM (SELECT RECNO() as nRecno , &lcFieldName FROM &lcTableName) c1 ;
					WHERE &lcFieldName= 1  GROUP BY &lcFieldName HAVING MIN(nRecno)>lnRecnoEnd INTO ARRAY a_SelectString
					IF TYPE('a_selectString(1)')<>'N'
						SELECT MAX(nRecno) FROM (SELECT RECNO() as nRecno , &lcFieldName FROM &lcTableName) c1 ;
						WHERE &lcFieldName= 1  GROUP BY &lcFieldName HAVING MAX(nRecno)<lnRecnoEnd INTO ARRAY a_SelectString
					ENDIF 
					IF TYPE('a_selectString(1)')='N'
						lcCondition=IIF(lnRecnoEnd<a_selectString( 1 ),'BETWEEN(RECNO(),lnRecnoEnd,a_selectString(1))',;
																	'BETWEEN(RECNO(),a_selectString(1), lnRecnoEnd)')
						UPDATE &lcTableName SET &lcFieldName= 1  WHERE &lcCondition
						GO lnRecnoEnd IN &lcTableName
					ENDIF 
					DIMENSION a_selectString( 1 )
					RELEASE a_selectString
			ENDCASE 
		ENDIF
	ENDPROC


	PROCEDURE Init
		this.nrecno=RECNO()
		this.SetAll("DynamicBackColor" , ;
			" IIF(DELETED()=.T., RGB(129,129,129), IIF(RECNO()=this.nrecno, RGB(215,235,255), RGB(255,255,255)))" , "Column")
		*Выделяется синим цветом активная строка и серым строка помеченная на удаление
		FOR k= 1  TO this.ColumnCount
			this.Columns(k).Header1.Alignment= 2 
			this.Columns(k).Header1.FontBold=.t.
		ENDFOR 
		*Заголовк столбца, выравнивание по центру жирным шрифтом.
		LOCAL lcControl
		FOR k= 1  TO this.ColumnCount
			lcControl=this.Columns(k).currentControl
			BINDEVENT(this.Columns(k).&lcControl, "keyPress", this, "KeyPress")
			BINDEVENT(this.Columns(k).&lcControl, "MouseDown", this, "MouseDown")
		ENDFOR 
		*Не забудь прописать 'dodefault()' если добавляешь новый метод!!! 
	ENDPROC


	PROCEDURE AfterRowColChange
		LPARAMETERS nColIndex
		this.nrecno=RECNO()
		this.Refresh()
		*Не забудь прописать 'dodefault()' если добавляешь новый метод!!! 
	ENDPROC


	PROCEDURE Refresh
		this.nrecno=RECNO()
	ENDPROC


ENDDEFINE
*
*-- EndDefine: grid_color
**************************************************

...
Рейтинг: 0 / 0
выделить дипазон записей
    #36456427
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stivap,

GoshaS написал хороший класс.

Делюсь опытом.
Если у меня возникает необходимость мультиселекта, то я поступаю 2-мя способами в зависимости от количества необходимых к показу полей
1) если 1-2 поля, то я вместо грида использую Листбокс. Св-во Multiselect установить в .T. Использование контрола описано в примерах к Фоксу
2) если больше, то использую грид. Селектом из таблицы отбираю в него нужные поля плюс еще одно логическое поле, например, YesNo.
В гриде под него отвожу левый столбец и чекбокс в качестве Currentcontrol.
Теперь можно проставить в этом поле флажки для нужных записей, и использовать цикл SCAN FOR YESNO - ENDSCAN для отбора отмеченных записей.
...
Рейтинг: 0 / 0
выделить дипазон записей
    #36461770
Zmej
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igorbikGoshaS написал хороший класс.
В данном алгоритме недостаток в том, что для определения отметки используется поле таблицы. С одной стороны - это самый простой способ, с другой - возможны траблы при работе в многопользовательском режиме - разные пользователи отмечают записи в одной таблице. Поэтому, чтобы избежать такой проблемы, используют способ с хранением номеров отмеченных записей в массиве или временном курсоре.
stivap посмотрите в разделе решения на сайте foxclub.ru. Кажись здесь - www.foxclub.ru/sol/solution548.php нормальный грид.
...
Рейтинг: 0 / 0
выделить дипазон записей
    #36465949
GoshaS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ваш экземпляр более универсальный.
Я как то и не задумывался, над созданием поля в самой таблице и соответственно обходом этой неприятности в многопольз-м режиме.
Обычно создаю это поле при выборке в курсор, т.к. выделенные строки в основном пользую для отчетов.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / выделить дипазон записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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