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

» Использование DevExpress

Автор: reenoip
Дата сообщения: 23.03.2006 19:09
Имею БД: ADO (*.mdb, драйвер Microsoft.Jet.OLEDB.4.0) + cxGrid (DevExpress ExpressQuantumGrid Suite 5.14). Запускаю приложение. При попытке ввести данные в поле "Дата" (в Access (MS Office 2003 SP1) формат поля "Дата" установлен как "Дата/Время") возникает ошибка:

"Project Project 1.exe raised exception class EVariantOverflowError with message 'Overflow while converting variant of type (Integer) into type (Date)'. Process stopped. Use Step or Run to continue."

В настройках cxGrid формат поля "Дата" установил на "DateTime", но ошибка не исчезает. Удалил cxGrid, поставил стандартный DBGrid - ошибки нет, всё пучком.

Вопрос: как при таком раскладе настроить cxGrid?
Автор: mln141
Дата сообщения: 24.03.2006 08:38
reenoip
См стр 18-19 там это обсуждалось. В новой версии (март) это вроде вылечено (протестировать до конца не успел)
Автор: oly
Дата сообщения: 24.03.2006 09:25
gpi, vshersh
я использую cxGridDBBandedTableView...
если поля Наименование товара, план и факт сделать Column, то получается шапка в виде
-------------------------------------
|<пустой band>| Кол-во |
|------------------|----------------|
|Наименование | | |
|товара |план | факт |
-------------------------------------
как тогда избавится от <пустой band>?

