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

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

Автор: afiget
Дата сообщения: 15.09.2010 16:33
Есть в справке: Obtain And Set Summary Values.
Автор: mdid
Дата сообщения: 16.09.2010 08:23
afiget
пасиб...будем читать

сдается мне что я где то торможу но хз де..хрен его знает где искать сумму...в хелпе по этому поводу такое

Код:
AGroups := tvOrders.DataController.Groups;
with tvOrders.DataController.Summary do
begin
for I := 0 to GroupSummaryItems[0].Count - 1 do
begin
if TcxGridTableSummaryItem(GroupSummaryItems[0].Items[I]).Column = tvOrdersPurchaseDate then
AValue := GroupSummaryValues[AGroups.ChildDataGroupIndex[-1, 4], I];
end;

Автор: X11
Дата сообщения: 16.09.2010 14:01
Когда был вопрос о том, как перекинуть данные из cxGrid в какой-нибудь датасет, например, в TdxMemData, чтобы этот датасет далее экспортировать или распечатать другими компонентами. Наконец-то руки дошли. Хотел бы, чтобы великий All покритиковал код (класс). Возможно, что у вас будут ещё идеи по улучшению и доработке кода.

Здесь выложил

[more=И здесь повторяю:]

Код: unit uCxGridToMemTable;

interface

uses
cxGridDBTableView, cxGridCustomTableView, dxmdaset, DB, Classes, dxCore;

Type
TcxGridToMemTable = class(TObject)
private
fGrid: TcxCustomGridTableView;
fMemData: TdxMemData;



function GetValidName(AOwner: TComponent; AName: string): string;
procedure LoadAllRecords();
procedure LoadSelectedRecords();
protected

public
constructor Create(grid1: TcxCustomGridTableView; memdata1: TdxMemData = nil);
destructor Destroy; override;


procedure CreateFields();
procedure LoadData(bOnlySelected: boolean);

end;

implementation

uses
SysUtils, Dialogs, cxGridDBBandedTableView, cxCustomData;

{ TcxGridToMemTable }

constructor TcxGridToMemTable.Create(grid1: TcxCustomGridTableView; memdata1: TdxMemData = nil);
begin

//если не передаём в класс memdata1, то создаём его сами
if memdata1 = nil then
fMemData := TdxMemData.Create(nil)
else
fMemData := memdata1;


fGrid := grid1;
end;

destructor TcxGridToMemTable.Destroy;
begin
if fMemData <> nil then FreeAndNil(fMemData);

inherited;
end;

function TcxGridToMemTable.GetValidName(AOwner: TComponent;
AName: string): string;
var
I: Integer;
begin
//фунцию выдрал из модуля dxmdaset.pas

for I := 1 to Length(AName) do
if not (dxCharInSet(AName[I], ['A'..'z']) or dxCharInSet(AName[I], ['0'..'9'])) then
AName[I] := '_';
if dxCharInSet(AName[1], ['0'..'9']) then
AName := '_' + AName;

Result := AName;

I := 0;
while AOwner.FindComponent(Result) <> nil do
begin
Result := AName + IntToStr(I);
Inc(I);
end
end;

procedure TcxGridToMemTable.LoadAllRecords;
Var
i, f: integer;
FieldVal: Variant;
begin
//загружаем только видимые записи, т.к. пользователь может отфильтровать некоторые записи
fMemData.open;

if fGrid is TcxGridDBBandedTableView then
with TcxGridDBBandedTableView(fGrid) do
for I := 0 to fGrid.DataController.FilteredRecordCount - 1 do
begin
fMemData.Append;
for f := 0 to ColumnCount - 1 do
if fMemData.FindField(columns[f].DataBinding.Field.FieldName) <> nil then
begin
FieldVal := DataController.Values[DataController.FilteredRecordIndex[i], columns[f].Index];
fMemData.FieldByName(columns[f].DataBinding.Field.FieldName).Value := FieldVal;
end;//for f := 0 to ColumnCount - 1 do
fMemData.post;
end;//for I := 0 to fGrid.DataController.FilteredRecordCount - 1 do

