powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / КС подход
3 сообщений из 3, страница 1 из 1
КС подход
    #33540446
Student////
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил я попробовать клиент-серверный подход так сказать...
запускаю форму, сделанную на основе класса (класс - форма с литбоксом, в котором собственно хочу отобразить данные из таблицы)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
OPEN DATABASE MyDb SHARED

cSQL = 'SELECT MyField FROM MyTable INTO CURSOC tCursor'

DO FORM FormWList.scx WITH ;
                      cSQL,  ;
                      'tCursor.MyField'   && RowSource для листбокса


в созданном классе форма+листбокс есть такие свойства
cSQLCommand - комадна для формирования курсора
cRowSource - то, что передать как источник данных для листбокса


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
FormWList.init

PARAMETERS cSql, cCursor
WITH THIS
       .cSQLCommand = cSql
       .cRowSource = cCursor
       .ListRequery()
       .ListCreation()
ENDWITH




Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
***ListRequery
IF USED((THIS.cRowSource))
        USE IN (THIS.cRowSource)
ENDIF
** то есть если курсор уже есть уничтожить его
cMyComm = This.cSQLCommand
&cMyComm
*** макроподсьтановкой создали курсор

Код: plaintext
1.
2.
3.
*** ListCreation
This.List1.RowSource = THIS.cRowSource
*** то есть назначили источник листбоксу

все это работает на ура (хотя может я и неверную тактику выбрал.. учусь так сказать....)
Но возникла проблема - ведь если данные изменились - то и курсор надо время от времени обновлять?
как обновлять? а так - запускать например по клику на листбоксе
THIS.ListRequery()
THIS.ListCreation()
ну пересоздаем.. ведь условие для формирования курсора не менялось, предполагаем, что просто данные в исходной раблице могли измениться...
вот тут-то и собака зарыта..
при повторном вызове метода THIS.ListRequery()

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
***ListRequery
IF USED((THIS.cRowSource))
        USE IN (THIS.cRowSource)
ENDIF
** то есть если курсор уже есть уничтожить его
cMyComm = This.cSQLCommand
&cMyComm
*
* тут получаю ошибку "нет доступа к выбранной таблице"
* макроподстановка не проходит 
*

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

Какова цель твоей формы с ListBox? Что это вообще такое будет?

Скорее всего, речь идет о справочнике. Как обычно работают со справочником? Вызывали, выбрали что нужно, закрыли.

Т.е. просто нет смысла что-либо обновлять в процессе работы с этой формой. Достаточно один раз загрузить данные при открытии. Надо обновить - переоткрыл форму.

Вообще, автоматическое обновление данных - это та вещь, которую, как правило, делать не рекомендуется. Представь себя на месте пользователя: я ничего не трогал, а она вдруг пропала (уехала из под мышки, изменила значение и т.д. и т.п.)!

Это очень похоже на предложение сделать кнопку "Выход" уезжающую из под указателя мышки. Хочешь выйти, наводишь на кнопку "Выход" указатель мышки, а кнопка отъезжает в сторону.

Смешно, если ты наблюдаешь за этим со стороны, а не сам пытаешься выйти.

Следовательно, обновление информации на форме должно быть привязано к какому-либо событию, которое и так предназначено для обновления формы.

-) Момент открытия формы
-) Нажатие кнопки "Сохранить"
-) Нажатие кнопки "Обновить"

Ну, момент открытия формы ты уже отработал. А что происходит, когда форма уже открыта?

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

ListBox.RowSource = ""

Вот теперь, можешь вытворять с этими курсорами что угодно. Только после всех обновлений не забудь снова привязать курсор к объекту и обновить содержимое этого объекта.
...
Рейтинг: 0 / 0
КС подход
    #33542557
Student////
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ!!!

ВладимирМПрежде чем начинать писать кучу кода сначала надо прикинуть, а надо ли это делать.

Какова цель твоей формы с ListBox? Что это вообще такое будет?

Скорее всего, речь идет о справочнике. Как обычно работают со справочником? Вызывали, выбрали что нужно, закрыли.

Т.е. просто нет смысла что-либо обновлять в процессе работы с этой формой. Достаточно один раз загрузить данные при открытии. Надо обновить - переоткрыл форму.

в данном случае не совсем так... форма-справочник позволяет так же этот справочник редактировать.. то есть кнопка добавить - редактировать..
допустим я добавляб новую запись.. и что?
без обновления курсора тут уж никак не обойтись.
Впрочем Вы правы - я недостаточно точно сформулировал свой вопрос


ВладимирМ
Созданные курсоры оказываются привязаны к некоторым объектам формы. В данном случае к ListBox. Следовательно, прежде чем уничтожать эта курсоры необходимо разорвать их связь с объектами формы.
ListBox.RowSource = ""

да вот об этом-то я и не подумал
дома попробую.. хотя сам решил проблему иным способом - RowSource листбокса присвоил не поле курсора, а непосредственно поле таблицы....
но все же я бы хотел сделать максимально КС подход, и не вязать контролы форм непосредственно к таблицам...
Хотя.. может я и не ложном пути.. ведь ВФП изначально есть файл-сервер, и, вероятно мне не стоит заморачиваться и менять все на КС подход...
но.. учусь так сказать...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / КС подход
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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