а если поля Наименование товара, план и факт сделать Band, то тогда теряем функциональность колонок (
Автор: reenoip
Дата сообщения: 24.03.2006 10:30
mln141
Сделал всё так, как сказал VadimLou, но всё равно не помогло (((
Автор: Dennica
Дата сообщения: 24.03.2006 10:50
to oly
А что если сделать требуемую шапку используя band а колонки снизу оставить, только не дублировать в них названия а скажем просто пронумировать
-------------------------------------
| | Кол-во |
|Наименование |----------------|
| товара | | | - band
| |план | факт |
-------------------------------------
| 1 | 2 | 3 | - колонки
-------------------------------------
Громоздко конечно, но функционал сохранится

Ну или наконец убрать колонки и самому написать по клику на band требуемый функционал.
Автор: SerjP75
Дата сообщения: 24.03.2006 12:05
Доброе время суток. У TcxGridDBColumn выставлено properties ExtLookupComboBox. На OnCloseUp стоит обработчик, как определить, закрылось окно выбора с возвратом результата или нет(например по Esc). Обработчик на EditValueChanged не подходит по некоторым причинам
Автор: Dennica
Дата сообщения: 24.03.2006 13:43
to SerjP75
Почему интересно нельзя воспользоваться EditValueChanged которая и предназначена для определения реакции на изменение значения?
Если обязательно нужно использовать OnCloseUp, то мне кажется без доп переменной не обойтись. Можно сделать примерно так
unit Unit1;
type
TForm1 = class(TForm)
...
private
OValue: Variant;
end;
...
procedure TForm1.cxGrid1DBTableView1id_platformPropertiesCloseUp(
Sender: TObject);
begin
if OValue <> TcxLookupComboBox(Sender).EditValue then
showmessage('pruved');
end;
procedure TForm1.cxGrid1DBTableView1id_platformPropertiesInitPopup(
Sender: TObject);
begin
OValue := TcxLookupComboBox(Sender).EditValue;
end;
end.
Ну плюс мож нужно будет добавить проверку на null
Автор: mln141
Дата сообщения: 24.03.2006 16:27
reenoip
А версия какая? Я, например, использовал прошлогоднюю (то-ли май, то-ли март - не помню). Там все с датой ОК. Потом пошли глюкавые версии. На новую (мартовскую) думаю перекомпилить готовую программу на след. неделе. Но пробовал тестовую написать - вроде не ругается. БД у меня тоже на Аксессе (правда 2002).
Автор: reenoip
Дата сообщения: 24.03.2006 17:47
mln141
5.14 (вроде как последняя, более свежей я ещё не видел).

Проблема до сих пор не решена. Все методы и решения, предложенные мне и опубликованные здесь, - не работают.

ОС: XP+SP2,
DELPHI (ent): 6+SP1+SP2


Блин, очень жаль, грид ведь действительно суперский, но этот глюк, чтоб его...
В основном, юзал ehlib'овскую библиотеку, но после dev'а на другое даже смотреть не хочется (((
Автор: xokc
Дата сообщения: 24.03.2006 19:08
reenoip
Как совсем экстремальный вариант - используй ADOQuery и для поля с датой преобразуй его в строку вида '2006-03-24 09:00:55'. А гриде самостаятельно преобразовуй эту строку в DateTime и обратно. А вообще по опыту, ADO Access и Delphi - это полная задница: разные версии MS DAC и ОС приводят к СОВСЕМ разному поведению приложения на клиентских машинах.
Автор: reenoip
Дата сообщения: 25.03.2006 20:46
Так, трабл с датой разрешён, всем спасибо!

Новый интерес:
есть три поля в cxGrid. Допустим, поля и данные выглядят таким образом:

____________________
Дата | Имя | Заметки
____________________

1979 | ФИО | лысый
----------------------------
1992 | ФИО | холост


В правом углу каждого поля есть выпадающее мини-меню (фильтр) с пунктами "Все", "Выбор..." и данными, забитыми в ячейки поля (для более быстрой выборки, как я понял).
Внимание, вопрос )))

Например, я вызвал меню поля "Дата", выбрал в списке фильтра "1979". Но вызвав вслед за этим меню поля "Заметки" и выбрав в фильтре "холост", - я никаких данных получить не смогу - грид как не догоняет, что ему нужно искать среди всех записей, а не только среди тех, которые начинаются на "1979" ((( Приходится вручную "сбрасывать" результаты предыдущей фильтрации путём выбора в фильтре значения "Все"...

Какой опцией можно сделать так, чтобы грид в режиме фильтра постоянно искал запросы среди всех записей (всегда, как при первом запуске фильтра)?
Автор: xokc
Дата сообщения: 26.03.2006 20:09
Ну только если так:

procedure TForm8.cxGrid1DBTableView1DataControllerFilterBeforeChange(Sender: TcxDBDataFilterCriteria;
ADataSet: TDataSet; const AFilterText: string);
var
i: Integer;
Item: TcxFilterCriteriaItem;
ItemLink: TObject;
OperatorKind: TcxFilterOperatorKind;
Value: Variant;
DisplayValue: string;
begin
if (Tag = 1) then Exit;
Tag := 1;
try
Item := Sender.Root.Items[Sender.Root.Count-1] as TcxFilterCriteriaItem;
ItemLink := Item.ItemLink;
OperatorKind := Item.OperatorKind;
Value := Item.Value;
DisplayValue := Item.DisplayValue;
Sender.Root.Clear;
Sender.Root.AddItem(ItemLink, OperatorKind, Value, DisplayValue);
finally
Tag := 0;
ADataSet.Filter := AFilterText;
ADataSet.Filtered := True;
end;
end;

Хотя конечно это решение через задницу. Но по-другому не выйдет. Корректней все-таки сначала сбрасывать фильтр вручную хотябы через специальную кнопочку.
Автор: reenoip
Дата сообщения: 26.03.2006 20:31
Ёпрст...
У тебя-то этот код пашет, нет?

Блин, я просто думал, что это где-то в опциях спрятано...

Ок, сегодня попробую...
Автор: vshersh
Дата сообщения: 27.03.2006 08:44
reenoip
Попробуй выставить свойство AutoDataSetFilter в False
(свойство находится в DataController.Filter.AutoDatasetFilter)
Автор: UNHELPMAN
Дата сообщения: 27.03.2006 16:25
Я извиняюсь - если не туда попал . Но вроде как больше и некуда . Суть вопроса -
Имеем DevExpress ExpressWeb Framework 1.6.0 - D7. Устанавливается за счёт своего инсталятора. При запуске ЛЮБОГО демо , при попытке рассмотреть HTML (cxWebPageModule свойство DesignerID = HTML) получаем ассес виоленшн, с криками не верной версии mshtml.dll. При переключении DesignerID = Form работает . Проверялось с различными версиями Framework - (начиная с 1.*) Всё это происходит на ХР pro + 2 sp + "pre SP3" (заплатки различные.) Кто сталкивался и чем залечил ????
Автор: reenoip
Дата сообщения: 27.03.2006 17:34
vshersh
Стоит в "False" - эффект нулевой.
Думаю, эта фишка не лечится: всю ночь с опциями копался (широкий грид, однако)))), но нужную так и не нашёл...

Фак, фак, фак...
Автор: xokc
Дата сообщения: 27.03.2006 17:47

Цитата:
У тебя-то этот код пашет, нет?

Ну если бы не пахал - я бы не писал


Цитата:
Попробуй выставить свойство AutoDataSetFilter в False

Это не из той оперы.


Цитата:
Думаю, эта фишка не лечится

Я же сразу сказал - очевидного решения нет. Впрочем, и не очевидное кривовато.
Автор: ArtemiyUO
Дата сообщения: 28.03.2006 05:15

Цитата:
олучаем ассес виоленшн, с криками не верной версии mshtml.dll

Попробуй обновить МС парсер ХМЛ, вот например у меня с Д2006 есть пакет, msxml.exe, 5 289 984


Добавлено:
Парни помогите!
У меня есть грид (grid)
у него есть 2 уровня- level, slavelevel.
У каждого уровня по банду - BandedView, SlaveBandedView
Сделано это для реализации мастер детаила.
Все работает, все отлично.

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

Нашел событие скрола BandedViewLeftPosChanged
нашел как узнать текущую позицию скрола
TcxGridTableView(Grid.FocusedView).Controller.LeftPos
теперь если я делаю так например с кнопки
TcxCustomGridTableView(Grid.FocusedView).Controller.Scroll(sbHorizontal, scLineDown, 0);
то все круто мастер банд скролится.

а мне надо скролить детаил! у меня не получается потому что я немогу достучатся правельно до детаил банда. Если делаю так, то получаю индекс за пределами
TcxCustomGridTableView(SlaveBandedView).Controller.Scroll(sbHorizontal, scLineDown, 0);
TcxCustomGridTableView(grid.Views[1]).Controller.Scroll(sbHorizontal, scLineDown, 0);

как решить пою задачу? В идеале просто хотелось бы что бы главный скрол был синхронизирован с детаил.
Автор: Alex47
Дата сообщения: 28.03.2006 10:10
ArtemiyUO

А так не прокатит ( вместо TcxCustomGridTableView(SlaveBandedView).Controller.Scroll(sbHorizontal, scLineDown, 0);):

var
Index: Integer;
ARecord: TcxCustomGridRecord;
RelIndex: Integer;
DetailDataController: TcxCustomDataController;

begin

ARecord := cxGrid1MasterView1.Controller.FocusedRecord;
Index := ARecord.RecordIndex;
RelIndex := ARecord.ViewData.DataController.
GetDetailActiveRelationIndex(Index);
DetailDataController := cxGrid1DBTableView1.DataController.
GetDetailDataController(Index,RelIndex);
TcxGridDBDataController(DetailDataController).Controller.Scroll((sbHorizontal, scLineDown, 0);
...
Автор: ArtemiyUO
Дата сообщения: 28.03.2006 10:55
Alex47
Спасибо за помощь, но не получается.
несовсем понял что есть cxGrid1MasterView1, я написал BandedView (т.е. вив мой мастер)
это тоже не понял что есть
cxGrid1DBTableView1, написал SlaveBandedView
и такого типа тоже нет TcxGridDBDataController
и помоему сдесь нужен не контроллер а именно View, потому что метод скрол именно его.

Вообщем если не сложно уточни.
Автор: Alex47
Дата сообщения: 28.03.2006 12:44
ArtemiyUO
1. Вместо cxGrid1MasterView1 и cxGrid1DBTableView1 надо BandedView.
2. Почему нет типа TcxGridDBDataController ? Добавь в uses cxGridDBDataDefinitions.
3. Смысл всего кода в том, что сначала по строке (ARecord) на которой стоит фокус в MasterView находим DetailDataController и уже через него выполняем Controller.Scroll
Автор: ArtemiyUO
Дата сообщения: 28.03.2006 16:25
Все работает. Но я подумал что это не очень мне подходит. Так как надо определять направление и величину скрола а потом вызвать скролл с соотв параметрами.
Я думаю если можно как то достучаться до
TcxGridTableView, то я бы мог прочитать текущю позицию в мастер банде и проставить туже с помощью TcxGridTableView(ххх).LeftPos
но не знаю где взять TcxGridTableView
ну на край конечно реализую сам первым способом, но вижно сразу он кривой и там будет проблема с "большим скролом" с помощью нажатия на скролбар.
Автор: CyberSlon
Дата сообщения: 28.03.2006 17:56
Подскажите кто сталкивался с проблемой отображения русского языка в меню и диалогах при использовании DevExpress на Delphi7.
Имеется немецкий Windows с установленным русским языком. Русский язык есть и в почтовых клиентах и в офисных пакетах. Более того, в содержимом гридов он тоже отображается нормально. А вот в меню и заголовках бандов и колонок грида, равно как и в меню с тулбарами (ExpressBars), как и в заголовках групп и лейбов DXLayoutControla в диалогах вместо русских символов знаки вопроса. Везде в настройках DevExpress прописана раскладка RUSSIAN_CHARSET и True Type шрифт MS Sans Serif. Попытка копирования этого файла шрифтов с другой машины с английским Windows и стоящим русским MUI, на которой все отображается нормально, ни к чему не привела. Попытки менять шрифт меню Windows на MS Sans Serif также была безуспешной. Ковыряние реестра на предмет переключения кодовой страницы по умолчанию на 204 русскую для всех шрифтов тоже не помогает. Сталкивался ли кто с такой проблемой?
Автор: Alex47
Дата сообщения: 28.03.2006 18:46
ArtemiyUO
Ваша постановка задачи со скроллингом мне вообще не ясна.
Зачем скроллировать detail одновременно с master?
Общая ширина колонок в master и detail одинаковая?

Но если очень хочется, то, думается, можно сделать так:

1. В обработчике MasterView, срабатывающем при изменении LeftPos присваивать
новое значение LeftPos для DetailView:

BandedViewGridLeftPosChanged(Sender: TObject);
var
Index: Integer;
ARecord: TcxCustomGridRecord;
RelIndex: Integer;
DetailDataController: TcxCustomDataController;

begin

ARecord := BandedView.Controller.FocusedRecord;
Index := ARecord.RecordIndex;
RelIndex := ARecord.ViewData.DataController.
GetDetailActiveRelationIndex(Index);
DetailDataController := BandedView.DataController.GetDetailDataController(Index,RelIndex);
TcxGridTableController(TcxGridDBDataController(DetailDataController).Controller).LeftPos :=
BandedView.Controller.LeftPos * RelWidth;
...
здесь RelWidth- отношение ширин Detail и Master View.
Может потребуется добавить код для анализа величины BandedView.Controller.LeftPos, в зависимости
от которой что-либо делать или не делать.
2. Код проверял на ExpressQuantumGrid 5\Demos\Delphi\MasterDetailDemo, работает.
Автор: Dennica
Дата сообщения: 29.03.2006 06:16
to ArtemiyUO
Попробуй использовать вместо TcxGrid TdxMasterView. Он все скролирует так как тебе нужно, да и в принципе внем легче реализовать отображение мастер-детали. Я досихпор ломаю голову, для чего в принципе нужно было его создавать при наличии TcxGrid-а, но в некоторых случаях он действительно облегчает построение интерфейса, мож это твой случай.
Автор: vshersh
Дата сообщения: 29.03.2006 08:43
CyberSlon
Если Windows NT/2R/XP то попробуй в файле проекта до инициализации поставить
Код: SetThreadLocale($419);
Автор: ArtemiyUO
Дата сообщения: 29.03.2006 10:01
Все решил я свою задачу синхронного скролинга при мастер-таиле в схгриде.
Вот код
procedure TfPenders.BandedViewLeftPosChanged(Sender: TObject);
var
ARecord : TcxCustomGridRecord;
DetailDataController : TcxCustomDataController;
DetailTableView : TcxGridTableView;
Index, RelIndex : Integer;
ScM, ScD, i : Integer;
begin
scM := TcxGridTableView(BandedView).ViewInfo.DataWidth - TcxGridTableView(BandedView).ViewInfo.ScrollableAreaWidth;
for i := 0 to BandedView.DataController.RecordCount - 1 do
begin
ARecord := BandedView.ViewData.GetRecordByIndex(i);
if not ARecord.Expanded then Continue;
Index := ARecord.RecordIndex;
RelIndex := ARecord.ViewData.DataController.GetDetailActiveRelationIndex(Index);
DetailDataController := BandedView.DataController.GetDetailDataController(Index, RelIndex);
DetailTableView := TcxGridTableView(TcxGridDBDataController(DetailDataController).Controller.GridView);
scD := DetailTableView.ViewInfo.DataWidth - DetailTableView.ViewInfo.ScrollableAreaWidth;
DetailTableView.Controller.LeftPos := Round(TcxGridTableView(BandedView).Controller.LeftPos/(scM/scD));
end;
end;


Код учитывает то что ширина столбцов может быть разная и скролирует в % отношении.
Работает помоему идеально.
Автор: Ky391
Дата сообщения: 29.03.2006 10:41
здравствуйте
с недавнего времени тоже работаю с ентими компонентами
возник вопрос:
есть столбец с ссылками - надо их заменить на соответствующее строковое представление ( т.е. например в таблице в поле храниться id записи в другой таблице например название продукта и дополнит. информация - надо отобразить вместо id название)
сейчас делаю это обработкой события onCustomCellDraw вроде
может есть другие возможности а то боюсь за производительность
Автор: ArtemiyUO
Дата сообщения: 29.03.2006 10:58
Ну этож ужос) так не делается.
А делается все на уровне СКЛ запросов, использую ОБЪЕДИНИЕ (join), примерно так
select t1.name, t2.type_name from table t1
left join table2 t2 on (t2.id = t1.type_id), где
table это первая таблица (пусть будет главная) (в ней у нас хранятся какие то данные и ссылка на другую таблицу, у меня это поле t1.type_id, это поле ссылается на первичный ключ таблицы table2 - t2.id)

Т.е мы выбираем 2 поля из 2 таблиц а объеденяем их по условию (t2.id = t1.type_id).


ЗЫ на эту тему написано море книг, очень рекомендую почитать.
Автор: Ky391
Дата сообщения: 29.03.2006 11:05
понял что дурак - исправлюсь)

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Kylix


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