Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 3)

Модерирует : ShIvADeSt

ShIvADeSt (31-12-2009 04:49): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=10884  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

golkanavt



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DevExpress

Обмен опытом, обсуждение нюансов и решение проблем возникающих при использовании библиотеки компонент Developer Express




 
Сами прирученные компоненты частенько приходят на водопой сюда
 
DLL со скинами из библиотеки dxSkins, автор Ziltoid Подробнее... линк обновлен
Продолжение, Первая часть, вторая часть

Всего записей: 1069 | Зарегистр. 08-04-2002 | Отправлено: 10:31 07-02-2009 | Исправлено: vladman, 14:36 24-10-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
brookson

Цитата:
В другом такого нет - но работает.

Странно, не должно. И так же обрабатывается событие onNewRecord?
может там Refresh или Close/Open не на событие AfterPost dataseta повешено, а, действительно на нажатие кнопки пост.
А вообще, в качестве совета, если можно, рекомендую работать с Firebird через FibPlus - намного приятнее
Также в таблице ADM желательно указывать, что поле ADMIN_ID является PrimaryKey

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 16:04 29-07-2009
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а вот этому пример - добавил второй грид.
Primary key - да, проглядел. добавил, но эффекта нет.

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 16:19 29-07-2009 | Исправлено: brookson, 16:20 29-07-2009
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Получается, что событие Post (нажатие кнопки) надо вылавливать, и делать вручную рефреш?

Зависит от компонент.
Если ключевое поле заполняется на сервере, некоторые компоненты автоматом (или настраивается) делают рефреш всего датасета или только одной записи (тоже зависит от возможностей и настроек).
Я не в курсе, есть ли такой функционал в Фибах.
 
И таки да - клиенту нужно как-то узнать новое значение поля, для того, чтобы запись была адресуема (читай, доступна).

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 16:35 29-07-2009
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
afiget
Ну компонент-то нам известен - cxGrid. До сих пор такая "тактика" работала нормально. А проблема вылезла как: решил отказаться от DBGrid, и вот.
Кстати, интересная штука. Допустим только что добавленная запись недоступна. Она последняя. Становимся на предпоследнюю, удаляем. Указатель переходит на последнюю (она только что добавлена). Всё нормально. Но курсором, вручную так сказать не даёт.

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 16:45 29-07-2009 | Исправлено: brookson, 16:47 29-07-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
brookson

Цитата:
а вот этому пример - добавил второй грид.
Primary key - да, проглядел. добавил, но эффекта нет.

В качестве датасета для таблицы Master используется TIBDataset, а не TIBTable как в случае с таблицей Administrators. И, еще, попробуйте добавить две записи в таблицу Master без рефреша, и снова увидите эффект.
 

Цитата:
Ну компонент-то нам известен - cxGrid.

Речь шла о компонентах доступа к БД.
 

Цитата:
До сих пор такая "тактика" работала нормально.

Да, на DBGrid нормально, но только, на первый взгляд. Добавьте в гриды колонки отображающие значение ключевых полей (MASTER_ID и ADMIN_ID) соответственно и сразу увидите, что без рефреша вам не обойтись
 

Цитата:
Всё нормально. Но курсором, вручную так сказать не даёт.

Datacontroller не может без рефреша выделить запись как уникальную.

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 17:14 29-07-2009 | Исправлено: vladman, 17:15 29-07-2009
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
что ж, будем рефрешить халява, значит, не проходит.
а ФИБы попробую, слышал о них, но этот проект слишком большой, чтоб сейчас менять всё.
спасибо!

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 17:46 29-07-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
brookson

Цитата:
что ж, будем рефрешить халява, значит, не проходит.  

Проходит, если немного покопаться
 
Использование TIBDataset решит вашу проблему. Только нужно немного подкорректировать ваш второй пример и БД.
1. Обработчик IBDS_MasterNewRecord должен выглядеть так:
procedure TF_mca.IBDS_MasterNewRecord(DataSet: TDataSet);
begin
// IBDS_Master.FieldByName('Master_id').AsInteger:=0; << это присвоение не нужно.
IBDS_Master.FieldByName('deletedflag').Asstring:='0';
end;
2. Настраиваем Свойству GeneratorField компонента IBDS_Master.
    2.1. Generator = MASTER_GEN
    2.2. Field = MASTER_ID.
    2.3. Increment by - оставляем 1.
    2.4. Apply Evant - оставляем On New Record.
  Т.е. IBDS_Master.GeneratorField должно содержать  MASTER_GEN -> MASTER_ID By 1
3. Меняем триггер TRG2 FOR MASTER на следующий:
CREATE OR ALTER TRIGGER TRG2 FOR MASTER
ACTIVE BEFORE INSERT POSITION 1
AS
BEGIN
  IF (NEW.MASTER_ID IS NULL) THEN
    NEW.MASTER_ID = GEN_ID(MASTER_GEN, 1);
END
 
И еще,  обработайте событие AfterPost у IBDS_Master:TIBDataSet также как и у ADM:TIBTable

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 17:57 29-07-2009
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Сейчас попробую. А в чём прикол?

