Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Foxpro/Clipper/Dbase > проблема с Grid


Автор: Artiom 8.6.2006, 12:18
создал Grid 
Код

frmClForm = CREATEOBJECT('Form')  && Create a Form
frmClForm.Closable   = .T.  && Disable the Control menu box 
frmClForm.MaxButton  = .F.
frmClForm.MinButton  = .F.
frmClForm.Autocenter = .T.
frmClForm.top = 20
frmClForm.Caption  = "Список"
frmClForm.Height   = _SCREEN.height - 80
frmClForm.Width    = 400
frmClForm.AddObject('grdGrid1','Grid')  && Add Grid control

frmClForm.grdGrid1.Width    = 400
frmClForm.grdGrid1.Height = _SCREEN.height - 80
frmClForm.grdGrid1.ReadOnly = .T.
frmClForm.grdGrid1.Visible    =.T.  && Grid control visible
frmClForm.grdGrid1.DeleteMark =.F. 
frmClForm.grdGrid1.RowHeight   = nRowHeight
frmClForm.grdGrid1.FontName   = 'Courier New Cyr'
frmClForm.grdGrid1.FontSize   = 9
frmClForm.grdGrid1.FontItalic = .T.

frmClForm.grdGrid1.Column1.Header1.Caption  = "Колонка1"
frmClForm.grdGrid1.Column2.Header1.Caption  = 'Колонка2"
frmClForm.grdGrid1.Column1.Width = 50
frmClForm.grdGrid1.Column2.Width = 350
frmClForm.grdGrid1.ColumnCount = 2

frmClForm.grdGrid1.SetAll("DynamicForeColor","IIF(pr_mode = 0,RGB(0,0,0),RGB(255,0,0))","Column")
frmClForm.WindowState = 0
frmClForm.WindowType= 1

Ругается на строки 
Код

frmClForm.grdGrid1.Column1.Header1.Caption  = "Колонка1"
frmClForm.grdGrid1.Column2.Header1.Caption  = 'Колонка2"
frmClForm.grdGrid1.Column1.Width = 50
frmClForm.grdGrid1.Column2.Width = 350

говорит "Unknown member COLUMN1"
что-то не пойму - во всех примерах к колонкам обращаются именно так. пробовал написать Column(1).Width - тоже не сработало 

Автор: Artiom 8.6.2006, 14:40
И еще сразу вопрос про грид.
пытаюсь отобразить в нем таблицу  
Код

USE CLIENTS
    SELECT cl_num,cl_name FROM clients INTO CURSOR tmpcur NOFILTER 
    COUNT TO nRowCount
USE    
IF nRowCount = 0 then
    MESSAGEBOX("No records")
    return(-1)
ENDIF
DO FORM cl_form 
cl_form.grid1.recordsourcetype = 1
cl_form.grid1.recordsource = 'tmpcur'

Не отображается. Если прописать просто таблицу - все показывает. Как сделать правильно? 

Автор: Cashey 8.6.2006, 14:43
Artiom, у тебя не присвоен RecordSource у Grid'а. Поэтому объекта Column у него нет. Поэтому, либо присвой этому свойству значение алиаса таблицы, либо пиши так:
Код

frmClForm = CREATEOBJECT('Form')  && Create a Form
WITH frmClForm
    .Closable   = .T.  && Disable the Control menu box 
    .MaxButton  = .F.
    .MinButton  = .F.
    .Autocenter = .T.
    .top = 20
    .Caption  = "Список"
    .Height   = _SCREEN.height - 80
    .Width    = 400
    .WindowState = 0
    .WindowType= 1
    .AddObject('grdGrid1','Grid')  && Add Grid control
    WITH .grdGrid1
        .Width    = 400
        .Height = _SCREEN.height - 80
        .ReadOnly = .T.
        .Visible    =.T.  && Grid control visible
        .DeleteMark =.F. 
        .RowHeight   = nRowHeight
        .FontName   = 'Courier New Cyr'
        .FontSize   = 9
        .FontItalic = .T.
        .AddColumn(1)
        .Column1.Header1.Caption  = "Колонка1"
        .AddColumn(2)
        .Column2.Header1.Caption  = "Колонка2"
        .Column1.Width = 50
        .Column2.Width = 350
        .ColumnCount = 2
        .SetAll("DynamicForeColor","IIF(pr_mode = 0,RGB(0,0,0),RGB(255,0,0))","Column")
    ENDWITH
ENDWITH


Добавлено @ 14:51 
Цитата(Artiom @  8.6.2006,  15:40 Найти цитируемый пост)
И еще сразу вопрос про грид.
пытаюсь отобразить в нем таблицу  

Во-первых, ты сразу же закрываешь свой курсор
Цитата(Artiom @  8.6.2006,  15:40 Найти цитируемый пост)
USE CLIENTS
    SELECT cl_num,cl_name FROM clients INTO CURSOR tmpcur NOFILTER 
    COUNT TO nRowCount
