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

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

Автор: SuPriTo
Дата сообщения: 01.10.2015 11:18
almagest
"Load from Devexpress Icon Library" должно загружаться окно с библиотекой иконок и из нее уже нужно добавлять нужную иконку. Либо в ручную, если там ничего нет.
Автор: KDPoid
Дата сообщения: 01.10.2015 11:27
Delphi и cxGrid
в нём
tv : TcxGridTableView

По событию в таблицу должна быть добавлена запись.
Делается так:
tv.DataController.RecordCount := tv.DataController.RecordCount+1;
Потом заполняется значениями...
tv.DataController.Values[tv.DataController.RecordCount-1,
<индекс нужного столбца>] := <Значение>;

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

Возникает задача, в некоторых случаях предупредить пользователя: "Вот вы тут спите, а записей-то добавилось..."
Вопрос:
Как отловить факт того, что новая запись отфильтровалась и невидима ?

Пробовал смотреть tv.VisibleItemCount, но там значение не меняется, даже когда новая запись не отфильтровалась и нормально отобразилась...
Может кто подскажет слово, которое гуглить ?
Автор: SuPriTo
Дата сообщения: 01.10.2015 12:11
KDPoid
Если пришли записи и установлен фильтр, то выводить предупреждение, что пришли записи.
Либо проверять каждую запись, подпадает ли запись под фильтр.
Возможно этот код тебе мысль подкинет.

Код:
tvIndicators: TcxGridTableView;
procedure TfrmIndicatorAdd.acAddUpdate(Sender: TObject);
begin
(Sender as TAction).Enabled := (tvIndicators.DataController.RecordCount > 0) and
(tvIndicators.DataController.FocusedRecordIndex >= 0);
end;
Автор: KDPoid
Дата сообщения: 01.10.2015 12:47
В этом месте пользователь сам является инициатором процесса. Он нажимает кнопку "ну-ка, поработай".
Программулька лезет в базу, работает, обычно, создаёт новые сущности, отправляет их в базу и показывает пользователю.

Сразу добавлять их в грид, а не ждать, когда данные о созданном, сделав круг, приедут из базы с синхронизацией - ради скорости.
Типичное поведение пользователя: "нажал кнопку - увидел результат в таблице". Если каждый раз, нажимая кнопку, он будет видеть модальное окно:
"Твое нажатие замечено. Действия выполнены.", он начнёт строить предположения о моих умственных способностях, особенностях физиологии и сексуальной ориентации...

Пользователь не увидел - значит пользователь не был обучен, он в таких случаях думает: "кнопка не нажалась", и успевает понажимать много раз прежде чем начнёт подозревать: "тут что-то не так, ах ты ж, я сам же ж...".

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

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

Автор: SuPriTo
Дата сообщения: 01.10.2015 12:59
KDPoid
Делай проверку, что если нет документа в списке, выдавай предупреждение.
Сделай банальный поиск или сбрось фильтр после обновлении пользователем базы. Тут вроде бы все легко делается.
Автор: KDPoid
Дата сообщения: 01.10.2015 13:50
Сбрасывать фильтр некузяво. Пользователь ведь мог его настроить и осмысленно. И фильтр может ему помогать. И новые записи не скрывать. А тут я такой незамутнённый, отключаю фильтр после каждой операции...

Похоже, выкрутился. Проверка, является ли запись с известным RecordIndex видимой, выглядит так:

tv: TcxGridTableView;
...
if Assigned(tv.ViewData.GetRecordByRecordIndex(RecordIndex)) then...
Автор: almagest
Дата сообщения: 01.10.2015 16:43

Цитата:
"Load from Devexpress Icon Library" должно загружаться окно с библиотекой иконок и из нее уже нужно добавлять нужную иконку.

Окно-то открывается, но вот иконок там нет. Иконки есть в devexpress\source\Icon Library\, а вот куда это прописать - непонятно.
Автор: SuPriTo
Дата сообщения: 01.10.2015 19:11

Цитата:
Окно-то открывается, но вот иконок там нет. Иконки есть в devexpress\source\Icon Library\, а вот куда это прописать - непонятно.

Загружай в ручную, значит что-то не поставилось.
Автор: dred2k
Дата сообщения: 01.10.2015 19:44
almagest
Системная переменная DXVCL есть ?
Должна содержать имя каталога, в который поставился DevExpress.

