Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выбор строки в ListBox / 20 сообщений из 20, страница 1 из 1
24.04.2012, 11:23
    #37767757
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Здравствуйте!
Неожиданная проблема:
на форме есть ListBox, RowSourseType=0, заполняется так:
1. в текстбоксы вручную вводятся номер и год документа, нажимается кнопка "Поиск"
2. документ выбирается из списка (Grid), номер и год документа заносятся в текстбоксы программно,
вызывается Click() кнопки "Поиск".

В случае 2. все работает нормально, из ListBox выбираю нужную строку и обрабатываю
В случае 1. НЕ МОГУ выбрать нужную строку - по клику на строку с №>1 курсор
устанавливается (возвращается) на первую строку

Может, кто сталкивался с подобной проблемой?
...
Рейтинг: 0 / 0
24.04.2012, 11:41
    #37767803
Dag
Dag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
А код метода Click() кнопки "Поиск" предлагается угадать присутствующим?
...
Рейтинг: 0 / 0
24.04.2012, 13:05
    #37768051
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Dag,

Код кнопки "Поиск"
Код: plsql
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.
select tdoc
GO TOP
do case
  case Thisform.nrd.Value > 0 .and. Thisform.year.Value > 0
    seek STR(Thisform.year.Value,4)+STR(Thisform.nrd.Value,6,0) order myInd
    if found()
      fnd=recno()
    else
      fnd=-1
    endif
  otherwise
    fnd=0
endcase
DO CASE
	CASE fnd > 0
* документ найден, заполнение объекта List,
* все абсолютно одинаково для обоих случаев 
		Thisform.cmdSv.Enabled=.F.	
		Thisform.cmdEsc.Enabled=.T.	
  CASE fnd = 0
    MESSAGEBOX('Для поиска необходимо задать номер и год',64,'Неполные исходные данные')
  CASE fnd < 0
    MESSAGEBOX('Документ не найден',64,'Результат поиска')
		Thisform.cmdSv.Enabled=.F.	
		Thisform.cmdEsc.Enabled=.T.
ENDCASE
Thisform.Refresh


Так легче стало?
...
Рейтинг: 0 / 0
24.04.2012, 13:10
    #37768067
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Jonny540,

ListBox, RowSourseType=0

А как заполняется?
...
Рейтинг: 0 / 0
24.04.2012, 13:11
    #37768070
IgorNG
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Jonny540,

ListBox, RowSourseType=0

А как заполняется?
...
Рейтинг: 0 / 0
24.04.2012, 13:34
    #37768121
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
IgorNG,

Код: plsql
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.
FOR nCnt = 1 TO Thisform.object.ListCount
	Thisform.object.SelectedID(nCnt)=.F.
ENDFOR
Thisform.object.clear

IF fnd > 0
	GO fnd
ELSE
	RETURN 
ENDIF
SELECT tdoc
SCATTER FIEL name_ob MEMVAR MEMO
*!* в мемо name_ob так:
*!* <имя1>*<дата1> CHR(13)
*!* <имя1>*<дата1> CHR(13)
*!* <имя1>*<дата1> CHR(13)
*!* ...
IF !EMPTY(s)
        s=CHR(13)+ALLT(m.name_ob)
	FOR qw=1 TO OCCURS(CHR(13),s)-1
	  ss=SUBS(s,ATC(CHR(13),s,qw)+1,ATC(CHR(13),s,qw+1)-ATC(CHR(13),s,qw)-1)
	  ss=CHRTRAN(ss,CHR(10),'')
	  IF !EMPTY(LEFT(ss,ATC('*',ss)-1))
	    Thisform.object.AddListItem(LEFT(ss,ATC('*',ss)-1),qw,1)
	    Thisform.object.AddListItem('  '+SUBS(ss,ATC('*',ss)+1,LEN(ss)-ATC('*',ss)),qw,2)
	  ENDIF
	ENDFOR
ENDIF


...
Рейтинг: 0 / 0
24.04.2012, 13:52
    #37768162
Dag
Dag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Есть уверенность в том, что позиционирование идет в нужной таблице? Попробуй изменить этот кусок следующим образом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
IF fnd > 0
SELECT tdoc
	GO fnd