USE   


Во-вторых, код 
Цитата(Artiom @  8.6.2006,  15:40 Найти цитируемый пост)
cl_form.grid1.recordsourcetype = 1
cl_form.grid1.recordsource = 'tmpcur'

надо прописать в методе Init формы cl_form. если оставить как есть тогда надо следить, что бы форма не была модальной.

В третьих, вот код
Код

USE CLIENTS
    SELECT cl_num,cl_name FROM clients INTO CURSOR tmpcur NOFILTER 
IF _tally = 0 
    MESSAGEBOX("No records")
    return(-1)
ENDIF
DO FORM cl_form 
cl_form.grid1.recordsourcetype = 1
cl_form.grid1.recordsource = 'tmpcur'
    

Автор: Artiom 8.6.2006, 15:39
ага. понял. спасибо 

Автор: Artiom 9.6.2006, 12:04
Cashey
Еще вопрос про привязку грида и данных. 

у меня таблица - logins. Из нее я считываю данные в курсор tmpcur привязываю к гриду. 
потом мне надо сделать стандартные действия (удаление, добавление. изменение)
сразу засел я на удалении. вот код обработчика кнопки "удалить"
Код

SET DELETED ON
lnmsgresult = messagebox('Удалить запись ?',36,'Удаление записи')
IF lnmsgresult != 6 
    RETURN
ENDIF
SELECT logins
=CURSORSETPROP('buffering',3)
BEGIN TRANSACTION 
IF !EOF()
    IF RLOCK()
     DELETE IN logins
     UNLOCK
     IF !TABLEUPDATE(1)
           =messagebox('Ошибка записи в logins.dbf !!!',16,'Ошибка')       
           UNLOCK
           ROLLBACK
           select logins
           use
           RETURN(0)
       ENDIF
       END TRANSACTION 
    ENDIF 
ELSE
    =messagebox('Ошибка удаления из logins.dbf !!!',16,'Ошибка')       
ENDIF
thisform.grid1.setfocus
thisform.grid1.Refresh
 
1. после удаления надо перезайти в форму, чтобы увидеть результат (я думал что этому поможет метод Refresh)
2. если выйти из программы и зайти снова - то все записи оказываются на месте (этого я хотел избежать, прописав SET DELETED ON в методе Init)
3. удаляются записи не те в которые я выделил, а начиная с первой. это я так понимаю из-за того, что удаляю я из logins, а отображаю tmpcur.

Вообщем вопрос - как грамотно организовать синхронизацию между данными отображаемыми в гриде и данными в таблице?
буду очень признателен за разъяснения
 

Автор: Cashey 9.6.2006, 14:50
Artiom, ты меня извини, но по моему ты страдаешь фигней. Я конечно не знаю всей задачи, но по-моему у тебя что-то не то с организацие работы базы. Создал таблицу -> из нее выбрал данные в курсор -> продолжил работу..... не понятно с чем. Отобразил одно - отредактировал другое. 
В фоксе есть такая фича как VIEW, а начиная с 8-й версии еще и CursorAdapter. Которые и призваны выполнить ту работу, которую ты пытаешься выполнить. 
Цитата(Artiom @  9.6.2006,  13:04 Найти цитируемый пост)
=CURSORSETPROP('buffering',3)

Это конечно не суть важно, но все-таки использовать транзакцию для 3-ей буферизации нецелесообразно. Это мое IMHO.
Резюмирую. Тебе следует: создать в таблицах поле с уникальным значением (primary key); если используешь контейнер базы данных, заменит курсоры на вьюхи. Прописать руками update для вьюх или курсоров (если не используется memo поля, то это делается несколькими строчками кода)
Код

SELECT ViewName
SCATTER MEMVAR
IF SEEK(ViewName.id,"TableName","id")
    RELEASE m.id && это не обязательно, но что бы не возникало неожиданностей с индексом
    SELECT TableName
    GATHER MEMVAR
ELSE
    MESSAGEBOX("Запись удалена другим пользователем")
ENDIF
=REQUERY("ViewName")

Соответсвенно аналогичные коды на обработчик удаления и добавления записи. Это все можно сделать один раз и повесить на триггер вьюхи. С курсором тебе придется все прописывать ручками в каждом конкретном случае.  

Автор: vatras 31.10.2010, 00:25
У меня вопрос по гриду, так что не буду плодить темы.

Кнопка добавить у меня на форме с гридом, - я щелкаю добавить, запускается форма, добавляю, выхожу из формы, и с формой все окей, но грид залит сплошным цветом , никаких данных, ничего.
Все восстанавливается с перезапуском формы. Но отчего мне заливает грид ?

И еще одна досадная мелочь - когда после такой "заливки" грида я выхожу из формы а потом снова запускаю её, видны только 2-3 записи в таблице, чтобы увидеть все надо прокрутить немножко вверх. 
Кто-нибудь сталкивался с этой бедой ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)