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

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

Автор: crazypiggy
Дата сообщения: 27.10.2011 09:11
Доброго дня. У меня такой вопрос. Есть cxGrid1DBTableView1 с данными. Мне нужно передать результат после фильтрации данных в другой cxGrid1DBTableView2. Эта вьюха без колонок, пустая. Думал сделать просто cxGrid1DBTableView1:=cxGrid1DBTableView2. Но на экране пусто. Делаю проверку cxGrid1DBTableView2.DatController.FilteredRecordCount показывает что есть записи. Что я делаю не так? Или так делать вообще нельзя? Просто мне нужно в одну вьюху передавать резултаты фильтрации разных по содержанию вьюшек
Автор: dimm78
Дата сообщения: 27.10.2011 09:26

Цитата:
Доброго дня. У меня такой вопрос. Есть cxGrid1DBTableView1 с данными. Мне нужно передать результат после фильтрации данных в другой cxGrid1DBTableView2. Эта вьюха без колонок, пустая. Думал сделать просто cxGrid1DBTableView1:=cxGrid1DBTableView2. Но на экране пусто. Делаю проверку cxGrid1DBTableView2.DatController.FilteredRecordCount показывает что есть записи. Что я делаю не так? Или так делать вообще нельзя? Просто мне нужно в одну вьюху передавать резултаты фильтрации разных по содержанию вьюшек


cxGrid1DBTableView1:=cxGrid1DBTableView2 - так точно нельзя))) Думаю стоит пробежаться по FilteredRecordCount в cxGrid1DBTableView2 и построчно добавить их в cxGrid1DBTableView1. А скопировать настройки грида cxGrid1DBTableView1.Assign(cxGrid1DBTableView2) - естественно перед добавлением записей.
Автор: mdid
Дата сообщения: 27.10.2011 15:08
подскажите плз..есть грид с группировкой..как получить все записи которые относятся к группировке?
то есть нажал усер на любую запись в данной группировке а получаем все
Автор: SergKhM
Дата сообщения: 27.10.2011 18:12
linker_2009


Цитата:
<TcxGridDBTableView>.DataController.Refresh;


Спасибо, работает.
Автор: linker_2009
Дата сообщения: 29.10.2011 02:46
crazypiggy
Есть такой вариант:
1. копируете данные в TdxMemData при помощи класса TcxGridToMemTable из uCxGridToMemTable.pas;
2. второму гриду цепляете этот TdxMemData.

uCxGridToMemTable.pas делал один из участников ветки, кто не помню(ему респект), искать не буду, привожу текст здесь.
[more=uCxGridToMemTable.pas]
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.
[/more]
upd Нашел, автор X11
Автор: X11
Дата сообщения: 29.10.2011 14:08
crazypiggy а ещё можно в тырнете почитать про клонирование объектов в Delphi.
Автор: X11
Дата сообщения: 30.10.2011 22:04
В процедуру передаётся ссылка на TcxGridDBTableView.
А как узнать cxGrid, которому принадлежит find этот cxGridDBTableView?
Find TcxGrid by TcxGridDBTableView.

Добавлено:
Нашёл <TcxGridDBTableView>.GetParentComponent
Автор: linker_2009
Дата сообщения: 30.10.2011 22:38
cxGrid1DBTableView1.Level.GetParentComponent
Автор: VadimLou
Дата сообщения: 31.10.2011 00:27
X11

function cxGrid_FromTableView(TableView: TcxCustomGridTableView): TcxGrid;
begin
if Assigned(TableView) and (TableView.Control is TcxGrid) then
Result := TcxGrid(TableView.Control)
else
Result := nil;
end;
Автор: xyebiz
Дата сообщения: 31.10.2011 11:50
Прошу помощи по компоненту cxDBCheckComboBox.
То, что его следует заполнят вручную - уже разобрался.

Проблема в другом. В общем, датасет возвращает sys_refcursor с полем из таблицы. Далее, на клиенте в компоненте создаю Items:

<cxDBCheckComboBox>.Properties.Items.AddCheckItem(<Query>.FieldByName('NAME').Value)

В итоге получаю комбобокс со списком, НО чекбоксы в нем находятся в режиме false (то есть без галочки). Мне нужно, чтобы весь список был отмечен и пользователь мог сам ставить/снимать галочки.

В какую сторону копать?
Автор: zdm77
Дата сообщения: 31.10.2011 13:08
Здравствуйте, помогите пожалуйста - cxDBPivotGrid, не могу править значения. Пробую обычный cxGrid, привязанный к тому-же DataSource - проблем нет (запрос сгенерирован в дизайн-тайме на апдейт, компонент UniDac, но думаю дело не в этом). Может какие свойства компонента надо подправить , ковырял, ковырял так и не получилось. Если необходимы дополнительные сведения, приведу, без проблем, а может и сходу подскажите. Спасибо.
Автор: IronMan182
Дата сообщения: 31.10.2011 13:17
Здоровеньки

В RUN TIME установка Имени Скина приводит вобще к сбросу Скина (прости меня русский язык)
dxSkinController1.SkinName:='Coffe';
Автор: linker_2009
Дата сообщения: 31.10.2011 17:22
xyebiz
В зависимости от того что стойт в <TcxDBCheckComboBox>.Properties.EditValueFormat нужно вставить значение в <TcxDBCheckComboBox>.EditValue;
Например для cvfInteger и для двух добавленых полей нужно выставить 3;
IronMan182
Скина с названием "Coffe" нет, есть "Coffee".
Автор: IronMan182
Дата сообщения: 31.10.2011 18:27
linker_2009
Ох якорь мне в жоппу !! А ведь точно !!!!
Автор: xyebiz
Дата сообщения: 01.11.2011 09:35
Будьте добры, подскажите, каким образом можно удалить конкретный критерий в фильтре грида?