Цитата:
IF (NEW.MASTER_ID IS NULL) THEN
    NEW.MASTER_ID = GEN_ID(MASTER_GEN, 1);

 
У меня таких таблиц (генераторов, триггеров) целая туча. Хотелось бы понять. Разве после
new.MASTER_id=gen_id(master_gen,1);
поле может всё еще быть NULL?
 
Добавлено:
ах меняем, не дочитался..
 
Добавлено:
Получилось!!! Спасибо!!

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 18:19 29-07-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
brookson

Цитата:
поле может всё еще быть NULL?  

Технология работает следующим образом:
Значение первичного ключа запрашивается клиентом (как раз для этого мы и установили свойство IBDS_Master.GeneratorField). И в триггере NEW.MASTER_ID уже будет не NULL. Для того чтобы генератор не отрабатывал два раза на одну и ту же запись (первый раз со стороны клиента, а потом второй - в триггере) и происходит проверка значения на NULL. Иначе у вас бы значения поля MASTER_ID были бы с шагом 2. А триггер нужен на тот случай, если вы добавляете/вставляете новую запись не с клиента, который сам может получать следующее значение генератора, а, например, с IBExperta, явно не указав значение поля MASTER_ID

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 18:47 29-07-2009 | Исправлено: vladman, 18:51 29-07-2009
Dart_Veider

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman

Цитата:
А в каком виде у вас  
Цитата:
devexpress 45
. Архив с исходными файлами и пакетами или инсталлятор?  

 
у меня инсталлятор. расскажите, пожалуйста, по пунктам что за чем ставить

Всего записей: 19 | Зарегистр. 19-12-2008 | Отправлено: 04:05 30-07-2009
brookson



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vladman
Идея мне нравится. Приму на заметку, спасибо еще раз!

Всего записей: 139 | Зарегистр. 06-09-2007 | Отправлено: 10:33 30-07-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Dart_Veider

Цитата:
у меня инсталлятор.

Если инсталлятор взятый в соседней ветке, то нажимайте кнопку "Компилять", если не ошибаюсь с названием, после копирования файлов. Должно все работать. Если оригинальный от DexExpress - тоже не должно возникать проблем.
Проверьте наличие фалов dcc32.cfg, DCC32.EXE в каталоги bin, а также корректность путей в файле dcc32.cfg

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 10:58 30-07-2009
Walerik75

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я тут вопросик задавал...

Цитата:
 
... классический mastr-detail.  
Добавление записей производится "руками", т.е. FIBDataSet1->Append();
Если  у master нет detail, то новая запись подскакивает к master, у которого уже есть последняя подчиненная запись. по команде Post(), запись встает на нужное место.
Как заставить новую подчиненную запись появляться относительно выбранного mster-а?  
 
TcxCustomGridRecord *AMasterRec;
TcxCustomGridRecord *ADetailRec;
 
AMasterRec = ((TcxCustomGridTableView*)DBBandedTableView1_1)->MasterGridRecord; // возвращает NULL
 
DBBandedTableView1->DataController->GetDetailDataController(AMasterRec->RecordIndex, 0)->Append();
ADetailRec = AMasterRec->GetLastFocusableChild(false);
ADetailRec->Focused = true;  
 

 
Ответа так и не получил
 
В общем, если кому интересно, решился вопрос так:
 
TcxCustomGridRecord *AMasterRec;
TcxCustomGridRecord *ADetailRec;
int ri;
 
AMasterRec = ((TcxCustomGridTableView*)gMaster)->Controller->FocusedRecord;
ri = ((TcxCustomGridTableView*)gMaster)->Controller->FocusedRecordIndex;
gMaster->DataController->GetDetailDataController(ri, 0)->Append();
 
ADetailRec = AMasterRec->GetLastFocusableChild(false);
ADetailRec->Focused = true;
 
последние 2 строки не обязательно.

Всего записей: 8 | Зарегистр. 13-12-2008 | Отправлено: 00:01 31-07-2009 | Исправлено: Walerik75, 00:02 31-07-2009
ZalivkoDenis



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Доброго времени суток всем!
Чёт опять подклинило... МОжет кто-нибудь полскажет где грабли:
Есть dxBar, закидываю на него dxBarEdit (вообщем-то пробовал и TcxBarEditItem с проперти TextEdit). Вешаю на него, например, OnKeyDown(Sender:TObject).  
В коде есть строка: bStr := TdxBarEdit(Sender).Text
И эта команда ТАКУЮ чушь выдаёт, причем в контроле на форме... Когда напрямую bStr := dxBarEdit.Text -- всё гут.  
Внимание вопрос (2 вопроса ): в чём трабла ? Как можно обработать эвент, не обращаясь непосредственно к объекту?
Спасибо. (de45, D2007)
 
P.S. Естественно, проверка Sender is TdxBarItem  присутствует

Всего записей: 537 | Зарегистр. 06-10-2005 | Отправлено: 14:39 31-07-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZalivkoDenis

Цитата:
В коде есть строка: bStr := TdxBarEdit(Sender).Text  

Попробуйте
procedure <YourTForm>.<YourdxBarEdit>KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Self.Caption := TdxBarEdit(Sender).CurText;
end;

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 17:16 31-07-2009
ZalivkoDenis



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vladman
Понимаете в чём дело, что CurText, что Text выдаёт правильные значения, а вот на самом dxBar текст пропадает, т.е. это поле становиться просто пустым визуально, но значения возвращает Может это из-за скинов или ещё какая трабла... Но быть так точно не должно Может быть какое-то решение есть? Так не хочется отказываться от правильного расположения контролов в рибоне (в этом контроле отображается строка для поиска в таблице, её, конечно, можно вывести непосредственно на форму, но на рибоне как-то нативней...)
Спасибо.
Да, совсем забыл пояснить, что строчка там "bStr := TdxBarEdit(Sender).Text " в условии if Key = VK_RETURN, т.е. понятно, что по Enter происходит запись. (просто перечитал свой предыдущий пост и понял, на какой вопрос Вы мне ответили). Фактически, я провобал и на OnChange вешать -- нихрена... Походу, какая-то вцлная трабла с девами Вот если бы кто-нибудь попробовал на 45-ых -- не исключаю вариант, что это может быть у меня сбой в днк (девы от feandy, ставил на голую cg2007).

Всего записей: 537 | Зарегистр. 06-10-2005 | Отправлено: 17:29 31-07-2009 | Исправлено: ZalivkoDenis, 17:40 31-07-2009
vladman

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZalivkoDenis

Цитата:
а вот на самом dxBar текст пропадает, т.е. это поле становиться просто пустым визуально

Установите свойство AlwaysSaveText вашего TdxBarManager в True.
Подробнее: ms-help://borland.bds5/ExpressBars6.BDS5/ExpressBars6/TdxBarManagerAlwaysSaveText.htm

Всего записей: 708 | Зарегистр. 13-11-2002 | Отправлено: 19:26 31-07-2009
ZalivkoDenis



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
vladman
Большое СПАСИБО за совет. Сработало!  
Я использую в основном окне вкладки PageControl для отображения различных режимов работы программы (типа, породия на MDI), и при переключении вкладок у меня мержится TdxBarManager child-фрейма (типа MDIChildForm) в Ribbon основной формы. Так вот, достаточно ли <TdxBarManager>.AlwaysSaveText := True только основного окна или донорский TdxBarManager тоже должен быть с установленным свойством? -- млин, риторический вопрос, буду пробовать...
В очередной раз -- БОЛЬШОЕ СПАСИБО!

Всего записей: 537 | Зарегистр. 06-10-2005 | Отправлено: 13:29 01-08-2009
Walerik75

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В дополнение к:

Цитата:
TcxCustomGridRecord *AMasterRec;
TcxCustomGridRecord *ADetailRec;
int ri;
 
AMasterRec = ((TcxCustomGridTableView*)gMaster)->Controller->FocusedRecord;
ri = ((TcxCustomGridTableView*)gMaster)->Controller->FocusedRecordIndex;
gMaster->DataController->GetDetailDataController(ri, 0)->Append();
 
ADetailRec = AMasterRec->GetLastFocusableChild(false);
ADetailRec->Focused = true;
 

Этот код не подходит, если у TcxGridLevel в ходе выполнения программы меняется GridView. В этом случае нужно работать с клонами.

Код:
 
TcxGridDBTableView *ACloneTV;
 
ACloneTV = (TcxGridDBTableView*)(gMaster->Clones[0]);
AMasterRec = ((TcxCustomGridTableView*)ACloneTV)->Controller->FocusedRecord;
ri = ACloneTV->DataController->FocusedRecordIndex;
((TcxCustomGridTableView*)ACloneTV)->DataController->GetDetailDataController(ri, 0)->Append();
ADetailRec = AMasterRec->GetLastFocusableChild(false);
ADetailRec->Focused = true;
 
 
 

Всего записей: 8 | Зарегистр. 13-12-2008 | Отправлено: 16:40 01-08-2009 | Исправлено: Walerik75, 16:42 01-08-2009
rdenk1

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
f3ka

Цитата:
на самом деле можно использовать cxImageComboBox только без картинок... я много раз использовал именно его для решения таких же задач

А как ты его настроил? Я вот выложил его на форму, подключил к imagelist'у, items создал, сделал комментарии к ним. Запускаю проект - все рисунки отображаются, но выбрать какой-то кроме первого не получается. Наводишь мышь, щелкаешь на какой-нибудь не первый рисунок, вроде в нормальном combobox'е должен именно этот элемент выбраться, а там смотришь - все равно первый элемент.

Всего записей: 117 | Зарегистр. 27-04-2009 | Отправлено: 01:30 04-08-2009
   

Страницы: 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

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Использование DevExpress (часть 3)
ShIvADeSt (31-12-2009 04:49): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=10884


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru