Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Использование DevExpress (часть 3)

Автор: vladman
Дата сообщения: 29.07.2009 15:04
brookson

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

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

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

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

И таки да - клиенту нужно как-то узнать новое значение поля, для того, чтобы запись была адресуема (читай, доступна).
Автор: brookson
Дата сообщения: 29.07.2009 15:45
afiget
Ну компонент-то нам известен - cxGrid. До сих пор такая "тактика" работала нормально. А проблема вылезла как: решил отказаться от DBGrid, и вот.
Кстати, интересная штука. Допустим только что добавленная запись недоступна. Она последняя. Становимся на предпоследнюю, удаляем. Указатель переходит на последнюю (она только что добавлена). Всё нормально. Но курсором, вручную так сказать не даёт.
Автор: vladman
Дата сообщения: 29.07.2009 16:14
brookson

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

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


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

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


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

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


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

Datacontroller не может без рефреша выделить запись как уникальную.
Автор: brookson
Дата сообщения: 29.07.2009 16:46
что ж, будем рефрешить халява, значит, не проходит.
а ФИБы попробую, слышал о них, но этот проект слишком большой, чтоб сейчас менять всё.
спасибо!
Автор: vladman
Дата сообщения: 29.07.2009 16:57
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
Автор: brookson
Дата сообщения: 29.07.2009 17:19
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?

Добавлено:
ах меняем, не дочитался..

Добавлено:
Получилось!!! Спасибо!!
Автор: vladman
Дата сообщения: 29.07.2009 17:47
brookson

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

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

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


у меня инсталлятор. расскажите, пожалуйста, по пунктам что за чем ставить
Автор: brookson
Дата сообщения: 30.07.2009 09:33
vladman
Идея мне нравится. Приму на заметку, спасибо еще раз!
Автор: vladman
Дата сообщения: 30.07.2009 09:58
Dart_Veider

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

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

Цитата:

... классический 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 строки не обязательно.
Автор: ZalivkoDenis
Дата сообщения: 31.07.2009 13:39
Доброго времени суток всем!
Чёт опять подклинило... МОжет кто-нибудь полскажет где грабли:
Есть dxBar, закидываю на него dxBarEdit (вообщем-то пробовал и TcxBarEditItem с проперти TextEdit). Вешаю на него, например, OnKeyDown(Sender:TObject).
В коде есть строка: bStr := TdxBarEdit(Sender).Text
И эта команда ТАКУЮ чушь выдаёт, причем в контроле на форме... Когда напрямую bStr := dxBarEdit.Text -- всё гут.
Внимание вопрос (2 вопроса ): в чём трабла ? Как можно обработать эвент, не обращаясь непосредственно к объекту?
Спасибо. (de45, D2007)

P.S. Естественно, проверка Sender is TdxBarItem присутствует
Автор: vladman
Дата сообщения: 31.07.2009 16:16
ZalivkoDenis

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

Попробуйте
procedure <YourTForm>.<YourdxBarEdit>KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
Self.Caption := TdxBarEdit(Sender).CurText;
end;
Автор: ZalivkoDenis
Дата сообщения: 31.07.2009 16:29
vladman
Понимаете в чём дело, что CurText, что Text выдаёт правильные значения, а вот на самом dxBar текст пропадает, т.е. это поле становиться просто пустым визуально, но значения возвращает Может это из-за скинов или ещё какая трабла... Но быть так точно не должно Может быть какое-то решение есть? Так не хочется отказываться от правильного расположения контролов в рибоне (в этом контроле отображается строка для поиска в таблице, её, конечно, можно вывести непосредственно на форму, но на рибоне как-то нативней...)
Спасибо.
Да, совсем забыл пояснить, что строчка там "bStr := TdxBarEdit(Sender).Text " в условии if Key = VK_RETURN, т.е. понятно, что по Enter происходит запись. (просто перечитал свой предыдущий пост и понял, на какой вопрос Вы мне ответили). Фактически, я провобал и на OnChange вешать -- нихрена... Походу, какая-то вцлная трабла с девами Вот если бы кто-нибудь попробовал на 45-ых -- не исключаю вариант, что это может быть у меня сбой в днк (девы от feandy, ставил на голую cg2007).
Автор: vladman
Дата сообщения: 31.07.2009 18:26
ZalivkoDenis

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