Автор: almagest
Дата сообщения: 05.10.2015 07:42
dred2k

Цитата:
Системная переменная DXVCL есть ?
Должна содержать имя каталога, в который поставился DevExpress.


Разобрался. Переменная DXVCL есть. Однако каталог Source, в котором находится каталог с иконками
Icon Library лежал в папке devexpress, а должен лежать в папке ExpressLibrary, где девки его и ищут. Т.е. структура каталогов должна быть такой:
<папка с установленным devexpress>\ExpressLibrary\Source\Icon Library\

Скопировал Source в ExpressLibrary и всё заработало, как надо.
Автор: Fearless86
Дата сообщения: 05.10.2015 10:55
Просмотрел весь форум так и не нашел исходников VCL. Bpl не в счет, нужны именно pas файлы. ссылочку кто даст?
Автор: d3adb33f
Дата сообщения: 11.10.2015 14:10
Подскажите как изменить индекс в TcxRadioGroup ?

Пробую так:
TcxRadioGroup(cxBarEditItem1.Properties).ItemIndex := 1;
но это не работает.
Автор: makz
Дата сообщения: 11.10.2015 16:55
d3adb33f
Через EditValue меняйте.
Автор: d3adb33f
Дата сообщения: 12.10.2015 06:11
makz
Угу только как оказалось там ещё нужно каждому элементу присваивать значение Value вместо null и уже это значение подставлять в EditValue. Без этого editvalue нефонтан.
Автор: X11
Дата сообщения: 12.10.2015 08:27

Цитата:
Подскажите как изменить индекс в TcxRadioGroup ?


Посмотри, что здесь есть за свойства и методы:
TcxRadioGroupProperties(cxBarEditItem1.Properties).

Добавлено:

Цитата:
Через EditValue меняйте.


мне тоже этого хватает
Автор: makz
Дата сообщения: 12.10.2015 16:43
d3adb33f
"Других писателей properties у нас для вас нет."(с)И.В.
Автор: d3adb33f
Дата сообщения: 12.10.2015 17:22
X11
Уже разобрался, я просто ожидал некий аналог функционала стандартного RadioGroup, а тут оказалось нужно немножко через тройной тулуп.

makz кто такой и.в. ?

Автор: KDPoid
Дата сообщения: 12.10.2015 19:53

Цитата:
makz кто такой и.в. ?

_http://dic.academic.ru/dic.nsf/dic_wingwords/779/%D0%94%D1%80%D1%83%D0%B3%D0%B8%D1%85
Автор: d3adb33f
Дата сообщения: 15.10.2015 16:48
Вопрос про DxSpellChecker

По умолчанию, при вызове popup над словом с ошибкой выводится меню с вариантами исправлений, а как сделать, что бы список слов для исправления был в подменю моего меню.
или если не в подменю то хотя бы как совместить моё меню с меню SpellChecker-а?

И реально ли такое ?

Если не реально то как жить дальше ?
Автор: dimm78
Дата сообщения: 15.10.2015 17:15
d3adb33f


Цитата:
По умолчанию, при вызове popup над словом с ошибкой выводится меню с вариантами исправлений, а как сделать, что бы список слов для исправления был в подменю моего меню.
или если не в подменю то хотя бы как совместить моё меню с меню SpellChecker-а?

И реально ли такое ?

Если не реально то как жить дальше ?


Вполне реально. Определяешь слово под курсором. На событии OnPopup своего меню получаешь список вариантов для этого слова через функцию GetSuggestions SpellChecker-а и дополняешь динамически свое меню. Новые элементы меню можно хранить в отдельном списке, чтобы быстро их уничтожить при следующем вызове меню в другом месте. Что-то вроде этого (выдернул из проекта):

Sender.SelectWordAt(X, Y); //у меня Sender это TRichViewEdit

lSpellCheckerSuggestionList := ASpellChecker.GetSuggestions(lWord);
try
for i := 0 to lSpellCheckerSuggestionList.Count - 1 do
begin
BarItemLink := APopupMenu.ItemLinks.Insert(I);

BarItemLink.Item := APopupMenu.BarManager.AddButton;
BarItemLink.Item.Caption := lSpellCheckerSuggestionList.Items[I].Word;