SCATTER FIEL name_ob MEMVAR MEMO
ELSE
	RETURN 
ENDIF
*SELECT tdoc
*SCATTER FIEL name_ob MEMVAR MEMO
...
Рейтинг: 0 / 0
24.04.2012, 14:06
    #37768198
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
DagЕсть уверенность в том, что позиционирование идет в нужной таблице? Попробуй изменить этот кусок следующим образом
Уверенность есть, проверял. К тому же вариант 2. ведь работает...
...
Рейтинг: 0 / 0
24.04.2012, 14:46
    #37768284
Dag
Dag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Jonny540Уверенность есть, проверял. К тому же вариант 2. ведь работает...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
IF fnd > 0
	GO fnd
ELSE
	RETURN 
ENDIF
SELECT tdoc && Если есть уверенность - тогда зачем эта строка ?? 

SCATTER FIEL name_ob MEMVAR MEMO
...
Рейтинг: 0 / 0
24.04.2012, 14:51
    #37768296
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Dag,

ну, лишняя.. и что? не то обсуждаем. мне интересно, почему листбокс глючит (см. топик)
...
Рейтинг: 0 / 0
24.04.2012, 23:08
    #37769522
Гость555
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Jonny540

Я так понимаю, что при щелчке по листбоксу указатель прыгает на ПЕРВУЮ ЗАПИСЬ В ЛИСТБОКСЕ? Какието методы листбокса запрограммированы?

и не совсем понимаю, зачем делать это
Код: sql
1.
2.
3.
FOR nCnt = 1 TO Thisform.object.ListCount
	Thisform.object.SelectedID(nCnt)=.F.
ENDFOR


если следующей строкой идет очистка
Код: sql
1.
Thisform.object.clear


если только у вас не запрограммирован метод ProgrammaticChange() листбокса.
...
Рейтинг: 0 / 0
25.04.2012, 06:19
    #37769655
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Гость555и не совсем понимаю, зачем делать это
Код: sql
1.
2.
3.
FOR nCnt = 1 TO Thisform.object.ListCount
	Thisform.object.SelectedID(nCnt)=.F.
ENDFOR


если следующей строкой идет очистка
Код: sql
1.
Thisform.object.clear


если только у вас не запрограммирован метод ProgrammaticChange() листбокса.
Тут пропущено несколько строк кода, сути дела это не меняет, не хотел никого грузить лишней инфой
Я так понимаю, что при щелчке по листбоксу указатель прыгает на ПЕРВУЮ ЗАПИСЬ В ЛИСТБОКСЕ?
Скажу больше:
- если сначала делать выбор из списка (2., который работает), то начинает работать и 1.
- если сначала 1., то .......
- на какую строку первой кликнешь, на ту потом и перескакивает
...
Рейтинг: 0 / 0
25.04.2012, 15:49
    #37770844