Предположим, установлено множество критериев (NUMBER <> 1) И (NUMBER <> 2) И (NUMBER <> 3) ...

И нужно программно удалить второй критерий. Как это проще всего сделать?

Спасибо.
Автор: marser
Дата сообщения: 01.11.2011 10:18
xyebiz
cxGrid1TableView1.DataController.Filter.Root.Items[1].Free;
Автор: brookson
Дата сообщения: 01.11.2011 11:08
Всем доброго времени суток!

Подскажите, как в cxScheduler выделить интервал времени, ресурс которого берётся из комбо-бокса?
Я хочу использовать cxScheduler1.SelectTime, но последний параметр не знаю, какой указать. Просто указать cxLookupCombobox.EditValue не могу, т.к. там тип Variant, а нужен 'TcxSchedulerStorageResourceItem'

Ресурс cxScheduler и cxLookupCombobox.ListSource ссылаются на один и тот же датасет.
Автор: xyebiz
Дата сообщения: 01.11.2011 11:48

Цитата:
cxGrid1TableView1.DataController.Filter.Root.Items[1].Free;


Да, в этом я разобрался. Но мне, прежде чем обратиться к item по индексу, нужно знать этот индекс, т.к. порядок критериев в списке заведомо неизвестен.

Требуется перед установкой критерия пробегаться по списку Items и проверять, если ли уже такой. Если есть, то удалять его, если нет, то добавить.
Но как это проверять - вот это вопрос.
Автор: marser
Дата сообщения: 01.11.2011 12:07
xyebiz
for I := 0 to cxGrid1TableView1.DataController.Filter.Root.Count - 1 do
if TcxFilterCriteriaItem(cxGrid1TableView1.DataController.Filter.Root.Items[I]).??? = ??? then
У TcxFilterCriteriaItem(cxGrid1TableView1.DataController.Filter.Root.Items[I]) есть свойства
DisplayValue, ItemLink(Колонка), OperatorKind и т.д.

Добавлено:
xyebiz
Имейте ввиду, что Items[I] может быть как TcxFilterCriteriaItem, так и TcxFilterCriteriaItemList
Автор: xyebiz
Дата сообщения: 01.11.2011 13:02
marser, большое спасибо!
Автор: maxz
Дата сообщения: 01.11.2011 15:48
проблемы с cxDateEdit в XE2, devex 11.1.6
AV и кривой какой-то
вот так выглядит :

в ХЕ всё нормально

это у меня что-то съехало или где ?
может кто сталкивался ?
Автор: brookson
Дата сообщения: 02.11.2011 11:15
Может кто-то хотя бы просто пользовался функцией SelectTime ?
Автор: VadimLou
Дата сообщения: 04.11.2011 06:34
maxz

Покажи лучше стек. Из него легче будет понять причину ...
Автор: AlexCoRu
Дата сообщения: 04.11.2011 08:14
maxz, http://forum.ru-board.com/topic.cgi?forum=33&topic=10884&start=3100#17
Кстати, так же выглядит и калькулятор. И куча проблем с записями содержащими русские буквы в гридах.
Но, вроде, скоро увидим 1.7. В копилке уже появились хелпы и демы.
Автор: PowerChute
Дата сообщения: 05.11.2011 13:03
Знатоки DevExpress подскажите:
При печати задаю кол-во копий - но всё равно выходит только одна (FinePrint). Где копать?
Автор: Corsairs
Дата сообщения: 05.11.2011 13:56
А пробовали вывод на печать на другой принтер? (не на FinePrint) Может причина именно в FinePrint?
Автор: PowerChute
Дата сообщения: 05.11.2011 14:53
Corsairs
Пробовал. На реальный принтер работает. Но FastReport, EhLib и т.д. работает нормально и на виртуалку (FinePrint). Значит проблема в девках. или я не прав?
Автор: Corsairs
Дата сообщения: 05.11.2011 15:47
Странная картина...
Только что проверил (Delphi 7, Developer Express 57, FinePrint 6.25) - запустил на печать через FinePrint 5 страниц... Вышли все 5... (правда, запускал из дизайнера)
Я не являюсь знатоком DevExpress, так что более конкретный совет дать не могу... Может, проблема в используемой версии?
Автор: apnss
Дата сообщения: 08.11.2011 10:31
Привет всем

В есть простенький проект по загрузке платежек. В качестве ДБ юзается sqlmemtable (http://aidaim.com/products/delphi.php#sqlmemtable). На версии 4.5 все работало как часы но после обновления начались бока: на sqlmemtable5 cxGrid напрочь отказывается показывать лукап-поля причем если установить фокус на лукап поле содержимое показывается правильно. Помогает также перевод грида в GridMode но это "неайс" т.к. нужно заботиться о пересчете футера и фильтрации по значениям в колонках

в хистори новой версии sqlmemtable есть это:
- New memory table SQL engine from Accuracer v.6 - 100% Unicode, more fast and powerful.
позможно проблема из-за этих изменений. но почему обычный грид работает ?

не подскажете в чес может быть дело?

если к датасорсу подключить обычный дбгрид он показывает все нормально. вот для примера 2грида (обычный и cx) смотрящие на один сорс







Автор: AlexCoRu
Дата сообщения: 08.11.2011 10:57
apnss, версии студии и дев?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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