BarItemLink.Item.Data := Sender;
BarItemLink.Item.OnClick := ButtonClick;

SpellCheckPopupList.Add(BarItemLink.Item);
end;

if lSpellCheckerSuggestionList.Count = 0 then
begin
BarItemLink := APopupMenu.ItemLinks.Insert(0);

BarItemLink.Item := APopupMenu.BarManager.AddButton;
BarItemLink.Item.Caption := '<нет вариантов>';
BarItemLink.Item.Enabled := False;
SpellCheckPopupList.Add(BarItemLink.Item);
end;
finally
FreeAndNil(lSpellCheckerSuggestionList);
end;

в обработчике ButtonClick подменяешь слово под курсором на Caption пункта меню. Пример для TCustomRichView

class procedure XXXXXX.ButtonClick(Sender: TObject);
begin
if (Sender is TdxBarButton) and (TdxBarButton(Sender).Data is TCustomRichViewEdit) then
(TdxBarButton(Sender).Data as TCustomRichViewEdit).InsertText(TdxBarButton(Sender).Caption);
end;
Автор: d3adb33f
Дата сообщения: 15.10.2015 18:22
dimm78
попробую
Автор: KDPoid
Дата сообщения: 16.10.2015 12:52
DevExpress 2012 1.6

cxGridTableView

Как можно задать раскраску ячейки, которая в фокусе ?
Вроде бы, всё перепробовал. Остальную строку selected можно покрасить, а фокус упорно рисуется стилем для Content.

Что, писать обработчик на onCustomDrawCell ?
Странное отношение к фокусу... Что за священная корова...
Автор: X11
Дата сообщения: 16.10.2015 13:10
Используй стили
Автор: KDPoid
Дата сообщения: 16.10.2015 15:22
Да я, вроде бы, и пытался...
Какой стиль отвечает за ячейку в фокусе ?
У меня фокус отрисовывается стилем Content, что мне кажется несколько странным...

Пришлось написать
Код:
procedure TForm1.cxCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
if aViewInfo.Focused then
begin
aCanvas.Brush.Color := TableView.Styles.Selection.Color;
aCanvas.Font.Color := clLime;
aCanvas.Font.Style := [fsBold];
end;
end;
Автор: KDPoid
Дата сообщения: 20.10.2015 15:36
cxGrid
В нем DBTableView, в котором наопределено полей.

Пытаюсь сохранить пользовательские настройки при помощи cxPropertiesStore...
Наотмечал характеристик, которые хочу сохранить, но...

Как сохранить установленный пользователем порядок столбцов ?!?!?

Всё можно, а порядок - нет ?
Неверное, потому что пропертя не published...

Как ленивые люди поступают в таких случаях ?
Морщатся и идут писать руками ?
Автор: dimm78
Дата сообщения: 20.10.2015 23:01
KDPoid

У View есть методы StoreTo... и RestoreFrom... которые отвечают за сохранение и восстановление настроек отображения (порядок колонок, сортировка и т.п.). Позволяют сохранять в поток, ini файл, реестр
Автор: KDPoid
Дата сообщения: 21.10.2015 07:33
dimm78,
И как мне это должно помочь ?

StoreTo и RestoreFrom - лишь способ форсировать чтение-запись, которые и так делаются, достаточно указать PropertiesStore.Active := True;

Но, подлежит сохранению список, который надо выбрать в редакторе компонента.
И как там указать, что я хочу сохранять и восстанавливать cxGridDBTableView1.Columns[i].Index ?
Автор: makz
Дата сообщения: 21.10.2015 09:54
KDPoid

Цитата:
StoreTo и RestoreFrom - лишь способ форсировать чтение-запись

Да ну?!
Тут примеры:
https://www.devexpress.com/Support/Center/Question/Details/T165718
Автор: MagistrAnatol
Дата сообщения: 23.10.2015 12:58
Подскажите как определить на каком из гридов я сейчас нахожусь - на мастер уровне или на детайл?
Автор: dimm78
Дата сообщения: 23.10.2015 14:58
MagistrAnatol

if <cxGrid>.FocusedView.IsDetail then
AView := <cxGrid>.FocusedView.PatternGridView
else
AView := <cxGrid>.FocusedView;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

Предыдущая тема: Помогите пожалуйста с блокировкой клавиатуры и мышки


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