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

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

Автор: X11
Дата сообщения: 27.05.2009 16:33

Цитата:
Проблема в том, что после его выполнения в исходной memo-ячейке ВЕСЬ текст становиться выделенным.

а это можно считать багом?
Автор: Meister Floh
Дата сообщения: 27.05.2009 16:52
afiget
да наверно прийдется сделать какие нибудь ладж-бутон и использовать свойство down - короче собрать радиобутон на кнопках и красивее и просто, че разбираться куда "девочки попрятали свои штучки" - в частности enable и checked
Автор: jicoff
Дата сообщения: 27.05.2009 19:11
X11

Скорее это баг. Но можно же снять полностью выделение или восстановить выделенный текст, если это очень важно.
Автор: vladman
Дата сообщения: 28.05.2009 01:29
Meister Floh

Цитата:
Хочу, чтобы в зависимости от заполненности строк отвечающих за запросы, можно было енэйблить-дизэйблить элементы радиогруп....
че разбираться куда "девочки попрятали свои штучки" - в частности enable и checked

Так что тут разбираться если afiget все верно сказал

Цитата:
У TcxRadioGroupItem свойство Enabled имеет, но оно protected.

Другое дело, что для доступа к protected свойствам необходимо воспользоваться небольшим трюком, т.е:

Код:
TcxButtonGroupItemAccess = class(TcxButtonGroupItem);

implementation

...
TcxButtonGroupItemAccess(TcxRadioGroupProperties(<YourcxBarEditItem>.Properties).Items[1]).Enabled := false;
...
Автор: Meister Floh
Дата сообщения: 28.05.2009 09:24
vladman
О интересно.. Попробуем разобраться.. И перевести написаное в термины С++, потому как в нем все немного не так и не так прозрачно как в дельфях..


Добавлено:
vladman
afiget
А по поводу cheked ничего не подскажите?

Добавлено:
vladman
Кстати по поводу вот этого -
Цитата:
TcxButtonGroupItemAccess = class(TcxButtonGroupItem);
- насколько я понял трюк заключается в том, чтобы из класса наследника стучаться к протектед свойствам.. Т.е. по идее нужно подкидывать класс наследник с радиобуттонами в ран-тайм, и таким образом, получаешь доступ к свойству enabled? Тогда может проще в классе наследнике перенести свойство в паблишед? или нет?

Автор: AndreyAgrh
Дата сообщения: 28.05.2009 10:50
with ProductsGridView1.DataController do
begin
// Добавляю новую запись.
RecordCount := RecordCount + 1;
SetValue(RecordCount-1,1,Bcode);
SetValue(RecordCount-1,2,Desc);
SetValue(RecordCount-1,3,GridPosition);
SetValue(RecordCount-1,4,Id);
// Хочу позиционироваться на ней
FocusedRecordIndex := RecordCount - 1; // Исходя из девовского хелпа, это должно работать!!!
//ProductsGridView1.ViewData.Records[RecordCount - 1].Selected := True;
end;

В рез-те кода выделенной становиться не добавленная запись, а предыдущая. На закоментированной строке просто вываливается ошибка (Project Project1.exe raised exception class EListError with message 'List index out of bounds (0)'.).
Подскажите, где я что делаю не так?
Автор: f3ka
Дата сообщения: 28.05.2009 11:13
Meister Floh
а какая разница то? при использовании класса наследника что protected что published свойства видны...
можно сделать типа финт ушами и написать типа свой класс
TcxButtonGroupItem = class(<BaseUnitName>.TcxButtonGroupItem);
в отдельном юните и этот юнит подключать ПОСЛЕДНИМ в разделе USES, тогда возможно можно будет иметь доступ к protected свойствам без приведения к классу-наследнику...
я так делал когда мне не нравилось поведение родных классов DevExpress и переопределял методы и обработчики событий на свои...

Добавлено:
AndreyAgrh
а не надо ли каким то образом подтверждать добавление записи типа POST?

Добавлено:
AndreyAgrh
и разве нету у DataController'а метода Append?
Автор: vladman
Дата сообщения: 28.05.2009 11:44
Meister Floh

Цитата:
А по поводу cheked ничего не подскажите?

Так у TcxCheckGroupItem вроде как свойство Enabled даже published. Или что вы имели ввиду под подсказать .

Цитата:
Тогда может проще в классе наследнике перенести свойство в паблишед? или нет?