Установите свойство AlwaysSaveText вашего TdxBarManager в True.
Подробнее: ms-help://borland.bds5/ExpressBars6.BDS5/ExpressBars6/TdxBarManagerAlwaysSaveText.htm
Автор: ZalivkoDenis
Дата сообщения: 01.08.2009 12:29
vladman
Большое СПАСИБО за совет. Сработало!
Я использую в основном окне вкладки PageControl для отображения различных режимов работы программы (типа, породия на MDI), и при переключении вкладок у меня мержится TdxBarManager child-фрейма (типа MDIChildForm) в Ribbon основной формы. Так вот, достаточно ли <TdxBarManager>.AlwaysSaveText := True только основного окна или донорский TdxBarManager тоже должен быть с установленным свойством? -- млин, риторический вопрос, буду пробовать...
В очередной раз -- БОЛЬШОЕ СПАСИБО!
Автор: Walerik75
Дата сообщения: 01.08.2009 15:40
В дополнение к:

Цитата:
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;


Автор: rdenk1
Дата сообщения: 04.08.2009 00:30
f3ka

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

А как ты его настроил? Я вот выложил его на форму, подключил к imagelist'у, items создал, сделал комментарии к ним. Запускаю проект - все рисунки отображаются, но выбрать какой-то кроме первого не получается. Наводишь мышь, щелкаешь на какой-нибудь не первый рисунок, вроде в нормальном combobox'е должен именно этот элемент выбраться, а там смотришь - все равно первый элемент.
Автор: f3ka
Дата сообщения: 04.08.2009 08:55
rdenk1
когда Items создал прописал Value уникальное для каждой записи?
Автор: rdenk1
Дата сообщения: 04.08.2009 11:20

Цитата:
когда Items создал прописал Value уникальное для каждой записи?

Точно, надо было value создать

Добавлено:
А как узнать value выбранного рисунка?

Добавлено:
Попытался вот так сделать:
label1.caption:=inttostr(cximagecombobox1.itemindex)
vartostr тоже пытался.
Возникло сообщение "could not convert variant into double". Причем когда я закомментировал строки сообщения продолжились. И вообще когда удалил компонент, все равно продолжились. Как проект вернуть теперь?
Эти компоненты всегда так работают или только у меня?
Автор: JohnSilver182
Дата сообщения: 04.08.2009 14:21
Hi All

Тут код работает на memo1 , но нехочет на cxMemo1
HElp


Код: cxMemo1.perform(wm_vscroll, SB_PAGEDOWN,0);
memo1.perform(wm_vscroll, SB_PAGEDOWN,0);
Автор: f3ka
Дата сообщения: 04.08.2009 14:33
rdenk1
только у тебя... значение можно получить, если не ошибаюсь, cxImageComboBox.EditValue
Автор: rdenk1
Дата сообщения: 04.08.2009 15:56
f3ka
А можно динамически создавать items в cximagecombobox? И назначать им value? У меня просто необходимость не какие-то заранее известные рисунки показывать, а те, которые будут считаны во время выполнения.
Автор: f3ka
Дата сообщения: 04.08.2009 16:33
rdenk1
var
i: Integer;
cxImageComboBoxItem: TcxImageComboBoxItem;
begin
for i := 1 to 10 do
begin
cxImageComboBoxItem := cxImageComboBox.Properties.Items.Add;
with cxImageComboBoxItem do
begin
ImageIndex := -1;
Description := 'Item ' + IntToStr(i);
Value := i;
end;
end;
end;
Автор: afiget
Дата сообщения: 04.08.2009 16:34
rdenk1
Перед тем, как задавать подобные вопросы, рекомендую все таки воспользоваться поиском по Knowledge Base
Автор: JohnSilver182
Дата сообщения: 04.08.2009 19:28
меня никто не любит ...
Автор: vladman
Дата сообщения: 04.08.2009 19:42
JohnSilver182

Цитата:
но нехочет на cxMemo1

Попробуйте так:
cxMemo1.Controls[0].perform(wm_vscroll, SB_PAGEDOWN, 0);
Автор: JohnSilver182
Дата сообщения: 04.08.2009 19:46

Цитата:
Цитата:
но нехочет на cxMemo1

Попробуйте так:
cxMemo1.Controls[0].perform(wm_vscroll, SB_PAGEDOWN, 0);


АААААААААААААААААААААААААА . Получилось !!!!!!

З.Ы. А почему в Девках элементарные вещи идут через тернии ????

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.