if fGrid is TcxGridDBTableView then
with TcxGridDBTableView(fGrid) do
for I := 0 to fGrid.DataController.FilteredRecordCount - 1 do
begin
fMemData.Append;
for f := 0 to ColumnCount - 1 do
if fMemData.FindField(columns[f].DataBinding.Field.FieldName) <> nil then
begin
FieldVal := DataController.Values[DataController.FilteredRecordIndex[i], columns[f].Index];
fMemData.FieldByName(columns[f].DataBinding.Field.FieldName).Value := FieldVal;
end;//for f := 0 to ColumnCount - 1 do
fMemData.post;
end;//for I := 0 to fGrid.DataController.FilteredRecordCount - 1 do

end;

procedure TcxGridToMemTable.LoadData(bOnlySelected: boolean);
begin
fMemData.Open;

case bOnlySelected of
True : LoadSelectedRecords;
False: LoadAllRecords;
end;

end;

procedure TcxGridToMemTable.LoadSelectedRecords;
Var
i, f: integer;
FieldVal: Variant;
ARowIndex: Integer;
ARowInfo: TcxRowInfo;
begin
//загружаем только видимые записи, т.к. пользователь может отфильтровать некоторые записи
fMemData.open;

if fGrid is TcxGridDBBandedTableView then
with TcxGridDBBandedTableView(fGrid), TcxGridDBBandedTableView(fGrid).DataController do
begin
beginupdate;
try
for I := 0 to GetSelectedCount - 1 do
begin
ARowIndex := GetSelectedRowIndex(I);
ARowInfo := GetRowInfo(ARowIndex);
if ARowInfo.Level < Groups.GroupingItemCount then
Continue
else
begin

fMemData.Append;
for f := 0 to ColumnCount - 1 do
if fMemData.FindField(columns[f].DataBinding.Field.FieldName) <> nil then
begin
FieldVal := Values[ARowInfo.RecordIndex, columns[f].Index];
fMemData.FieldByName(columns[f].DataBinding.Field.FieldName).Value := FieldVal;
end;//for f := 0 to ColumnCount - 1 do
fMemData.post;


end;
end;//for I := 0 to GetSelectedCount - 1 do
finally
endupdate;
end;
end;//with


if fGrid is TcxGridDBTableView then
with TcxGridDBTableView(fGrid), TcxGridDBTableView(fGrid).DataController do
begin
beginupdate;
try
for I := 0 to GetSelectedCount - 1 do
begin
ARowIndex := GetSelectedRowIndex(I);
ARowInfo := GetRowInfo(ARowIndex);
if ARowInfo.Level < Groups.GroupingItemCount then
Continue
else
begin

fMemData.Append;
for f := 0 to ColumnCount - 1 do
if fMemData.FindField(columns[f].DataBinding.Field.FieldName) <> nil then
begin
FieldVal := Values[ARowInfo.RecordIndex, columns[f].Index];
fMemData.FieldByName(columns[f].DataBinding.Field.FieldName).Value := FieldVal;
end;//for f := 0 to ColumnCount - 1 do
fMemData.post;


end;
end;//for I := 0 to GetSelectedCount - 1 do
finally
endupdate;
end;
end;//with


end;

procedure TcxGridToMemTable.CreateFields();
Var
i: integer;
AField: TField;
begin
fMemData.close;
//удаляем все поля, чтобы создать их заново
with fMemData do
while FieldCount > 1 do
Fields[FieldCount - 1].Free;


if fGrid is TcxGridDBBandedTableView then
with TcxGridDBBandedTableView(fGrid) do
begin
for i := 0 to ColumnCount - 1 do
if Columns[i].Visible then
with TField.Create(fMemData) do
begin
AField := DefaultFieldClasses[Columns[i].DataBinding.Field.DataType].Create(fMemData);
AField.Name := GetValidName(fMemData, Name + Columns[i].DataBinding.Field.FieldName);

AField.DisplayLabel := Columns[i].DataBinding.Field.DisplayLabel;
AField.DisplayWidth := Columns[i].DataBinding.Field.DisplayWidth;
AField.EditMask := Columns[i].DataBinding.Field.EditMask;
AField.FieldName := Columns[i].DataBinding.Field.FieldName;
AField.Visible := Columns[i].DataBinding.Field.Visible;
AField.FieldKind := Columns[i].DataBinding.Field.FieldKind;
AField.DataSet := fMemData;
end;//with TField.Create(fMemData) do

fMemData.FieldDefs.Update;
end;//with TcxGridDBTableView(fGrid) do


if fGrid is TcxGridDBTableView then
with TcxGridDBTableView(fGrid) do
begin
for i := 0 to ColumnCount - 1 do
if Columns[i].Visible then
with TField.Create(fMemData) do
begin
AField := DefaultFieldClasses[Columns[i].DataBinding.Field.DataType].Create(fMemData);
AField.Name := GetValidName(fMemData, Name + Columns[i].DataBinding.Field.FieldName);

AField.DisplayLabel := Columns[i].DataBinding.Field.DisplayLabel;
AField.DisplayWidth := Columns[i].DataBinding.Field.DisplayWidth;
AField.EditMask := Columns[i].DataBinding.Field.EditMask;
AField.FieldName := Columns[i].DataBinding.Field.FieldName;
AField.Visible := Columns[i].DataBinding.Field.Visible;
AField.FieldKind := Columns[i].DataBinding.Field.FieldKind;
AField.DataSet := fMemData;
end;//with TField.Create(fMemData) do

fMemData.FieldDefs.Update;
end;//with TcxGridDBTableView(fGrid) do
end;




end.



Использование:
Var
cxGridToMemTable: TcxGridToMemTable;
begin

//memExport - TdxMemData
//dbgApart - TcxGridDBBandedTableView

TcxGridToMemTable.Create(dbgApart, memExport);
cxGridToMemTable.CreateFields;//создаём только видимые поля грида
cxGridToMemTable.LoadData(False);//загружаем данные, все или только выделенные записи

//далее заполненный memExport можно использовать в других компонентах, например отправить на печать с помощью FastReports или экспортировать с помощью EMS Advanced Data Export
Автор: X11
Дата сообщения: 17.09.2010 11:09
Есть TcxGridDBBandedTableView. Подскажите, как узнать принадлежность колонки к тому или иному бэнду?

Получается, что если колонки не скрывать, а скрыть бэнд, то Columns[i].Visible всё равно вернёт True, хотя по сути колонка-то не видна

Добавлено:
Ура. Нашёл Columns[i].Position.Band.Visible
Автор: Prizzzrak777
Дата сообщения: 17.09.2010 14:48
Всем привет нужна помощь. DevExpress v50/ cxGrid. У Master уровня 3 Detail уровня. Не могу поставить курсор на первую строку Detail уровня при переключении табов. ловлю событием OnActiveTbChanged, но он возвращает его обратно на запись Master уровня. Кто может что посоветовать?

Код например такой:

Код:
if (ALevel=cxGrid1Level2) or (ALevel=cxGrid1Level5) or (ALevel=cxGrid1Level6) then
begin

RowIndex:=ALevel.DataRelation.DataController.GetFocusedRowIndex;
if TcxGridViewData(ALevel.GridView.Clones[RowIndex].ViewData).RowCount>0 then
begin

TcxGridViewData(ALevel.GridView.Clones[RowIndex].ViewData).Rows[0].Focused:=true;
ShowMessage(inttostr(TcxGridViewData(ALevel.GridView.Clones[RowIndex].ViewData).RecordCount));
end;
end;

