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

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

Автор: Chukotka
Дата сообщения: 29.05.2009 20:30
vladman

Цитата:
Подскажу, чего же не подсказать

Спасибо большое, все работает.
Автор: vladman
Дата сообщения: 30.05.2009 11:49
Meister Floh

Цитата:
а отрисовка происходит только после клика по одному из RadioButton:

Скорее всего верная отрисовка (с учетом Enabled) происходит при установке фокуса на этот BarItem. Ну да ладно, я так понял это для вас уже не актуально.

Цитата:
конструктивных советов по оформлению дизайна

Позволю тоже себе немного пофилосовствовать.
Ваш подход к реализации функционала -
Пользователь кликает по LargeButton - 1-й клик. Затем выбирает нужный запрос - 2-й клик, затем снова жмет на LargeButton чтобы выполнить выбранный запрос - 3-й клик. (3 клика для одной операции - достаточно много). Это оправдано, если пользователь достаточно часто выполняет выбранный запрос (чтобы снова не выбирать из попап меню), но в таком случае нужно где-то отображать пользователю какой запрос в данный момент выбран (текущий) и, соответственно, будет выполнен по нажатию на LargeButton.
Я бы реализовал это следующим образов
1. По нажатию на LargeButton выполняется текущий (выбранный) запрос. Если еще нет выбранного, то открывается попап меню для выбора.
2. Обязательное отображение текущего (выбранного) запроса. Например, изменение Caption LargeButton или Caption TdxBar с LargeButton.
3. В качестве элементов попап меню использовать TdxBarButton's cо свойством ButtonStyle = Checked и объединенных в группу. При нажатии на dxBarButton происходит выполнение соответствующего запроса и изменение текущего (выбранного) запроса.
Итог - выполнение операции максимум в 2 клика, а при повторном выполнении одного и того же запроса - 1клик.
Автор: afiget
Дата сообщения: 30.05.2009 13:29
Если количество запросов невелико (3-5 в нашем случае),то можно вообще все сделать отдельными кнопками на отдельной Риббон-закладке "Запросы".
Автор: X11
Дата сообщения: 30.05.2009 14:56
Подскажите, как можно удалить из фильтра какой-нибудь критерий.
Вот есть чек бокс. Включаем его, в общий фильтр cxGrid`а добавляется новое условия, отключаем чекбокс, это условие из фильтра удаляется.

знаю, как добавить

Код:
WITH dbgpA.DataController.Filter.Root do
AddItem(dbgPaEXPENSE_NUMBERS, foLike, lcbFilials.Text, lcbFilials.Text);
Автор: Chukotka
Дата сообщения: 30.05.2009 20:19
QuantumTreeList (не DB) - у кого-то есть опыт формирования дерева не в основном потоке? Пока у меня одна идея - сформировать в потоке отдельную иерархич структуру, а после завершения работы - быстро скопировать в QTL в блоке BeginUpdate\EndUpdate.
Автор: Meister Floh
Дата сообщения: 31.05.2009 08:07
vladman
Как это не удивительно, но я все это именно так и реализовал, только из списка запросов выбирал первый.. идея с открытием меню, если не выбрано ничего вернее.. А имя активного запроса отображаю в статус-баре.. Может в названии кнопки тоже логичнее попробую В любом случае - ОГРОМНОЕ СПАСИБО!


Добавлено:
MagistrAnatol
Вам тоже ОГРОМНОЕ СПАСИБО за идею с кнопками..

jicoff
dimm78
f3ka
afiget
И Вам тоже ОГРОМНОЕ СПАСИБО - за идеи, которые хоть и не реализовал, но принял вл внимание..
Автор: xokc
Дата сообщения: 31.05.2009 11:04
Chukotka

Цитата:
сформировать в потоке отдельную иерархич структуру, а после завершения работы - быстро скопировать в QTL

Если нет необходимости отображать сразу ВСЁ раскрытое дерево, то лучше узлы добавлять в него по мере раскрытия предков. Если же заполняющий поток продолжительный, то можно внутри него для создания узла отправлять с помощью SendMessage сообщения GUI потоку с указателями на предка добавляемого узла и указателя на собственно данные самого узла.
Автор: Chukotka
Дата сообщения: 31.05.2009 11:46
xokc

Цитата:
Если нет необходимости отображать сразу ВСЁ раскрытое дерево, то лучше узлы добавлять в него по мере раскрытия предков.

Нет, такой возможности нет, к сожалению. Качать приходится все данные.

Цитата:
Если же заполняющий поток продолжительный, то можно внутри него для создания узла отправлять с помощью SendMessage сообщения GUI потоку с указателями на предка добавляемого узла и указателя на собственно данные самого узла.

Спасибо, поэкспериментирую, сравню сегодня эти два варианта - свой (с созданием отд структуры в потоке) и ваш.
Автор: vladman
Дата сообщения: 31.05.2009 14:02
X11

Цитата:
а вот как убрать из фильтра условие.


Код:
if <YourCheckBox>Checked then
WITH dbgpA.DataController.Filter.Root do
AddItem(dbgPaEXPENSE_NUMBERS, foLike, lcbFilials.Text, lcbFilials.Text)
else
dbgPaEXPENSE_NUMBERS.Filtered := false;
Автор: Meister Floh
Дата сообщения: 31.05.2009 19:59
vladman
А какое событие нужно вызвать, чтобы принажатии TdxBarLargeButton при определенных условиях выпадало меню? (само собой в кнопке свойства bsDropDown и DropDownMenu установлены) ?


Добавлено:
потому как что-то я кручу-кручу SendMessage но ничего толком придумать не могу..
Автор: vladman
Дата сообщения: 31.05.2009 22:21
Meister Floh

Цитата:
А какое событие нужно вызвать, чтобы принажатии TdxBarLargeButton при определенных условиях выпадало меню?

onClick конечно. Но нужно немного повозиться. Кстати, тоже используется *полюбившийся* доступ к Protected свойствам.
подробности _http://www.devexpress.com/Support/Center/KB/p/A69.aspx, обязательно дочитать до пункта *2) for v6*, в нем как раз то, что вам нужно

ЗЫ. Хочу заметить, что именно *доступ к Protected* свойствам, а не private как вы недавно написали.

Цитата:
разобраться как все это на самом деле работает, в частности, как достучаться к private property

К private так точно достучаться не получится. Думаю просто описка .
Автор: Meister Floh
Дата сообщения: 01.06.2009 08:49
vladman

Цитата:
К private так точно достучаться не получится. Думаю просто описка

Само собой описка.. Замечаю в последнее время за собой такое, сидишь, до потери пулься, пока уже вообще, что-либло перестаешь соображать, и начинаешь писать всякую пургу Кстати спасибо за линк, сейчас займусь чтением.. А пока вышел из ситуации используя стандартную функцию Popup(X, Y) всплывающего меню.. И в паре с ней ClientToScreen... - но это грубо говоря, не совсем, то, что хотелось бы..
Автор: neznayka3
Дата сообщения: 01.06.2009 11:41
Подскажите что прописать OnFilterRecord у dxMemData чтобы реализовать фильтр по 'LIKE' ?

Код: Accept:=DataSet.FieldValues['FIO']=Trim(edFilter.Text)+'%';
Автор: zzz78
Дата сообщения: 01.06.2009 11:50
Как в PivotGrid раскрасить ячейки в засисимости от значения другого поля?
В demo есть только пример раскраски по значению поля. А у меня есь еще одно "поле-признак" в засисимости от его значения ячейку с данными нужно закрасить определенным цветом.
Автор: f3ka
Дата сообщения: 01.06.2009 11:51
neznayka3
Accept := Pos(Trim(edFilter.Text), DataSet.FieldValues['FIO']) > 0;
ну или поменять параметры Pos местами
Автор: X11
Дата сообщения: 01.06.2009 12:04

Цитата:
if <YourCheckBox>Checked then
WITH dbgpA.DataController.Filter.Root do
AddItem(dbgPaEXPENSE_NUMBERS, foLike, lcbFilials.Text, lcbFilials.Text)
else
dbgPaEXPENSE_NUMBERS.Filtered := false;

Спасибо, то, что нужно. Немного переделав, получил рабочую процедуру

Код:
if (cboxFilials.Checked) then
begin
dbgPaEXPENSE_NUMBERS.Filtered := false;//если этой строки не будет, то в фильтр постоянно будут добавляться и добавляться условия
WITH dbgpA.DataController.Filter.Root do
AddItem(dbgPaEXPENSE_NUMBERS, foLike, '%'+lcbFilials.Text+'%', lcbFilials.Text);

end else
dbgPaEXPENSE_NUMBERS.Filtered := false;

if not dbgPa.DataController.Filter.Active then
dbgPa.DataController.Filter.Active := true;
Автор: Justinetz
Дата сообщения: 01.06.2009 12:09
Привет. Волею судеб и DevExpress'а попала сюда. У меня вот такая проблема с ASPxGridView: datasource я обновляю каждый раз при выполнении каких-либо действий (обновление странички, удаление записи из источника данных, редактирования записи). Если получаемый datasource пустой (или null), то возможно два развития событий:
1) первая загрузка или полная перезагрузка страницы. Тогда все нормально.
2) в Template одной из колонок добавлены кнопки: delete, edit. Если нажимаем delete, то вызывается функция удаления записи из базы, потом происходит обновление datasource (например, gv.datasource = GetData();). И при этом обновлении вылетает exception: "A primary key field specified via the KeyFieldName property is not found in the underlying data source. Make sure the field name is spelled correctly. Pay attention to the character case.". Иду по коду - все с моей стороны нормально. Так же берется datasource через вызов функции, где присваивается ему лист с нулевым количеством элементов. KeyFieldName жестко прописан еще на странице и в других ситуациях проблем с ним нет. Только в данной. Exception возникает на этапе DataBind.
Уже не знаю, как это лечить. Запуталась. Была бы очень признательна за помощь или объяснение.
Автор: neznayka3
Дата сообщения: 01.06.2009 12:11
f3ka

Цитата:
Accept := Pos(Trim(edFilter.Text), DataSet.FieldValues['FIO']) > 0;
не работает

и так тоже не работает:
Код: var
s: String;
begin
s:=copy(DataSet.fieldbyname('fio').AsString, 1, length(Trim(edFilter.Text)));
Accept := (Trim(edFilter.Text)=s);
Автор: f3ka
Дата сообщения: 01.06.2009 12:54
neznayka3
вот это у меня работает


Код: procedure TForm1.md1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
Accept := Pos(Trim(edt1.Text), DataSet.FieldByName('StringField').AsString) > 0;
end;
Автор: neznayka3
Дата сообщения: 01.06.2009 13:03
f3ka

Цитата:
видать у вас не включена фильтрация MemData.
спасибо
Автор: vladman
Дата сообщения: 01.06.2009 18:37
zzz78

Цитата:
Как в PivotGrid раскрасить ячейки в засисимости от значения другого поля?

Попробуйте так

Код: var
vValue: Variant;
vRow: Integer;
....
procedure <YourForm>.<YourcxDBPivotGrid>CustomDrawCell(Sender:TcxCustomPivotGrid; ACanvas: TcxCanvas;
AViewInfo: TcxPivotGridDataCellViewInfo; var ADone: Boolean);
begin
if AViewInfo.DataField = <YourAnalised>cxDBPivotGridField then
begin
vValue := AViewInfo.Value;
vRow := AViewInfo.RowIndex;
end;

if (AViewInfo.DataField = <YourVisualised>cxDBPivotGridField) and
(AViewInfo.RowIndex = vRow) and
(vValue > 1000)
then
begin
ACanvas.Canvas.Brush.Color := clRed;
ACanvas.Canvas.FillRect(AViewInfo.Bounds);
ADone:=False;
end;
end;
Автор: zzz78
Дата сообщения: 02.06.2009 07:58
Не помогло... проблема в том что работает это только когда столбец-признак видим и стоит перед столбцом со значением. А мне нужно чтоб столбец-признак был невидим. Может есть связь между ячейкой и записью в датасете хотя бы?
Автор: vladman
Дата сообщения: 02.06.2009 09:53
zzz78

Цитата:
работает это только когда столбец-признак видим и стоит перед столбцом со значением

Да, у такого подхода есть такое ограничение

Цитата:
А мне нужно чтоб столбец-признак был невидим

Но вы же раньше об этом ничего не говорили.

Цитата:
Может есть связь между ячейкой и записью в датасете хотя бы?

Датасет здесь не помощник, так как отдает значения только одной записи, а для кастомдро всех ячеек PivotGrid вам придется выполнять множественный scroll по датасету при каждой перерисовке PivotGrid, что не есть очень хорошо. Сходу решения пока нет, думаю, нужно смотреть в сторону DataController.

Добавлено:
zzz78
Так если этот столбец не видимый, он скорее всего не попадает ни под какие группировки (агрегирования), а раскрашивать вы хотите сгруппированный столбец. Какое именно значение вы хотите анализировать из этого невидимого столбца? Ведь их (значений невидимого столбца), в общем случаем, может быть достаточно много для одного значения раскрашиваемого столбца.
Автор: zzz78
Дата сообщения: 02.06.2009 13:46
Значений там немного (всего три: 0,1,2). В обычном гриде такие фишки легко делаются. А вот с ПивотГридом впервые работаю.
А в сторону DataController как смотреть? Пока я не въехал в суть его. Вообще возможно ли в ПивотГриде достать значение неотображаемое на экране...

Вот сижу думаю: обратиться к старому доброму Гриду, придется конечно возиться с генерацией запроса и созданием колонок в рантайме, но чтож делать ежели никак в Пивот Гриде не получатса.

Чтоб было понятнее поясню задачу: нужно вывести календарь работы вентиляторов. Столбцы - дни месяца, строки - название вентилятора, данные - часы работы (и вот тут признак как раз бывает работа а бывает ремонт, часы все равно ставятся, но уже надо выделить цветом, что агрегат на ремонте был)...
Автор: vladman
Дата сообщения: 02.06.2009 14:49
zzz78

Цитата:
Значений там немного (всего три: 0,1,2)

если значение для отображаемого столбца агрегировано (сумма), а для невидимого столбца нет, то для одного агрегированного значения могут быть разные значения невидимого столбца. Например, если вентилятор работал и ремонтировался в один и тот же день, а мы группируете по дням, то какое в этом случае нужно брать значение для выделения цветом?
Что мешает сделать этот невидимый столбец видимым и 0,1,2 заменить описанием (работал/ремонтировался/..) и включать этот столбец в группировку. В таком случае у вас в случае ремонта и работы вентилятора в один и тот же день будет два значения - количество часов работы и количество часов ремонта.
Автор: ZalivkoDenis
Дата сообщения: 02.06.2009 15:52
Доброго времени суток всем!
Может кто-нить наведёт на мысль (не срочно, но интересно):
Как бы так сделать на базе девов штуку аля MDI-интерфейса (точнее, MDI-интерфейс) чтобы выглядело как-будто PageControl вкладками, но, со всеми преимуществами MDIChild...
Может кто-нибудь что-нибудь предложит в этом направлени?
Спасибо!
Автор: afiget
Дата сообщения: 02.06.2009 16:26
vladman
А если такой столбец сделать нулевой ширины, работать будет?
Автор: vladman
Дата сообщения: 02.06.2009 17:31
ZalivkoDenis

Цитата:
со всеми преимуществами MDIChild...

А какие это преимущества, если не секрет? Тем более если все будет как вкладки PageControl.
afiget

Цитата:
А если такой столбец сделать нулевой ширины, работать будет?

Хорошая идея, но не будет . У cxDBPivotGridField при значении свойство Width=0 ширина поля приравнивается к cxPivotGridDefaultFieldWidth = 105.
Автор: Meister Floh
Дата сообщения: 02.06.2009 21:31
Не обращаюсь ни к кому конкретно, а обращаюсь ко всем!
Задача: Выполняется запрос к базе, что в зависимости от размера последней занимает от 0.5 до 120 сек, как в это время заставить работать TcxProgressBar с установленным Marquee. Уточняю где и откуда посылать Application->ProcessMessages();

На всякий случай добавлю сам запрос:

Код:
select O2.'OrgName' as 'Наименование', Q1.'Cnt' as 'Количество'
from (select O1.'IDNodeParent', count(O1.'IDNodeParent') as 'Cnt'
from 'OrgTree' O1
group by O1.'IDNodeParent') Q1, 'OrgTree' O2
where (Q1.'IDNodeParent' = O2.'IDOrg' and Q1.'IDNodeParent' > 1)
Автор: jonikDk
Дата сообщения: 02.06.2009 21:49
ZalivkoDenis
можно сделать да наверное и нужно через базовые формы и BarManager, Каждое открытое MDI окно, это кнопка на Bar

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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