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

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

Автор: vladman
Дата сообщения: 15.12.2009 10:05
Graach

Цитата:
Что-то я не поняла вопрос?

Создайте простое приложение, которое проиллюстрирует проблему. Выложите как запускаемый модуль, так и его исходный код.
Автор: Graach
Дата сообщения: 15.12.2009 12:27

Цитата:
Выложите как запускаемый модуль, так и его исходный код.

Ссылка
В архиве простенький проект с одним гридом. И овт так это все выглядит у меня:


ЗЫ. просьба сильно не бить за оформление ссылок...
Автор: vladman
Дата сообщения: 15.12.2009 15:31
Graach

Цитата:
И овт так это все выглядит у меня:

Ну как по мне, правильно выглядит - переносит по словам. Что с ней не так?
Наверное, я понял. Вы, скорее всего, имели ввиду, что в случае неотображения неполного текста Headera его высота (да и высота всей строки) должна динамически увеличиваться. Верно?
Автор: Graach
Дата сообщения: 15.12.2009 18:28
vladman

Цитата:
Вы, скорее всего, имели ввиду, что в случае неотображения полного текста Headera его высота (да и высота всей строки) должна динамически увеличиваться. Верно?

Да! Именно так и делается если не влазит значение Value (как в этом примере, компонент сам перенес текст значения на вторую строчку и соответственно увеличил высоту строки).
Автор: vladman
Дата сообщения: 16.12.2009 00:55
Graach

Цитата:
компонент сам перенес текст значения на вторую строчку и соответственно увеличил высоту строки

Такое поведение регулируется свойствами TcxVerticalGrid.OptionsView.CellAutoHeight и TcxEditRow.Options.CanAutoHeight.
Значения этих свойств используется только для отрисовки Row Value, но не Header'a.
Уже существует suggestion касательно AutoHeight для Caption (Header), но пока еще не реализовано.
Постараюсь что-то придумать для решения вашей проблемы.
Автор: neznayka3
Дата сообщения: 16.12.2009 07:31
afiget

Цитата:
ActivePage.

Не знал, про это свойство. Работает как надо.

Цитата:
Посмотрите: Ссылка 1

Спасибо за ссылку, почитаю. Можно ли как то глобально запретить прорисовку всех DevEx компонент? Чтобы не писать Begin\End Update для каждого грида, BarManager и тд.
Автор: Graach
Дата сообщения: 16.12.2009 09:57
vladman

Цитата:
Постараюсь что-то придумать для решения вашей проблемы.

Моя благодарность не будет знать границ
Автор: vladman
Дата сообщения: 16.12.2009 14:17
Graach
Вот, что-то придумал, пробуйте.
В свой пример добавляйте обработчик OnDrawValue для cxVerticalGrid1, опишите поле
private
FHeaderHeight: Integer;
в классе формы
И, собственно, сами обработчики:

Код: uses
Math;
...
...
procedure TForm2.cxVerticalGrid1DrawRowHeader(Sender: TObject; ACanvas: TcxCanvas; APainter: TcxvgPainter;
AHeaderViewInfo: TcxCustomRowHeaderInfo; var Done: Boolean);
var
vCaptionTextRect: TRect;
vText: string;
begin
vCaptionTextRect := AHeaderViewInfo.CaptionsInfo[0].CaptionTextRect;
vText := AHeaderViewInfo.CaptionsInfo[0].Caption;

ACanvas.Brush.Color := AHeaderViewInfo.ViewParams.Color;
ACanvas.FillRect(AHeaderViewInfo.HeaderRect);
FHeaderHeight := Windows.DrawText(ACanvas.Handle, PChar(vText), Length(vText), vCaptionTextRect, DT_CALCRECT or DT_WORDBREAK) + 4;
Windows.DrawText(ACanvas.Handle, PChar(vText), Length(vText), vCaptionTextRect, DT_WORDBREAK);
Done := True;
end;

procedure TForm2.cxVerticalGrid1DrawValue(Sender: TObject; ACanvas: TcxCanvas; APainter: TcxvgPainter; AValueInfo:
TcxRowValueInfo; var Done: Boolean);
var
vContentRect: TRect;
vText: string;
vContentHeight: Integer;
begin
vContentRect := AValueInfo.ContentRect;
vText := AValueInfo.DisplayValue;

ACanvas.Brush.Color := AValueInfo.ViewParams.Color;
ACanvas.FillRect(AValueInfo.ContentRect);
vContentHeight := Windows.DrawText(ACanvas.Handle, PChar(vText), Length(vText), vContentRect, DT_CALCRECT or DT_WORDBREAK) + 4;
AValueInfo.Row.Height := Max(FHeaderHeight, vContentHeight);
Windows.DrawText(ACanvas.Handle, PChar(vText), Length(vText), vContentRect, DT_WORDBREAK);
Done := True;
end;
Автор: victorman2010
Дата сообщения: 16.12.2009 14:42
Есть dxMemData, через процедуры CreateFieldsFromDataSet и LoadFromDataSet
добавляю поля из дата сета. Вопрос: можно ли в этот dxMemData с уже созданными полями добавлять или удалять поля, ориентируясь на дата сет (что то вроде "DeleteFieldFromDataSet")?
Автор: vladman
Дата сообщения: 16.12.2009 15:07
neznayka3

Цитата:
Можно ли как то глобально запретить прорисовку всех DevEx компонент? Чтобы не писать Begin\End Update для каждого грида, BarManager и тд.

Насколько мне известно - нет. Так ли это необходимо именно для всех компонент? Если все же считаете, что необходимо, напишите свою процедуру перебора всех компонент, например, формы, определения типа очередного компонента и, соответственно, вызова его метода Begin\EndUpdate.

Добавлено:
victorman2010

Цитата:
Есть dxMemData, через процедуры CreateFieldsFromDataSet и LoadFromDataSet

Достаточно вызвать LoadFromDataSet, поля создадутся автоматически.

Цитата:
можно ли в этот dxMemData с уже созданными полями добавлять или удалять поля, ориентируясь на дата сет (что то вроде "DeleteFieldFromDataSet")?

Удалите сначала все поля, а потом снова выполните LoadFromDataSet.
Автор: rokerr
Дата сообщения: 16.12.2009 15:51
Доброе время суток. Помогите разобраться с компонентом cxGrid.

Имеем 2 левела с 2 таблицами связанными между собой. В одной из таблиц cxGrid1DBTableView2 нужно определить выделенные строки. Параметр Multiselect - True.
После выделения нескольких строк, в процессе выполнения цикла

procedure TForm3.Form2N1Click(Sender: TObject);
var
I: Integer;
begin
for i := 0 to cxGrid1DBTableView2.Controller.SelectedRowCount-1 do
begin
showMessage(intToStr(cxGrid1DBTableView1.DataController.Values[i,1]));
end;
end;

значение параметра cxGrid1DBTableView2.Controller.SelectedRowCount сколько бы строк не было выделено =0. Перепробывал все что можно, разобраться не могу. Буду презнателен любой помощи.
Автор: victorman2010
Дата сообщения: 16.12.2009 15:56

Цитата:
Удалите сначала все поля, а потом снова выполните LoadFromDataSet.

Поля удалять не нужно, надо или добавить к ним поля из дата сета или удалить определенные.
Может я не правильно поставил вопрос. Суть в том что есть два Грида с чекбоксами, нужно что бы при снятии (добавлении) флажка с первого, во втором убирались (или добавлялись) флажки (или вообще строки) относящиеся к записи из первого грида (связь одик ко многим). В первом гриде флажков может быть много (с одним все получается)Подскажи пож как это сделать. Передаю переменную через дата сет (BDE - Tquery), он завязан с dxMemData. Может есть различные варианты? Заранее благодарен.
Автор: AvGSoft
Дата сообщения: 16.12.2009 15:59
Комрады хелп ми!
Хочу сделать на TcxDBTreeList checkbox'ы для выбора узлов и входимостей. Для tcxTreeList глянул http://tv.devexpress.com/ExpressQuantumTreeList.tags там чекбокс и радио делаются для групп. В TcxDBTreeList тоже есть OptionsView->CheckGroups ставлю true, а как выбрать Check Group Type . Может че не так мыслю. Кто сталкивался? версия девок 47.
Автор: X11
Дата сообщения: 16.12.2009 16:12

Цитата:
нужно определить выделенные строки.

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

Код: Var
i: integer;
ARowIndex: Integer;
ARowInfo: TcxRowInfo;
...
with dbgMail.dataController do
begin
beginupdate;
Screen.Cursor := crHourGlass;
try
for I := 0 to GetSelectedCount - 1 do
begin
ARowIndex := GetSelectedRowIndex(I);
ARowInfo := GetRowInfo(ARowIndex);
if ARowInfo.Level < Groups.GroupingItemCount then
Continue
else
begin
//unbound or provider mode
edit;
//редактируем выделенную запись
//dbgMailLOCKED - column
Values[ARowInfo.RecordIndex, dbgMailLOCKED.Index] := True;
post;
end;//else
end;//for
finally
endupdate;
Screen.Cursor := crDefault;
end;//try
end;//with
Автор: sldaac
Дата сообщения: 16.12.2009 16:15
rokerr

Цитата:
начение параметра cxGrid1DBTableView2.Controller.SelectedRowCount сколько бы строк не было выделено =0

а так не пробовал
cxGrid1DBTableView2.DataController.Controller.SelectedRecordCount
Автор: vladman
Дата сообщения: 16.12.2009 16:41
rokerr

Цитата:
значение параметра cxGrid1DBTableView2.Controller.SelectedRowCount сколько бы строк не было выделено =0


Если cxGrid1DBTableView2 это подчиненный View, то вам нужно проверять не в самом View а в его клоне. Подробнее о клонах - *Pattern and Clone Views* ms-help://borland.bds5/ExpressQuantumGrid6.BDS5/ExpressQuantumGrid6/IDH_Fundamentals_PatternCloneViews.htm
Т.е. <YourGrid>.FocusedView.DataController.GetSelectedCount

Добавлено:
victorman2010

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


Цитата:
нужно что бы при снятии (добавлении) флажка с первого, во втором убирались (или добавлялись) флажки (или вообще строки) относящиеся к записи из первого грида

Так вам нужно чтобы ПОЛЯ убирались/добавлялись или СТРОКИ (ЗАПИСИ)?

Добавлено:
AvGSoft

Цитата:
В TcxDBTreeList тоже есть OptionsView->CheckGroups ставлю true, а как выбрать Check Group Type

Note that check boxes (radio buttons) can only be used in an unbound control.
Автор: sam291074
Дата сообщения: 16.12.2009 18:17
Подскажите, пожалуйста, как:
1. есть в VGride два поля MaskEdit
2. нужно, чтобы при изменении числового значения одного изменилось значение другого (пересчет по формуле)
3. Проблема - сразу не изменяется . Допустим, сменил 1 на 2, отображает 2, а пересчитывает с 1. Изменил дальше - работает с 2. Отставание на шаг.
Что делаю не так?
Автор: vladman
Дата сообщения: 16.12.2009 19:04
sam291074

Цитата:
Что делаю не так?

Все зависит от того, как вы пересчитываете вычисляемое значение.
Скорее всего, вы используете свойство EditValue. Попробуйте использовать EditingValue.
Автор: sam291074
Дата сообщения: 16.12.2009 19:11
vladman
Простите, а где это?
Я использую VGridRow1->Properties->Value
Автор: vladman
Дата сообщения: 16.12.2009 19:13
AvGSoft

Цитата:
В TcxDBTreeList тоже есть OptionsView->CheckGroups ставлю true, а как выбрать Check Group Type

Note that check boxes (radio buttons) can only be used in an unbound control.
Поразмыслив немного, нашел способ прикрутить CheckGroups к TcxDBTreeList
После загрузки дерева в <YourDBTreeList> выполните:

Код: var
vNode: TcxTreeListNode;
begin
vNode := <YourDBTreeList>.Root;
while vNode <> nil do
begin
vNode.CheckGroupType := ncgCheckGroup;
if (vNode.Level > -1) and (vNode.Index mod 2 = 0) then
vNode.CheckState := cbsChecked
else vNode.CheckState := cbsUnchecked;
vNode := vNode.GetNext;
end;
end;
Автор: sam291074
Дата сообщения: 16.12.2009 19:19
По выходу из поля OnEditValueChanged.
Пробовал и другие события, например OnChange, и тот же результат
Автор: vladman
Дата сообщения: 16.12.2009 19:34
sam291074