Нет, наверное это не проще. Проще именно так как я написал - одна строка определения наследника и затем явное приведение в нужных местах (где нужен доступ к protected свойствам/методам предка) соответствующих типов к типу наследника.

Цитата:
The Protected directive starts a declaration section of a class definition. In a protected section, Fields, Properties and Methods are declared to be accessible to this class and classes descending from it. But not accessible externally by class users.
It is similar to the Private directive - it hides the internal implementation of a class, but does not hide such data and methods from subclasses.

Автор: infomSB
Дата сообщения: 28.05.2009 11:47
AndreyAgrh
Если вы используете простой TableView то я думаю достаточно делать
DataController.GotoLast

Хотя я всегда делал так:
DataController.Insert;
<Column>.EditValue := <Value>;
...
DataController.Post;
Автор: Meister Floh
Дата сообщения: 28.05.2009 12:13
vladman

Цитата:
Или что вы имели ввиду под подсказать

Enabled есть, а вот Checked я не нашел...

Цитата:
TcxButtonGroupItemAccess(TcxRadioGroupProperties(<YourcxBarEditItem>.Properties).Items[1]).Enabled := false;

По идее в С++ это должно выглядеть вот так:
Код:
static_cast<TcxButtonGroupItemAccess *>(static_cast<TcxRadioGroupProperties *>(<YourcxBarEditItem>->Properties)->Items->Items[0])->Enabled = false;
Автор: VitOs2
Дата сообщения: 28.05.2009 13:29
Друзья!
Подскажите пожалуйста, как можно отследить, находится ли курсор мышки над ApplicationButton?
Используется Devexpress Ribbon.
Спасибо!
Автор: MagistrAnatol
Дата сообщения: 28.05.2009 13:41
vladman
тутича сорцы http://upload.com.ua/get/900875666/ со стандартным пасом, пароль к базе под ковриком # а юзер
стандартный ,но наскоко я разбираюсь в колбасных обрезках - если ты будеш подкидать под свой сервак то надо твои юзер/пас
Автор: jicoff
Дата сообщения: 28.05.2009 14:22
Meister Floh

Значит неправильно написан класс наследник.

На примере TcxRadioGroupItem:

class TcxRadioGroupItemAccess : public TcxRadioGroupItem
{
bool __fastcall GetEnabled(void)
{
return TcxRadioGroupItem::Enabled;
}
void __fastcall SetEnabled(bool Value)
{
TcxRadioGroupItem::Enabled = Value;
}
public:
__property bool Enabled = { read=GetEnabled, write=SetEnabled };
};
Автор: Meister Floh
Дата сообщения: 28.05.2009 21:55
vladman
afiget
jicoff
Итак господа хочу для начала выразить Вам свою искреннюю признательность за то, что помогли мне разобраться как все это на самом деле работает, в частности, как достучаться к private property. Это действительно была захватывающая борьба! Большое спасибо!!

А теперь я хочу написать свое заключение (может несколько философское), после которого опять (уж извините ) попрошу совета...

Итак если разработчик компонента закрывает свойство в private - значит это кому-нибудь нужно.. И вот почему я прихожу к такому выводу - если я в FormCreate определяю какие из RadioButtons будут Disabled, то при входе во всплывающее меню это все равно не отрисовывается:

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

Какие только из возможных событий для Update (Repaint?) PopUp menu я только не использовал - все на смарку.. Отсюда вывод - скорее всего разработчики тоже не добились желаемого результата и чисто логически решили, что в Radio Button свойство Enabled действительно лишнее... Ведь чаще всего так и бывает.. И только в моем случае и в ему подобных - оно нужно.. В конце концов ведь это не критично..

Теперь о советах... Господа! Как мне кажется сама идиология Ribbons несовместима с идеей Radio Buttons в данном случае - старо и не красиво.. Посему - самое простое конечно решение создавать элементы RadioGroupItems в run-time, но вспомним, что ранее в этом абзаце мы отказались от него по описанным там же причинам - прошу совета как реализовать менюшку для выполнения статистических запросов (кол-во их заранее известно)? Т.е. что имеется ввиду: отмечаем один из элементов Popup menu (аля Radio button) ну и далее при нажатии самой TcxLargeButton выполняем отмеченный запрос.. Ранее в форуме я уже упоминал, что собираюсь использовать n-ое кол-во TcxLargeButton, в которых использовать свойство Down и таким образом реализовать что-то типа RadioGroup... Только вот где и как это реализовать? Толи в обычном Popup Menu, то ли в галерее.. Буду пробовать... А от Вас Господа я жду конструктивных советов по оформлению дизайна.. За каждый совет и мнение буду очень признателен.. Будете у нас - с меня пиво.. (Или я у Вас)