Автор: GRES
Дата сообщения: 19.09.2010 21:28
Возможно ли программно изменить цвет заголовка столбца по которому произведена фильтрация.
DevExpress v52/ cxGrid.
Автор: X11
Дата сообщения: 19.09.2010 21:39
С помощью события OnGetContentStyle можно попробовать.
Автор: afiget
Дата сообщения: 19.09.2010 21:52
GRES
Событие OnGetHeaderStyle.
if cxGrid1DBTableView1.Columns[I].Filtered then
// ваши действия по присвоению стиля для заголовка
end;

Только у вас будет приведение к нужному типу AItem и проверка свойства Filtered.
Автор: GRES
Дата сообщения: 19.09.2010 22:10
afiget
Спасибо. Вроде получается.
Только как сделать чтобы заголовок менялся
только у того столбца на котором висит фильтр

Автор: X11
Дата сообщения: 19.09.2010 22:59
Применять стиль только к тому заголовку
Автор: Prizzzrak777
Дата сообщения: 19.09.2010 23:23
Никто ничего не посоветует по установке фокуса на первую строку Detail уровня при переключении табов?
Автор: X11
Дата сообщения: 19.09.2010 23:35

Цитата:
Не могу поставить курсор на первую строку Detail уровня при переключении табов.

так?

Код:
procedure TForm1.cxGrid1ActiveTabChanged(Sender: TcxCustomGrid;
ALevel: TcxGridLevel);
begin
ALevel.GridView.DataController.GotoFirst;
end;
Автор: Prizzzrak777
Дата сообщения: 20.09.2010 07:50
X11 По приведенному коду он в Detail View даже не заходит. DevExpress V.50
Задача состоит в том что на одном Master уровне висит 3 Detail уровня которые переключаются по табам. При раскрытии фокус на первую строку ставил так:

Код:
procedure TfmMain.cxGrid1DBTableView1DataControllerDetailExpanded(
ADataController: TcxCustomDataController; ARecordIndex: Integer);
var ADDC:TcxCustomDataController;
begin
ADDC:= ADataController.GetDetailDataController
(ARecordIndex,ADataController.GetDetailActiveRelationIndex(ARecordIndex));
if ADDC.RecordCount<>0 then
TcxGridDataController(ADDC).GridView.ViewData.Records[0].Focused:=true
else
ADataController.FocusedRecordIndex:=ARecordIndex;

end;
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 10:19
Подскажите как в cxGrid (свойство NullString не подходит) или ClientDataSet выставить значение по умолчанию. DevExpress v48. Спасибо.
Автор: salexn1
Дата сообщения: 20.09.2010 10:25
Man_Without_Face
Для поля выставляешь свойство DefaultExpression
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 10:44
salexn1
А какое выражение? У меня строковое поле, если null нужен 0. Так не работает: '0'
Автор: Andryshok
Дата сообщения: 20.09.2010 10:52
Не знает ли кто - есть cxgrid, в нем мона менять ширину колонок и делать их видимыми-невидимыми, так вот патаюсь сохранять эти свойства в ini и грузить их от туда, почему то ничего не работает вот код

Код:
Чтение свойств из ini
procedure TForm6.FormCreate(Sender: TObject);
begin
cxGridDBTableView1.RestoreFromIniFile(ExtractFilePath(Application.ExeName) + 'viewconfig.ini',false,false,[gsoUseSummary],'SkladView');
cxGridDBTableView1.RestoreFromIniFile(ExtractFilePath(Application.ExeName) + 'viewconfig3.ini',false,false,[gsoUseSummary],'SkladView3');
form1.BuildTree(dxTreeView1);
end;
Сохранение свойст в ini
procedure TForm6.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
cxGridDBTableView1.StoreToIniFile(ExtractFilePath(Application.ExeName) + 'viewconfig.ini',true,[gsoUseSummary],'SkladView');
cxGridDBTableView2.StoreToIniFile(ExtractFilePath(Application.ExeName) + 'viewconfig3.ini',true,[gsoUseSummary],'SkladView3');
end;
Автор: X11
Дата сообщения: 20.09.2010 11:00
Должно всё работать. Ты убери всё лишнее: ',false,false,[gsoUseSummary],
Автор: salexn1
Дата сообщения: 20.09.2010 11:09
Man_Without_Face
Хм... Так он по умолчанию Null и ставит...
Автор: Andryshok
Дата сообщения: 20.09.2010 12:04

