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

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

Автор: LadyOfWood
Дата сообщения: 03.03.2012 14:40

Цитата:
или дерево само по себе не дёргает датасет и нужно всё самому ручками в базе сделать?

Ихмо, стандартный dataset просто не содержит функций для поддержки данных операций, поэтому ничего и не дергается. Для TcxTreeListCustomDataSource есть отдельный метод для перемещения

Код:
procedure NodeMoveTo(ARecordHandle, AttachRecordHandle: TcxDataRecordHandle; AttachMode: TcxTreeListNodeAttachMode; IsCopy: Boolean);
Автор: X11
Дата сообщения: 03.03.2012 15:49
Переписал с использованием датасетов

Код: procedure TreeMoveUp(cxDBTreeList: TcxDBTreeList);
var
ANode: TcxDBTreeListNode;
begin
ANode := TcxDBTreeListNode(cxDBTreeList.FocusedNode);//выделенный узел, который нужно поднять на уровень вверх
if ANode.ParentKeyValue = 0 then exit;//нулевой уровень, выше уже некуда переносить

if ANode.Parent <> nil then//проверяем существование родителя
with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do
begin
DisableControls;
Edit;
//TcxDBTreeListNode(ANode.Parent).ParentKeyValue - значение ключевого поля нового родителя
FBN('PARENT').Value := TcxDBTreeListNode(ANode.Parent).ParentKeyValue;//нужно переместить на уровень выше своего родителя.
FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем
Post;
EnableControls;
end//with
else
with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do
begin//если у родителя нет родителя, то перемещение происходит со 1го на нулевой уровень, а значит parent = 0
DisableControls;
Edit;
FBN('PARENT').Value := 0;//перемещаем на самый верхний уровень
FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем
Post;
EnableControls;
end;//with

ANode.Focused := true;
cxDBTreeList.SetFocus;
end;

procedure TreeMoveDown(cxDBTreeList: TcxDBTreeList);
var
ANode: TcxDBTreeListNode;
APrevChildNode, ANextChildNode: TcxTreeListNode;
begin
ANode := TcxDBTreeListNode(cxDBTreeList.FocusedNode);
APrevChildNode := ANode.Parent.GetPrevChild(ANode);//вышестоящий равноправный уровень
ANextChildNode := ANode.Parent.GetNextChild(ANode);//нижестоящий равноправный уровень

//в первую очередь стараемcя прилепиться к нижестоящему уровню в качестве дочернего узла
if ANextChildNode <> nil then
with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do
begin
DisableControls;
Edit;
//TcxDBTreeListNode(ANode.Parent).ParentKeyValue - значение ключевого поля нового родителя
FBN('PARENT').Value := TcxDBTreeListNode(ANextChildNode).KeyValue;//нужно переместить на уровень ниже своего родителя.
FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем
Post;
EnableControls;
end//with
else
if APrevChildNode <> nil then
with TpFibDataSet(cxDBTreeList.DataController.DataSource.DataSet) do
begin
DisableControls;
Edit;
//TcxDBTreeListNode(ANode.Parent).ParentKeyValue - значение ключевого поля нового родителя
FBN('PARENT').Value := TcxDBTreeListNode(APrevChildNode).KeyValue;//нужно переместить на уровень ниже своего родителя.
FBN('ID').Value := TcxDBTreeListNode(ANode).KeyValue;//какой узел перемещаем
Post;
EnableControls;
end;//with



ANode.Focused := true;
cxDBTreeList.SetFocus;
end;
Автор: simplecs
Дата сообщения: 03.03.2012 18:41
Здравствуйте!
Такая проблема в CxGrid!
Допустим пользователь применил фильтр на первый столбец : показывать только те записи которые содержат «111». Пусть высветилось 5 записей. Тогда, если он редактирует, с кажем первую и изменяет ее, то поле изменения так как она ужк не равна 111, то автоматически сразу же скрывается. Аналогично и с сортировкой - допустим он отсортировал данные, а потом изменил какую либо запись. CxGrid – автоматически переносит ее в нужное место. Так вот мне этого не нужно! Я хочу чтобы даже при изменении таблица оставалась в том виде, котором была после фильтрации и группировки. А уже потом, после обновления повторного применяла все эти настройки. Где-то должно быть это свойство, но я не могу его найти!
Автор: X11
Дата сообщения: 03.03.2012 18:45
нет таких настроек
Автор: Lena44
Дата сообщения: 03.03.2012 21:22
В простом гриде DBGrid я могу раскрашивать ячейки в зависимости от значения в этой ячейки. Это удобно для пользователя. Фрагмент кода:

Цитата:

void __fastcall TForm1::DBGrid3DrawColumnCell(TObject *Sender, const TRect &Rect,
int DataCol, TColumn *Column, TGridDrawState State)
{
String FName=L"Доходы";
if (Column->Field->FieldName == FName)
{
//min мин. значение к колонке
//max максимальное значение к колонке
DBGrid3->Canvas->FillRect(Rect);
DBGrid3->Canvas->Brush->Color = 0x99FF99;
DBGrid3->Canvas->Rectangle(Rect.Left, Rect.Top, Rect.Left + Rect.Width()*
(Column->Field->AsFloat - min)/(max - min),Rect.Bottom);
DBGrid3->Canvas->Brush->Style = bsClear;
DBGrid3->Canvas->TextOutA(Rect.Left, Rect.Top, Column->Field->AsString);
}
//и т.д.


Подскажите, пожалуйста, в каком событии cxGrid, и как такое можно реализовать?
Автор: X11
Дата сообщения: 03.03.2012 22:21
OnGetContentStyle

Добавлено:

Код:
procedure TfmArendaSearch.dbgArendaStylesGetContentStyle(
Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
AItem: TcxCustomGridTableItem; out AStyle: TcxStyle);
Var
Item: TcxCustomGridTableItem;
begin
Item := TcxCustomGridTableItem(Sender.Tag);
if AItem = nil then exit;

if AItem.Index = dbgArendaTYPE_NAME.Index then
if not VarIsNull(чего-нибудь можно проверить) then
begin
if not Assigned(AStyle) then
AStyle := TcxStyle.Create(Sender);
AStyle.TextColor := clBlue;
end;
end;
Автор: Lena44
Дата сообщения: 04.03.2012 12:40
Постараюсь быть чуть подробнее. Мне надо раскрасить значения в ячейке в зависимости от номинала, который есть в ячейке. Подробнее на рисунке: http://img40.imageshack.us/img40/3410/gifimb.gif
Автор: andreybear
Дата сообщения: 05.03.2012 06:06
Lena44
Используйте событие onCustomDrawCell.
Автор: mdid
Дата сообщения: 05.03.2012 07:54
andreybear
не вводите в заблуждение...когда то сами дефки просили избегать этого метода...
Lena44
событие OnGetContentStyle есть как у всей вьюхи так и отдельной колонки...если вам надо ячейка то обрабатывайте OnGetContentStyle именно колонки
Автор: andreybear
Дата сообщения: 05.03.2012 08:38
mdid
Я не слышал об этом. Поясните, пожалуйста, почему

Цитата:
сами дефки просили избегать этого метода...
Автор: X11
Дата сообщения: 05.03.2012 08:52

Цитата:
Постараюсь быть чуть подробнее. Мне надо раскрасить значения в ячейке в зависимости от номинала, который есть в ячейке. Подробнее на рисунке: http://img40.imageshack.us/img40/3410/gifimb.gif


я Вам дал пример
Автор: mdid
Дата сообщения: 05.03.2012 08:52
andreybear
я без понятия...я просто когда то это читал у них на форуме..они рекомендуют юзать только OnGetContentStyle...поэтому во избежание конфликтов лучше не юзать onCustomDrawCell....тем более возможностей OnGetContentStyle хватает на все случаи жизни
Автор: salexn1
Дата сообщения: 05.03.2012 11:42
mdid
andreybear
хttp://www.devexpress.com/Support/Center/p/A328.aspx
Это пример с оф. сайта
Связано это с печатью, экспортом и т.д.
Если юзать стили, то все корректно можно экспортнуть\напечатать.
При cusomdraw - не всегда
Автор: Lena44
Дата сообщения: 05.03.2012 19:50
Подскажите, пожалуйста о cxGrid.
Я добавила в футер таблицы суммирующие ячейки. Как текст в этих ячейках выделить жирным и добавить слово "итого"? У суммирующей ячейки есть свойство Display Text, но оно, ни на что не влияет.
Автор: X11
Дата сообщения: 05.03.2012 20:13
Совсем недавно этот вопрос поднимался, просмотри 1-3 страницы назад.
Но на счет жирности не знаю.
Автор: Lena44
Дата сообщения: 05.03.2012 20:50
Понятно. Спасибо.
Наверное жирность как-то можно добавить. Если щелкнуть по гриду F1 то показывается картинка где футеры жирные. Правда не написано как это сделано.
http://img535.imageshack.us/img535/3752/gifxn.gif
Автор: X11
Дата сообщения: 05.03.2012 21:00
смотрите в свойствах <cxGridDBTableView>.Styles.Footer
Автор: Lena44
Дата сообщения: 05.03.2012 21:06
Спасибо! Все получилось.
Создала стиль с жирным текстом в компоненте cxStyleRepository1. Затем выбрала в дизайнере нужную колонку. У нее в свойстве футора назначала созданный стиль.
Автор: andreybear
Дата сообщения: 07.03.2012 04:46
mdid
salexn1
А можно картинку вывести в ячейку или полячейки закрасить в OnGetContentStyle?

Добавлено:
И еще вопрос ко всем.
В колонке cxGrid Properties = MaskEdit. При вводе числа с пятью и более знаками после запятой с 0 целой частью, например, 0.00001, в ячейке отображается значение 15. Если десять знаков после запятой, то 110. В таком случае в БД пишется значение в виде 1E-n, где n - степень (в первом случае 1E-5, во втором - 1E-10). Не понятно, почему значения выводятся таким образом и как решить эту проблему. Хочется, чтобы число отображалось в том виде, в котором его ввел пользователь, ведь 15 - это не 0.00001, и даже не не 1E-5.
Автор: simplecs
Дата сообщения: 07.03.2012 07:00
Здравствуйте!
Вот такая проблема – пытаюсь добавить стандартные редакторы на определенные столбцы своего cxGrid-а d Delphi!

Код:
Var
ADBColumn: TcxGridDBColumn;
.......
ADBColumn:=cxGrid1DBTableView1.CreateColumn;
ADBColumn.DataBinding.FieldName :=’1’;
ADBColumn.RepositoryItem:=cxEditRepository1DateItem;
Автор: salexn1
Дата сообщения: 07.03.2012 07:16
simplecs
значит называется не cxEditRepository1DateItem, а по другому
Автор: exteris
Дата сообщения: 07.03.2012 07:19

Цитата:
Хотя все тоже самое! Не подскажите в чем дело?

Видимо, все-таки, не тоже самое...
Автор: simplecs
Дата сообщения: 07.03.2012 07:26
Уже переименовал это сложное название компонента в Dt1
В TYpe записалось автоматом:
TFrmMain = class(TForm)
...
Dt1: TcxEditRepositoryDateItem;
...

Редактор delphi не видит в автоматическом просмоторщике при написании кода Dt1 и соответственно при компиляции опять дает ошибку на строке:
ADBColumn.RepositoryItem:=dt1;
[DCC Error] UntMain.pas(325): E2003 Undeclared identifier: 'dt1'


Да, Dt1 я делаю следующим образом: кидаю на форму cxEditRepository1. Далее два раза щелкаю, выбираю Add потом редактор DateEdit и все. Захожу еще раз, проверяю - все ОК! Он там, а при компиляции - ОШИБКА
Автор: salexn1
Дата сообщения: 07.03.2012 07:26
simplecs
в коде у вас
ADBColumn.RepositoryItem:=cxEditRepository1DateItem;
а объявлено как
cxEditRepository1DateItem1

разница в один символ.... ищите
Автор: simplecs
Дата сообщения: 07.03.2012 07:30
ОБшибся при написании сообщения!
Было именно так как Вы и написали!.
Посмотрите переименовал эту ерунду в простое имя - та же проблема!
Автор: salexn1
Дата сообщения: 07.03.2012 07:38
simplecs
Только что попробовал... Все работает.
Вот мой код

Код:
type
TForm1 = class(TForm)
cxEditRepository1: TcxEditRepository;
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
dt1: TcxEditRepositoryDateItem;
cxGrid1DBTableView1Column1: TcxGridDBColumn;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
cxGrid1DBTableView1Column1.RepositoryItem := dt1;
end;
Автор: simplecs
Дата сообщения: 07.03.2012 07:39
Вот смотрите:
http://s1.hostingkartinok.com/uploads/images/2012/03/81f01660cf4e8458c0aed7de745aea33.png
http://s1.hostingkartinok.com/uploads/images/2012/03/f61ddad613a2e5b879d57ae569e7203f.png
http://s1.hostingkartinok.com/uploads/images/2012/03/2c46615030c942953442d18ba4768e0e.png
Автор: salexn1
Дата сообщения: 07.03.2012 07:44
simplecs
а если так
ADBColumn.RepositoryItem := cxEditRepository1.ItemByName('имя');
Автор: simplecs
Дата сообщения: 07.03.2012 07:52
Я понял почему не работало!
salexn1 спасибо! Ваш код меня просвятил!
Просто вызов я делал из внешней процедуры, которая dt1 просто не видела!
А писать надо было frmmain.dt1 и ВСЕ!

Прошу прощения за отнятое время!
Автор: salexn1
Дата сообщения: 07.03.2012 09:30
simplecs
Лучше сделайте отдельный дата модуль, куда сложите все свои RepositoryItems.
Сделайте publiс методы для получения нужного итема, типа так

public
function GetDateRepositoryItem: TcxEditRepositoryItem;
function GetIntRepositoryItem: TcxEditRepositoryItem;
function GetFloatRepositoryItem: TcxEditRepositoryItem;
и т.д.
...


function TRepositoryModule.GetDateRepositoryItem: TcxEditRepositoryItem;
begin
Result := cxEditRepository.ItemByName('имя_для_date');
end;


Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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