Гость555
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Jonny540,
Всетаки хотелось бы знать, какие методы листбокса заполнены? можеш сделать тестовую форму с похожим поведением листбокса? мне не удалось.
...
Рейтинг: 0 / 0
25.04.2012, 16:25
    #37770940
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Гость555Всетаки хотелось бы знать, какие методы листбокса заполнены?
MouseDown, MouseUp, Click
можеш сделать тестовую форму с похожим поведением листбокса? мне не удалось.Боюсь, что подобную х.... сделать у меня не получится. Это доработка старой проги, потребовалось
добавить на форму несколько объектов, ну и код прописать...
Блин, проще новую сделать :(
...
Рейтинг: 0 / 0
25.04.2012, 17:29
    #37771113
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Вопрос вдогонку: существует ли ограничение на количество объектов в форме?
...
Рейтинг: 0 / 0
25.04.2012, 19:41
    #37771316
Гость555
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Jonny540
MouseDown, MouseUp, Click

надо смотреть эти методы
Вопрос вдогонку: существует ли ограничение на количество объектов в форме?

может и существует, но не думаю, что тебе столько понадобится, берем форму, кидаем на нее кнопку, в кнопку код:
Код: sql
1.
2.
3.
4.
FOR i=1 TO 65000
	WAIT WINDOW i nowait
	thisform.AddObject('t'+ALLTRIM(STR(i)),'textbox')
endfor


запускаем форму, жмем кнопку, ждем n минут, у меня на 63938 фокса зависла, может это и есть ограничение, не знаю.
...
Рейтинг: 0 / 0
26.04.2012, 16:41
    #37772725
Jonny540
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Гость555MouseDown, MouseUp, Click
надо смотреть эти методы

Оказывается, не надо. Надо было (как ни странно) смотреть метод Load() самой формы
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
17.07.2018, 21:41
    #39675278
neznajka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
А я столкнулся с подобной ситуацией (в VFP9) по другой причине: ListBox начинает упорно отрицать выбор строки, если ему назначить переменную в его свойстве ControlSource.
Логически я это понимаю - ведь эта переменная у меня изначально не имеет конкретного значения (пробовал и его присваивать, в методе Form.Load), поэтому начальный выбор и получается таким неопределённым. Но всё равно - я же должен иметь возможность изменить этот выбор, щёлкнув мышкой по другой строчке ListBox'а? По крайней мере, ComboBox такую возможность предоставляет, а у ListBox'а выходит, что хвост управляет лошадью :(
Без переменной можно было бы и обойтись, обращаясь напрямую к ListBox.Value, но конкретный вопрос в другом: а как тогда вернуть это выбранное значение из формы? Ведь возврат осуществляется в методе/событии формы Unload, а к моменту его выполнения, насколько я понимаю, ListBox уже не существует и, следовательно к ListBox.Value обратиться уже не получится?
Конечно, можно было бы писать выбранное значение в возвращаемую переменную не напрямую через ListBox.ControlSource, а в методе ListBox.LostFocus, но как-то уж это похоже на костыли.
К слову сказать, даже в такой ситуации, когда ControlSource блокирует визуальный выбор произвольной строки ListBox'а, щелчок мышкой по выбранной строке всё-таки записывает выбор в переменную, возвращаемую формой. Только хотелось бы, чтобы этот выбор визуально сохранялся в самом ListBox'е - для наглядности.
Может, кто знает, как это сделать, не отказываясь от использования ControlSource?
И ведь как-то раньше лет 12 назад я это как-то делал, вроде... Забыл :(
Образец формы с dbf-ником прилагаю в архиве. Если очистить свойство ListBox.ControlSource - то ListBox начинает работать как нужно (разрешает визуальный выбор мышкой). А мне надо заставить его точно так же работать и при установленном свойстве ControlSource.
...
Рейтинг: 0 / 0
28.07.2018, 22:41
    #39680627
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
neznajka,

Замени источник данных. Вместо списка полей используй запрос. Примерно так

Код: sql
1.
2.
RowSource = "select nam,id from q2_slovar_osoba into cursor test"
RowSourceType = 3 - SQL Statement



Если запрос будешь писать в окне свойств, то кавычки не нужны. Ну, и в Unload формы не забудь закрыть уже не нужный курсор test.

Как вариант, можно в качестве источника данных использовать массив (into array). Но тут программировать надо чуть больше

При работе с объектом List крайне не желательно в качестве источника данных использовать прямое обращение к полям или файлам. Последствия не предсказуемые. Это режимы, скорее, для обратной совместимости

В данном конкретном случае не понятно, почему не был использован обычный Grid. Выбранное значение просто берется из текущей записи. А как эта запись стала текущей (мышкой или клавишами) - уже не важно.
...
Рейтинг: 0 / 0
29.07.2018, 23:46
    #39680788
neznajka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выбор строки в ListBox
Спасибо, ВладимирМ!
Вы, как всегда правы - я раскопал свои давние программы на VFP6-7 и там я действительно использовал выводы в массивы. С огорчением увидел, что сейчас уже не понимаю некоторые тогдашние свои программерские построения - но как-то же оно всё-таки прекрасно работало в своё время :)
А насчёт того, почему в примере использован не Grid, а ListBox - так мне-то надо было как-то показать мои проблемы именно с ListBox'ом :)
В общем, проблема решена. Очень признателен за участие и толковый совет.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выбор строки в ListBox / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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