Спасибо за внимание...
Автор: vladman
Дата сообщения: 28.05.2009 23:58
Meister Floh

Цитата:
Enabled есть, а вот Checked я не нашел..

Так его там и не должно быть
В случае c TcxBarEdit значения Checked устанавливаются свойством EditValue TcxBarEdit'а в соответствии со свойством EditValueFormat. Например, для CheckGroup c 3 Item'ами можно выполнить.

Код: uses
cxCheckBox;
...
TcxCheckGroupProperties(<YourcxBarEditItem>.Properties).EditValueFormat := cvfStatesString;
<YourcxBarEditItem>.EditValue := '011';
...
Автор: dimm78
Дата сообщения: 29.05.2009 01:02

Цитата:
Meister Floh

А не проще использовать тот же TcxLargeButton с выпадающей менюшкой, из обычных cxButton? При нажатии главной кнопки появляется меню, а при выборе конкретного пункта выполняется Ваш статческий запрос. Помоему это логично....
Автор: vladman
Дата сообщения: 29.05.2009 01:31
VitOs2

Цитата:
Подскажите пожалуйста, как можно отследить, находится ли курсор мышки над ApplicationButton?

В событии Ribbon OnMouseMove выполняем

Код: if PtInRect(TdxRibbon(Sender).ViewInfo.ApplicationButtonImageBounds, Point(X, Y))
then Self.Caption := 'IN'
else Self.Caption := 'OUT';
Автор: f3ka
Дата сообщения: 29.05.2009 07:40
Meister Floh
я конечно не проверял, но можно наверно попробывать использовать cxCheckListBox, cxCheckGroup, cxCheckBox и заставлять выбирать только один из вариантов... возможно там не будет таких проблем с запрещением каких либо пунктов и отрисовкой...
Автор: MagistrAnatol
Дата сообщения: 29.05.2009 08:10
Meister Floh поддерживаю dimm78 поставь бутоны и объедени их групу
и поставь им свойство чекед - и будет тебе вариант радиобутонов
Автор: VitOs2
Дата сообщения: 29.05.2009 08:45
vladman
Супер! Огромное спасибо! Работает!
Автор: vladman
Дата сообщения: 29.05.2009 10:32
MagistrAnatol

Цитата:
если ты будеш подкидать под свой сервак то надо твои юзер/пас

Ну конечно же под свой, к вашему же точно не достучусь.


Цитата:
тутича сорцы

Вскрытие показало - причина - неверная реализация master-detail для такого представления как вы выбрали.
Ваш подход верен при классическом представлении, когда в один момент времени отображаются записи дитэйл только одного мастера. В данном же случае вам необходимо в дитэйл датасете выбирать все записи для всех мастеров попавших в выборку, а реализацию соответствий записей из дитэйл к определенному мастеру берет на себя Грид.
т.е. в tblDvig: TpFIBDataSet в SelectSQL вместо
WHERE a.CTAN_AMORT_MASTER_ID=:CTAN_AMORT_MASTER_ID ORDER BY a.DATA указать всего лишь
ORDER BY a.CTAN_AMORT_MASTER_ID, a.DATA .т.е. убрать where и добавить в сортировку поле a.CTAN_AMORT_MASTER_ID, причем первым. Сортировка по a.CTAN_AMORT_MASTER_ID важна, не забудьте это указать.
На первый взгляд это все, но проверить не могу, поскольку билдером не пользуюсь. Так что поправляйте и проверяйте.
Вот еще покопался, и заметил, что у вас V_Dvig.DataController.DataModeController.DetailInSQLMode = True в таком случае можно попробовать другой подход
По 1. пункту (*стал - пропали записи детала с предыдущего мастера*) попробуйте tblDvig.DataSource отвязать от мастера т.е. tblDvig.DataSource = nil.
По 2. пункту (*я вижу токо новую запись, а те что уже были пропадают*) попробуйте в существующий запрос добавить перед сортировкой по дате еще и сортировку по a.CTAN_AMORT_MASTER_ID, должно помочь.