Цитата:
По выходу из поля OnEditValueChanged.

Пропишите в этом обработчике, например
Self.Caption := VarToStr(TcxCustomEdit(Sender).EditValue);
Автор: sam291074
Дата сообщения: 16.12.2009 19:51
vladman
Спасибо, ваш совет помог.

А может подскажете, где справочку по девкам взять более полную (если таковая существует), чем та, которую нам пакует feandy. А то ведь такое лихое приведение типов, сам бы не додумался ни в жисть. А в справке забиваю TcxCustomEdit - а там тишина.
Автор: X11
Дата сообщения: 16.12.2009 21:05

Цитата:
А может подскажете, где справочку по девкам взять более полную (если таковая существует),

На офсайте справка в свободном доступе, даже есть видеоруководства. Думаю, что feandy оттуда же и берёт. Куда уж поленее.
Автор: vladman
Дата сообщения: 16.12.2009 22:45
sam291074

Цитата:
А в справке забиваю TcxCustomEdit - а там тишина.

Если вы пользуетесь инстоллером справки от feandy, то, если я не ошибаюсь, для версии среды 2007 вкралась небольшая ошибка. По какой-то причине не всегда регистрируется справка для ExpressEditors Library.
Это легко поправить. Сделайте командный файл (*.bat/*cmd) со следующим содержимым:

Код: "c:\Program Files\CodeGear\RAD Studio\5.0\Help\Doc\H2Reg.exe" -r cmdfile="c:\Program Files\Developer Express Inc\ExpressEditors Library 5\HTMLHelp\ExpressEditors.d11.ini"
Автор: AvGSoft
Дата сообщения: 17.12.2009 13:40
vladman
Преложенный метод не пошел, отображается только чекбокс без текста
Автор: vladman
Дата сообщения: 17.12.2009 14:27
AvGSoft

Цитата:
Преложенный метод не пошел, отображается только чекбокс без текста

А в <YourDBTreeList> есть хотя бы одна TcxDBTreeListColumn? Давайте пример, посмотрю.
Автор: BECHA1
Дата сообщения: 17.12.2009 14:29
Добрый день всем!

На форме есть объект dxDBTreeList, в который должны загружаться данные из той или иной таблицы базы данных, причём у каждой таблицы своё количество колонок. В дизайнере они (колонки) легко добавляются/удаляются, а вот как это сделать из самой программы? В свойствах объекта ничего похожего на Columns.Add/Delete/Clear/Remove и т.д. нету.
Автор: AvGSoft
Дата сообщения: 17.12.2009 14:30
vladman
Сорри мой косяк слетела связь колонки с полем. Все пучком Сенкс.
Автор: maratea
Дата сообщения: 17.12.2009 14:40
Здравствуйте.
Мне нужно экспортировать результаты выборки, выведенные в cxGrid, в Excel. Знаю, что существует ExportGridToExcel, но он специфически отображает данные (как на форме выглядит, так и в таблице получается), а мне нужно получить обычную excel'овскую таблицу, поэтому приходится писать руками. (или есть еще варианты?)

В чем, собственно, проблема.
Данные у меня сгруппированы, вот так:


В excel мне нужно вывести только 2 белые строчки. А я не могу! Постоянно получается то так:
4270 3 298
4270 3 298,
то вообще бред какой-нибудь вперемешку. Наверное, есть какое-то свойство у грида, которое я никак найти не могу. Подскажите, пожалуйста!

Сейчас написано так:

Цитата:

for i := 1 to cxGrid1DBTableView4.DataController.RecordCount
do
for j := 1 to cxGrid1DBTableView4.ColumnCount - cxGrid1DBTableView4.GroupedColumnCount do
begin
S := cxGrid1DBTableView4.ViewData.Records[i - 1].Values[j - 1]; //**
Excel.ActiveWorkBook.WorkSheets[1].Cells[i, j] := S;
end;
end;


**в этой строке вместо j-1 хоть че ставлю, и все равно получается
4270 3 298
4270 3 298.

Я чувствую, что Values - это не то, а истина где-то рядом...
Спасибо!

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

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


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