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

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

Автор: golkanavt
Дата сообщения: 24.07.2007 17:53
Вопрос следующий: в гриде по умолчанию по-разному раскрашиваются четные-нечетные записи, т.е. ContentEven, ContentOdd имеют разные стили. В этом же гриде необходимо применять различные варианты выделения записей цветом/шрифтом, в зависимости от данных в записи. Пытался сделать таким образом - в обработчике OnGetContentStyle по-умолчанию назначать стиль соответственно позиции записи, т.е. четная/нечетная, а потом по дополнительным условиям изменять параметры этого стиля, цвет или шрифт. Такой вариант не прокатывает, выдает ошибку, т.е. похоже на ходу менять стиль нельзя. Плодить новый стиль под каждую комбинацию по принципу варианты для четных строк, варианты для нечетных строк - как то коряво, имхо. У кого есть соображения на этот счет, как лучше сделать? Спасибо ответившим.
Автор: Dennica
Дата сообщения: 25.07.2007 06:24
golkanavt
Ну тут два варианта. Либо плодить стили под все комбинации либо обойтись без стилей и самому задавать цвет фона/шрифта в OnCustomDrawCell

Добавлено:
В принципе можно и комбинировать оба эти варианты. Базовые установки задать стилями а в OnCustomDrawCell изменять нужные параметры отображения
Автор: HiTech2003
Дата сообщения: 25.07.2007 11:44
Dronton2


Цитата:
Используй TcxDataSummaryItems.OnSummary


Спасибо. Но ведь используя событие OnSummary мы получаем возможность менять только отдельные аргументы для рассчета итоговой Group Summary, но не саму функцию. Как например с помощью данного метода реализовать Group Summary в виде произведения элементов, входящих в эту группу?

Автор: Dronton2
Дата сообщения: 25.07.2007 12:59
HiTech2003
Для этих целей нужно вводить глобальную переменную и произведение накапливать в ней.
Вот пример использования: Ссылка
Автор: jicoff
Дата сообщения: 26.07.2007 12:49
Dronton2

Кривова-то все получается. Надо где-то сохранять для каждого нестандартного случая пересчета суммарного значения накапливаемую переменную. Посмотрел, нельзя ли сделать наследника от стандартного класса для реализации нестандартных случаев пересчета, но увы. А всего-то надо было ребятам добавить в событие текущее значение уже накопленного результата и проблем не было реализовать любой нестандартный случай.
Автор: xRay
Дата сообщения: 27.07.2007 12:43
Может кто ни будь подсказать как в cxGrid раскрасить конкретную группу (в сгруппированом Гриде по одной колонке) а не все группы?
Автор: jicoff
Дата сообщения: 27.07.2007 14:22
xRay

Полагаю на CustomDraw, проверять группу и задавать цвета раскраски.
Автор: zver
Дата сообщения: 30.07.2007 22:53
Как напечатать cxGrid через PrintingSystem???
----dxComponentPrinter1->CurrentLink= dxComponentPrinter1->AddLink(cxGrid1);
----dxComponentPrinter1->Preview();
Так не получается.
Автор: skinash
Дата сообщения: 30.07.2007 23:33
Пытаюсь обновить старый проект, заменив стандартные компоненты на DevExpress. Столкнулся с такой проблемой: компоненты TComboBox и TcxComboBox по разному отрабатывают события ComboBox.OnChange и cxComboBox.Properties.OnChange. (Оба они FixedList.) А конкретно, если RunTime назначить каждому ItemIndex, то у ComboBox OnChange не возникнет, а у cxComboBox.Properties OnChange возникнет в любом случае. Хотелось бы, чтобы у cxComboBox OnChange срабатывал, когда я сам в нём что-то выбираю (мышью или с клавиатуры).
Как бы вы мне в этом случае посоветовали поступить?
Автор: X11
Дата сообщения: 31.07.2007 07:56

Код:
PrintToLazer(ActiveControl);


...

procedure TfmMain.PrintToLazer(grid:TObject);
begin
if not CanPrintToLaser(true) then exit;

if (grid is TDBGridEh) then begin
prnDBGrid.DBGridEh := (grid as TDBGridEh);
prnDBGrid.Preview;
exit;
end;

if (grid is TcxGridSite) then begin
dxComponentPrinter1Link1.Component := ((grid as TcxGridSite).Container as TcxGrid);
dxComponentPrinter1.Preview(true);
exit;
end;

ShowMessage('Выберите таблицу(сетку), которую желаете распечатать.');
end;


Автор: PaulNBir
Дата сообщения: 31.07.2007 15:32
skinash

Цитата:
... А конкретно, если RunTime назначить каждому ItemIndex, то у ComboBox OnChange не возникнет, а у cxComboBox.Properties OnChange возникнет в любом случае. Хотелось бы, чтобы у cxComboBox OnChange срабатывал, когда я сам в нём что-то выбираю (мышью или с клавиатуры).
Как бы вы мне в этом случае посоветовали поступить?


вот так должно работать:
cxComboBox1.LockChangeEvents(True,False);
cxComboBox1.ItemIndex := SomeValues;
cxComboBox1.LockChangeEvents(False,False);
Автор: skinash
Дата сообщения: 31.07.2007 21:59
PaulNBir
Спасибо, то что надо! Поди ж, догадайся!
Автор: korobovmax
Дата сообщения: 01.08.2007 13:57
golkanavt, в OnGetContentStyle стиль объявлен как "out AStyle: TcxStyle". У него нельзя менять параметры - можно только присваивать.

Соответственно, надо сначала собирать стиль, а потом присваивать его AStyle'у. И ошибки не будет. Проверено.
Автор: jicoff
Дата сообщения: 01.08.2007 14:21
korobovmax

Конечно у параметра события нельзя менять свойства, т.к. входящее значение NULL, чего и не делает golkanavt, не понятно почему у него выдает ошибку. У меня реализована такая же идея, и все работает.
Автор: skinash
Дата сообщения: 01.08.2007 15:25
Снова я со своим TcxComboBox
Рисую на нём "превью стилей" (bsSolid, bsClear, bsHorisontal и т.д.)
[more]Код:

procedure TBrushPropForm.cbBrushStylesPropertiesDrawItem(
AControl: TcxCustomComboBox; ACanvas: TcxCanvas; AIndex: Integer;
const ARect: TRect; AState: TOwnerDrawState);
var
R, Rect: TRect;
S: string;
begin
with AControl, ACanvas do
begin
Brush.Style := bsSolid;
Rect := ARect;
FillRect(Rect);
R := Classes.Rect(Rect.Left + 3, Rect.Top + 3, Rect.Left + 43, Rect.Bottom - 3);
Brush.Style := TBrushStyle(AIndex);
if (odSelected in AState) then
begin
case Brush.Style of
bsSolid: Brush.Color := clBlack;
bsClear: Brush.Color := clHighlight;
else
Brush.Color := clWhite;
end;
Pen.Color := clWhite;
end
else
begin
if Brush.Style = bsClear then
Brush.Color := clWhite
else
Brush.Color := clBlack;
Pen.Color := clBlack;
end;
InflateRect(R, 1, 1);
Rectangle(ACanvas.Handle, R.Left, R.Top, R.Right, R.Bottom);
Brush.Style := bsClear;
OffsetRect(Rect, 52, 0);
S := Properties.Items[AIndex];
R.Top := Rect.Top + ((Rect.Bottom - Rect.Top) - TextHeight(S)) div 2;
Canvas.TextOut(Rect.Left, R.Top, S);
end;
end;[/more]
Опять же для стандартного ComboBox'а это работало, а здесь
во-первых текст может заезжать на кнопку,
во-вторых если нажать на кнопку выпадения списка, когда уже выбран любой пункт, кроме "сплошная"(bsSolid) или "прозрачная"(bsClear), то в выпадающем списке картинки рисует все, а в самом верхнем "Edit'е" только техт, без картинки
[more] [/more]
Прошу помочь!
Автор: korobovmax
Дата сообщения: 01.08.2007 15:42
jicoff, golkanavt так делает:

Цитата:
по дополнительным условиям изменять параметры этого стиля, цвет или шрифт. Такой вариант не прокатывает, выдает ошибку


И получает ошибку. Вы говорите, что он этого не делает и получает ошибку. %)
Какая идея при этом у вас реализована для меня - загадка.



Добавлено:
А, нет, стоп!

Он присвоил AStyle свой стиль, а потом изменил в нем что-либо. Да, так будет работать!
Автор: golkanavt
Дата сообщения: 01.08.2007 16:48
korobovmax

Цитата:
Соответственно, надо сначала собирать стиль, а потом присваивать его AStyle'у. И ошибки не будет. Проверено.

И так тоже пробовал, в итоге забил - нагородил стилей на все случаи жизни.
jicoff
Кусок кода можно увидеть, чисто из любопытства, ибо, как сказал выше - проблему решил обходным маневром
Автор: korobovmax
Дата сообщения: 01.08.2007 17:06
golkanavt

Цитата:
И так тоже пробовал


А чем не понравилось? Довольно удобно, если надо похожие стили создавать.
Автор: golkanavt
Дата сообщения: 02.08.2007 12:30
korobovmax
Не понравилось тем, что не работает, особенно при использовании фильтрации грида. Если в гриде только записи одного формата, худо-бедо с тормозами отрабатывает, как только появляется сложно форматированная запись - все, приехали, вылетает с ошибкой.
Автор: jicoff
Дата сообщения: 02.08.2007 13:16
korobovmax

Идея в следующем, есть два мембера в классе: FUpdateLockCount и stlContent. stlContent - это стиль. Т.к. заранее неизвестны параметры ячейки, вызывается метод GetContentParams для получения значений по умолчанию, а он в свою очередь еще раз вызывает это событие, поэтому для исключения зацикливания используется FUpdateLockCount.

void __fastcall TClassName::bvViewStylesGetContentStyle(
TcxCustomGridTableView *Sender, TcxCustomGridRecord *ARecord,
TcxCustomGridTableItem *AItem, TcxStyle *&AStyle)
{
if(FUpdateLockCount)
return;

++FUpdateLockCount;
try
{
TcxViewParams AParams;

AItem->Styles->GetContentParams(ARecord, AParams);
stlContent->Color = AParams.Color;
stlContent->Font->Assign(AParams.Font);
stlContent->Font->Style = TFontStyles(stlContent->Font->Style) << fsBold;
stlContent->TextColor = AParams.TextColor;
AStyle = stlContent;
}
__finally
{
--FUpdateLockCount;
}
}
Автор: korobovmax
Дата сообщения: 02.08.2007 16:55
jicoff, круто!

У меня такой вопрос: я в OnGetContentStyle собираю стиль для ячейки, проверяю условия применения собранного стиля. Вопрос: а как изменить обычный цвет фона в выделенной ячейке (ячейки, у которых selected и focused = 1, editing = 0)?
Присваивать свой стиль к DBTableView.Styles.Selection нельзя, пользоваться OnCustomDraw тоже
Автор: jicoff
Дата сообщения: 02.08.2007 20:41
korobovmax

А разве менять у стиля Color не приводит к нужному результату?
Автор: korobovmax
Дата сообщения: 03.08.2007 12:25
Не-а.
При Focused - обычный синий цвет выделенного, при не focused - обычный серый.
Если давать DBTableView.Styles.Selection все ок, только это нельзя
Автор: golkanavt
Дата сообщения: 03.08.2007 12:55
Кто нибудь может объяснить, почему после перехода на июньскую версию девок при экспорте данных из грида в Excel (метод ExportGridToExcel) перестали выводиться данные группировок, т.е. в гриде есть значение сумм по группам, в экселевском листе - нет? Как вернуть эти данные?
Автор: nadazero
Дата сообщения: 05.08.2007 13:43
Помогите пожалуйста разобраться с сохранением данных в базу из XtraGrid.
Невысокий уровень знаний в области программирования не позволяет мне решить мою проблему самостоятельно.

Суть проблемы:
Не получается отослать в базу данных изменнения в таблице.

Аналогичная проблема здесь обсуждалась и была решена следующим образом:
автотранспортTableAdapter.Update(tyreManagerDataBaseDataSet.Автотранспорт);

После применения мною аналогичного кода, выдается сообщение:
"Update requires a valid UpdateCommand when passed dataRow collection with modified rows".

В DataSet дизайнере обнаружил, что команде Update не сопоставлен SQL запрос.
Самостоятельно составленный запрос вносит в базу данных лишь последнее изменение, причем во весь столбец.

Пожалуйста подскажите, как грамотно составить SQL запрос для команды Update.
Или может я вообще не с той стороны подхожу к вопросу сохранения данных?

Заранее благодарен!
Автор: leonbn
Дата сообщения: 05.08.2007 22:27
golkanavt
Смотри
Сам мучаюсь. Обещают пофиксить в следующем релизе. Хотя некоторые получили апдейт по почте.
Автор: golkanavt
Дата сообщения: 06.08.2007 13:07
leonbn
Плохая новость, придется лезть в исходники, править ручками, бо фикса от них по мылу не дождаться - рылом (лицензией, точнее ее отсутствием) не вышел
Автор: skinash
Дата сообщения: 06.08.2007 14:52
Похоже мой вопрос тут потонул.
С первым пунктом вопроса разобрался с помощью DrawText: [more]
Код: procedure TForm1.cbBrushStylesPropertiesDrawItem(AControl: TcxCustomComboBox;
ACanvas: TcxCanvas; AIndex: Integer; const ARect: TRect;
AState: TOwnerDrawState);
var
R, Rect: TRect;
S: string;
begin
with ACanvas do
begin
Brush.Style := bsSolid;
Rect := ARect;
FillRect(Rect);
R := Classes.Rect(Rect.Left + 3, Rect.Top + 3, Rect.Left + 43, Rect.Bottom - 3);
Brush.Style := TBrushStyle(AIndex);
if odSelected in AState then
begin
case Brush.Style of
bsSolid: Brush.Color := clBlack;
bsClear: Brush.Color := clHighlight;
else
Brush.Color := clWhite;
end;
Pen.Color := clWhite;
end
else
begin
if Brush.Style = bsClear then
Brush.Color := clWhite
else
Brush.Color := clBlack;
Pen.Color := clBlack;
end;

InflateRect(R, 1, 1);
Rectangle(ACanvas.Handle, R.Left, R.Top, R.Right, R.Bottom);
Brush.Style := bsClear;
Inc(Rect.Left, 50);
S := AControl.Properties.Items[AIndex];
DrawText(S, Rect, cxAlignVCenter);
end;
end;
Автор: DrunkFlier
Дата сообщения: 06.08.2007 16:44
Пытаюсь засунуть экранные формы в dll, как только на форму попадает компонент из DevExpress, появляется
Access Violations. В чем может быть проблема (BDS2006)
Автор: Katerinochka
Дата сообщения: 06.08.2007 17:06
Подскажите пожалуйста, как установить исходники и главное, как пользоваться ими для нужных контролов?
У меня есть исходники DXperience 7.1.1 для VS2005, но в студии уже стоял DXperience 7.1.4 без исходников. Я закачала исходники в папку C:\Program Files\Developer Express .NET v7.1\Sources и допустим хочу посмотреть код DateEdit и немножко его отредактировать. Это возможно, есди да, то как?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182

Предыдущая тема: Язык программирования на русском языке


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