А в общем, мне больше нравится master-detail при DetailInSQLMode = false, проверено много раз - работает отлично. Так что в случае изменения SelectSQL не забудьте V_Dvig.DataController.DataModeController.DetailInSQLMode = false.
Автор: Chukotka
Дата сообщения: 29.05.2009 10:58
vladman

Цитата:
Можно так -


Код:
procedure <YourForm>.<YourcxDBVerticalGridStylesGetContentStyle>(Sender: TObject; AEditProp: TcxCustomEditorRowProperties;
AFocused: Boolean; ARecordIndex: Integer; var AStyle: TcxStyle);
begin
AStyle := <YourcxStyle>; //это обязательно!
if TcxDBEditorRow(AEditProp.Row).Properties.DataBinding.FieldName = '<YourField1Name>' then
AStyle.Color := clRed
else
if TcxDBEditorRow(AEditProp.Row).Properties.DataBinding.FieldName = '<YourField2Name>' then
AStyle.Color := clYellow
else AStyle.Color := clGreen;
end;

Автор: MagistrAnatol
Дата сообщения: 29.05.2009 12:08
vladman
все отлично в отображении но с одним ньюансом - я перегенерировал модифи скл,
в связи с новым селектом и теперь не подставляется ключ мастера при новой записи
в детал


Добавлено:
новую запись я добавляю не через грид,а через диалог
и наверное без where a.CTAN_AMORT_MASTER_ID=:CTAN_AMORT_MASTER_ID
не обойтись
Автор: vladman
Дата сообщения: 29.05.2009 12:51
MagistrAnatol

Цитата:
наверное без where a.CTAN_AMORT_MASTER_ID=:CTAN_AMORT_MASTER_ID не обойтись

Обойтись. Всего навсего в обработчике BeforePost датасета tblDvig нужно выполнить tblDvig['CTAN_AMORT_MASTER_ID'] := tblCtan['CTAN_AMORT_MASTER_ID']
Автор: MagistrAnatol
Дата сообщения: 29.05.2009 13:00
vladman
ну моно и так .Пасиб большое


Добавлено:
vladman
блин я мать торможу не по детски,все добавляется,подставляется ключ мастера

Цитата:
tblDvig['CTAN_AMORT_MASTER_ID'] := tblCtan['CTAN_AMORT_MASTER_ID']

но теперь не вижу новой записи до полной перезагрузки таблицы tblDvig

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

Цитата:
При такой реализации изменения стиля влияет на отрисовку всех ячеек (ибо меняется весь стиль)

Нет, стиль меняется только для нужных Row. Может вас ввело в заблуждение else AStyle.Color := clGreen;?
попробуйте изменить else AStyle := nil. В таком случае только Row c FieldName = '<YourField1Name>' и FieldName = '<YourField2Name>' будут изменять цвет, все остальные будут отрисовываться без применения стиля.
Автор: Chukotka
Дата сообщения: 29.05.2009 13:36
vladman

Цитата:
Нет, стиль меняется только для нужных Row.

Спасибо, проверю еще раз.

Не подскажете - как определить столбец, над которым находится курсор мышки (QuantumTreeList)? Есть ли аналог гридовского GetHitTest(X, Y)? На форуме devexpress мелькал ответ что, дескать, пользуйте <TreeList>.GetHitInfo - такого свойства не нашел.
Автор: vladman
Дата сообщения: 29.05.2009 13:37
MagistrAnatol

Цитата:
но теперь не вижу новой записи до полной перезагрузки таблицы tblDvig

Вы добавляете (Append) в конец. а при простом рефреше рефрешится только одна запись и сортировка не отрабатывает, поэтому и нужен FullRefresh.
Попробуйте вместо tblDvig->Append() tblDvig->Insert()
Автор: MagistrAnatol
Дата сообщения: 29.05.2009 15:00
идет,токо сначала надо tblDvig->Last();

Добавлено:
Пасиб за помощь
Автор: vladman
Дата сообщения: 29.05.2009 15:27
Chukotka

Цитата:
Не подскажете - как определить столбец, над которым находится курсор мышки (QuantumTreeList)?

Подскажу, чего же не подсказать
procedure <YourForm>.<YourcxDBTreeList>MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if TcxDBTreeList(Sender).HitTest.HitAtColumn then
Self.Caption := TcxDBTreeList(Sender).HitTest.HitColumn.Name;
end;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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