Цитата:
Ты убери всё лишнее: ',false,false,[gsoUseSummary],

а что тут лишнего - параметры ж надо передавать.... , кстати забыл сказать конфигурация моя сохраняется в ini, НО НЕ ВОССТАНАВЛИВАЕТСЯ из ini
Автор: fortezza
Дата сообщения: 20.09.2010 13:49
хочю редактировать выделенные ячейки с помощью tableview (свойство locate dataset слишком долго работает), но

Код: cxGridDBTableView.Controller.SelectedRecords[i].Values[cxGridDBTableView.Controller.FocusedColumn.Index] := 5;
Автор: X11
Дата сообщения: 20.09.2010 14:24

Цитата:
а что тут лишнего - параметры ж надо передавать....

передавай просто путь
сохраняем
dbgApart.StoreToIniFile(GetKvx2008UserDocsPath + 'Настройки\ExportApart.ini');

восстанавливаем
dbgApart.RestoreFromIniFile(GetKvx2008UserDocsPath + 'Настройки\ExportApart.ini');
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 14:46
Подскажите на какое событие в cxGrid можно проанализировать датасет и записать в грид другое значение? Что то вроде такого:

if cdsOX.FieldByName('discountPercent').asstring = '' then
cxGridOXDBTableView1DiscountPercent.editvalue := '0';

OnGetDataText у ячейки выдает ошибку.
Автор: Andryshok
Дата сообщения: 20.09.2010 15:01

Цитата:
передавай просто путь

У меня грид привязан к датасурсу, в не отображается таблица БД, сохранять и восстанавливать нужно только ширину и видимость колонок
Автор: salexn1
Дата сообщения: 20.09.2010 15:39
Man_Without_Face
Зачем на cxGrid, когда это нужно делать на DataSet: OnNewRecord, BeforeEdit и т.д., в заисимости от того когда нужно...
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 15:52

Цитата:
OnNewRecord

- пустые строки:
if cdsOX.FieldByName('discountSum').asstring = '' then
cdsOX.FieldByName('discountSum').asstring := '5';

Цитата:
BeforeEdit

- выдает ошибку: DataSet not in edit or insert mode.




Добавлено:
А если так: if cdsOX.FieldByName('price_byr').asstring = '' then
cxGridOXDBTableView1Price_byr.editvalue := '0';
то в одном случае переполнение стека, а в другом пустые строки.
Автор: salexn1
Дата сообщения: 20.09.2010 16:01
Man_Without_Face
и что?

Цитата:
if cdsOX.FieldByName('discountSum').asstring = '' then
cdsOX.FieldByName('discountSum').asstring := '5';


этот код не работает?


Цитата:
- выдает ошибку: DataSet not in edit or insert mode.

так переведите в edit...

В конце концов на BeforePost можно проверять
Автор: marser
Дата сообщения: 20.09.2010 16:25
Andryshok

Цитата:
сохранять и восстанавливать нужно только ширину и видимость колонок

Что вы мудрите? Сделайте по простому:
сохранить

Код: for I := 0 to TableView.ColumnCount - 1 do
begin
IniFile.WriteBool(Section, TableView.Columns[I].Name + '.Visible', TableView.Columns[I].Visible);
IniFile.WriteInteger(Section, TableView.Columns[I].Name + '.Width', TableView.Columns[I].Width);
end;
Автор: Andryshok
Дата сообщения: 20.09.2010 16:58

Цитата:
marser
Вот блин, свежая мысля , и то правда, СПС
Автор: Man_Without_Face
Дата сообщения: 20.09.2010 17:23
salexn1
Может я неправильно выразился, я отрываю датасет с данными, и поля где определенные записи пустые, нужно вставить ноль (типы полей - строковые).

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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