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

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

Автор: jicoff
Дата сообщения: 09.08.2006 17:02
afiget


Цитата:
Вот аналог из FAQ:

Как уже писал, ты НЕ внимательно смотрел тот пример, на который указал ссылку. Мои высказывания совпадают с этим примером.
Автор: afiget
Дата сообщения: 09.08.2006 18:13
jicoff

Цитата:
Как уже писал, ты НЕ внимательно смотрел тот пример, на который указал ссылку. Мои высказывания совпадают с этим примером.

А со справкой?
TcxPopupEdit = class(TcxCustomPopupEdit);
To open or close the popup window you can use the DroppedDown property. Set it to True to activate the popup window. At runtime, a user can activate the popup by clicking the dropdown button, or by pressing the Up Arrow and Down Arrow keys combined with the Alt key, or by pressing the F4 key.

Кстати, а причем здесь TcxCustomEditProperties (см. свои посты выше)? К самому контролу, которому нужно дать команду popup?

ЗЫ
Неужели нужно явно приводить ответ на вопрос, аналогия не годится?
Автор: jicoff
Дата сообщения: 09.08.2006 18:24
afiget

Вот сообщение, с которого началась дискуссия:

Цитата:
Прошу прощения, если уже было. Вопрос: Properties колонки таблицы установлено в PopupEdit. Как можно его (PopupEdit) программно развернуть или, наоборот, свернуть? Спасибо.


Речь шла о свойстве Properties колонки, а не об отдельно стоящем на форме контроле TcxPopupEdit.

И вот, что ты написал:

Цитата:
Или вот так:
TcxComboBox(ИмяКолонкиВГриде.Properties).DroppedDown:=True;


Сделал явное преобразование Properties, что является наследником класса TcxCustomEditProperties, к TcxComboBox, который наследник TcxCustomPopupEdit. Это все равно, что объект типа TGraphic, преобразовать к объекту типа TWinControl. Вот тебе и "ЗЫ".
Автор: avkh
Дата сообщения: 09.08.2006 18:58
Очень хочется к TcxTabSheet прицеплять тулбар из TdxBarManager.
Без каких-то доп.контейнеров тулбар к ТабШиту не цепляется, а как можно сделать?
(оптимально в дизайнтайме, но не обязательно)
Автор: afiget
Дата сообщения: 09.08.2006 23:33

Цитата:
Сделал явное преобразование Properties, что является наследником класса TcxCustomEditProperties, к TcxComboBox, который наследник TcxCustomPopupEdit. Это все равно, что объект типа TGraphic, преобразовать к объекту типа TWinControl

Да, согласен, недосмотрел.

Что касается отдельно стоящего контрола, так он как раз и цепляется к соответсвующему (PopControl) свойству Properties (можно в designtime, runtime). Вот это то меня и сбило.
Автор: Alex1978
Дата сообщения: 10.08.2006 11:51
Как сделать чтобы при открытии формы с гридом первой записью была текущая запись таблицы?
Автор: golkanavt
Дата сообщения: 10.08.2006 12:31
Alex1978
что имеется ввиду под "текущей записью таблицы"?
Автор: Alex1978
Дата сообщения: 10.08.2006 12:55
golkanavt
Открываем форму с гридом и выбираем необходимую запись (300 сверху).
Закрываем форму, и не закрываем таблицу.

Открываем форму с гридом. В гриде выбрана нужная запись, но она расположена в самом конце. Как ее показать первой?

Добавлено:
Еще вопрос.

Работаю связкой FIBPlus 6.41 + DevExpress (последние). Firebird 2.0

Добавляю запись в таблицу (простая таблица без связей).
Все SQLs - стандартные.

Table.Options - [poTrimCharFields,poRefreshAfterPost,poStartTransaction,poAutoFormatFields,poProtectedEdit,poKeepSorting,poFetchAll]

Table.PrepareOptions - [pfImportDefaultValues,psUseBooleanField,psGetOrderInfo,psSetEmptyStrToNull]

Добавляю через Insert.
Делаю Post.

После поста текущей в гриде становиться последняя запись, а должна быть добавленная и в нужном месте (poKeepSorting).
Раньше такого не наблюдалось.

На форуме плюсов ответили - дело в настройках грида.
Может кто сталкивался с подобным? С делфовым гридом работает нормально.

Как полечить? А то приходиться делать что-то вроде:

procedure TBanksEditForm.btnOkClick(Sender: TObject);
var
ID: Integer;
begin
with MainDM do
begin
ID := tbBanksBN_ID.AsInteger;
tbBanks.Post;
tbBanks.Locate('BN_ID',ID,[]);
end;
ModalResult := mrOk;
end;
Автор: jicoff
Дата сообщения: 10.08.2006 13:14
Alex1978


Цитата:
Как ее показать первой?


GridView->Controller->TopRecordIndex
Автор: Alex1978
Дата сообщения: 10.08.2006 13:40
jicoff
Спасибо. Зделал так, работает

procedure TBanksForm.FormShow(Sender: TObject);
var
ARowIndex: Integer;
begin
with tbvBanks do
begin
ARowIndex := DataController.GetSelectedRowIndex(0);
Controller.TopRecordIndex := ARowIndex;
end;
end;

Поправь если что не так.
Автор: jicoff
Дата сообщения: 10.08.2006 13:58
Alex1978

Если все работает, значит все так.
Автор: JackOff
Дата сообщения: 12.08.2006 18:14
Господа кто использовал PivotGrid!? Какие впечатления? В чем разница по сравнению с КвантумГридом?
Автор: hobest
Дата сообщения: 12.08.2006 19:43
JackOff

Пробовал создавать тестовые проекты. Это совсем разные вещи. Можешь посмотреть картинки на их сайте, визуально все понятно. Пивот грид используется для статистической обработки информации. Позволяет группировать и суммировать данные, а также показывать из чего эти суммы получаются. Причем строки превращает в столбцы. Рассмотрим один из примеров с сайта.

Есть данные о продажах автомобилей разных фирм изготовителей, разных марок за некоторый период времени. Простая выборка: Год, Фирма, Марка автомобиля, Сумма продаж.

Как их покажет простой грид понятно. Если использовать ПивотГрид, то можно сгруппировать следующим образом:

- в строках располагаются Даты, т.е.

2003
2004
2005
2006

- в столбцах - Фирма, Марка автомобиля, а на пересечении Суммы продаж.

Фирма 1 Фирма2

Марка 1.1 Марка 1.2 Марка 2.1 Марка 2.2 Марка 2.3
2003
2004
2005
2006

ПивотГрид позволяет сворачивать информацию, и тогда можно увидеть общую статистику продаж по Фирме за Год. Если добавить еще поле Модель автомобиля, то можно получить статистику:

- общую по Фирме
- если раскрыть (нажать на +) - по Марке
- если еще раскрыть - по каждой Модели

Группировать данные позволяет как с столбцах, так и в строках, если к Годам добавить еще Завод изготовитель. ну и т.д. Вот в общих чертах.


Автор: xokc
Дата сообщения: 13.08.2006 10:26
JackOff
Кстати, типичный пример PivotGrid - турнирная таблица со списком игр чемпионата по какому-нибудь виду спорта.
Автор: VadimLou
Дата сообщения: 13.08.2006 13:21
Нужно получитать и восстанавливать позицию cxScrollBar-ов в TcxDBTreeList. Никому не доводилосю копаться в ентом ?
Автор: uranic2
Дата сообщения: 14.08.2006 08:21

Цитата:
Кстати, типичный пример PivotGrid - турнирная таблица со списком игр чемпионата по какому-нибудь виду спорта


Вовсе это не типичный пример. В турнирной таблице я чего-то не представляю что-там можно сворочивать, суммировать и т.п.

Типичный пример приведен в примере.
Никто не встречал упоминания о том можно ли подружить DevExp PivotGrid с MS SQL OLAP Service? Я имею ввиду, чтобы Pivot Grid автоматически подхавтывал кубы рассчитанные на MSSQL. Раньше пользовался для этих целей ActiveX PivotTable из MS Office Web Component, но с удовольстивием от него бы избавился.
Автор: jicoff
Дата сообщения: 14.08.2006 11:17
uranic2

Турнирная таблица вырожденный случай, если здесь уместно это понятие.

Слышал в MSSQL есть специальные средства для рассчета кубов, но мы сами создавали процедуру, в которой подгоняли выборку под ПивотГрид. Возможно могли бы использовать стандартные средства, но пока не знакомы с ними.

Автор: uranic2
Дата сообщения: 14.08.2006 11:56
jicoff

Цитата:
Слышал в MSSQL есть специальные средства для рассчета кубов


Вся прелесть в том, что на ОГРОМНЫХ объемах данных можно заранее просчитать куб с большими выисчлениями (средниее, и пр.) а потом на клиенте, например с помошью Access (в котором поддрежка PivotTable встроена) крутить вертеть эти данные. Можно также и Excel заиспользовать.

Ну это так, к слову...

Автор: vadson6666
Дата сообщения: 14.08.2006 12:56

Цитата:
Слышал в MSSQL есть специальные средства для рассчета кубов, но мы сами создавали процедуру, в которой подгоняли выборку под ПивотГрид. Возможно могли бы использовать стандартные средства, но пока не знакомы с ними.



хттп:\www.olap.ru Там все популярно описано, в том числе чем отличается Молап от Ролап'а. Вкратце, смысл такой: Ставишь сервак Олаповский и с ним работаешь через Игсель-это Молап в этом серваке лежат уже подсчитанные данные, а пивот гриды разные-это Ролап, когда все вычисления на клиенте происходят. Применительно к Делфе есть компонент Хиер куб от Радар-софт-это Ролап, но вскоре у них выйдет Молаповская версия, которая непосредственно взаимодействует с Олап серваком, как Иксель, можешь качнуть у них демку и глянуть.
Автор: VadimLou
Дата сообщения: 14.08.2006 17:57

Цитата:
Нужно получитать и восстанавливать позицию cxScrollBar-ов в TcxDBTreeList. Никому не доводилосю копаться в ентом ?


ну и спрятали ... партизаны:

function GetCXScrollPosition(AcxDBTreeList: TcxDBTreeList; Kind: TScrollBarKind): Integer; overload;
function SetCXScrollPosition(AcxDBTreeList: TcxDBTreeList; Kind: TScrollBarKind; Position: Integer): Boolean; overload;

[more]

uses
...
//
// cx scrollbar
//
cxControls, cxDBTL;

type
TcxDBTreeListPro = class(TcxDBTreeList)
public
property Controller;
end;

TcxControlScrollBarPro = class(TcxControlScrollBar)
end;

function GetCXScrollBar(AControl: TWinControl; Kind: TScrollBarKind): TcxControlScrollBar; overload;
var
i: Integer;
vControl: TControl;
begin
for i := 0 to AControl.ControlCount - 1 do
begin
vControl := AControl.Controls[i];
if vControl.ClassType = TcxControlScrollBar then
begin
Result := TcxControlScrollBar(vControl);
if Result.Visible and (Result.Kind = Kind) then
Exit;
end;
end;
Result := nil;
end;

function GetCXScrollBar(AcxDBTreeList: TcxDBTreeList; Kind: TScrollBarKind): TcxControlScrollBar; overload;
var
vControl: TWinControl;
begin
vControl := TcxDBTreeListPro(AcxDBTreeList).Controller.TreeList;
Result := GetCXScrollBar(vControl, Kind);
end;

function GetCXScrollPosition(AControl: TWinControl; Kind: TScrollBarKind): Integer; overload;
var
vScrollBar: TcxControlScrollBar;
begin
vScrollBar := GetCXScrollBar(AControl, Kind);
if vScrollBar <> nil then
Result := vScrollBar.Position
else
Result := -1;
end;

function GetCXScrollPosition(AcxDBTreeList: TcxDBTreeList; Kind: TScrollBarKind): Integer; overload;
var
vControl: TWinControl;
begin
vControl := TcxDBTreeListPro(AcxDBTreeList).Controller.TreeList;
Result := GetCXScrollPosition(vControl, Kind);
end;

function SetCXScrollPosition(AControl: TWinControl; Kind: TScrollBarKind; Position: Integer): Boolean; overload;
var
vScrollBar: TcxControlScrollBar;
// 2:
//vScrollPos: Integer;
begin
Result := Position >= 0;
if not Result then
Exit;
vScrollBar := GetCXScrollBar(AControl, Kind);
Result := vScrollBar <> nil;
if Result then
begin
// 1:
//
// by TcxControlScrollBar.InternalScroll(scPosition):
//
// vScrollBar.Position := Position;
// vScrollBar.Perform(CN_VSCROLL, Integer(scPosition), Position); //scPosition == SB_THUMBPOSITION
// - vScrollBar.Perform(WM_VSCROLL, SB_THUMBPOSITION, Position);// - bad variant
// ---
// 2:
//vScrollPos := Position;
TcxControlScrollBarPro(vScrollBar).Scroll(scPosition, Position);
//Result := Position = vScrollPos;
end;
end;

function SetCXScrollPosition(AcxDBTreeList: TcxDBTreeList; Kind: TScrollBarKind; Position: Integer): Boolean; overload;
// 1:
//var
// vControl: TWinControl;
begin
Result := Position >= 0;
if not Result then
Exit;
// 1:
//vControl := TcxDBTreeListPro(AcxDBTreeList).Controller.TreeList;
//Result := SetCXScrollPosition(vControl, Kind, Position);
// ---
// 2:
Result := (AcxDBTreeList <> nil);
if Result then
TcxDBTreeListPro(AcxDBTreeList).Scroll(Kind, scPosition, Position);
end;
[/more]
Автор: jicoff
Дата сообщения: 14.08.2006 18:22
uranic2

А что значит вертеть на клиенте, тем более на Access? Ну еще в Excel можно себе представить, если там так же как и в примере hobest. А потом, если данные просчитаны, то, как мне представляется, их можно только переставлять между столбцами и строками. В том же ПивотГриде, есть такое понятие как ДриллДоун, т.е кликаешь на ячейку и он тебе показывает в линейном виде все исходные данные для этой ячейки.
Автор: VadimLou
Дата сообщения: 14.08.2006 18:30
Мож кому нить пригодится для cxGrid-а:
Обновление cxGrid-а с восстановлением позиции с учётом группировок. В случае группировок и невозможности восстановить позицию (текущая запись отсутствует или отфильтрована) восстановление делается к первой записи в группе.
[more=Код]
unit uDevExUtils;

interface

uses
Windows, Messages, SysUtils, Classes, Db,
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF CompilerVersion >= 14.01} // Delphi 6 Up
Variants,
{$IFEND}
{$ENDIF}
Controls, StdCtrls, Forms,
//
// cx grid
//
cxGridTableView, cxGridCustomTableView, cxGridDBTableView;

{ Обновление TcxGridDBTableView }
function Refresh_cxGridDBTableView(
cxGrid_DBTableView: TcxGridDBTableView;
RestorePosition: Boolean = True; { True - Восстанавливать позицию }
ReopenDataSource: Boolean = True { False - Использовать DataController; True - Использовать Open/Close метод TDataSet}
): Boolean;

{ Обновление TcxGridDBTableView с возвратом расширенной информации }
function Refresh_cxGridDBTableViewEx(
cxGrid_DBTableView: TcxGridDBTableView;
out RestoredPosition: Integer; { 0 - Позиция не восстановилась }
{ 1 - Позиция точно восстановилась }
{ -1 - Позиция приблизительно восстановилась (Восстановлена первая запись в группе) }
RestorePosition: Boolean = True; { True - Восстанавливать позицию }
ReopenDataSource: Boolean = True { Fale - Использовать DataController; True - Использовать Open/Close метод TDataSet}
): Boolean;

implementation


function Refresh_cxGridDBTableViewEx(cxGrid_DBTableView: TcxGridDBTableView; out RestoredPosition: Integer;
RestorePosition: Boolean = True; ReopenDataSource: Boolean = True): Boolean;
var
vDataSet: TDataSet;
i, iCount: Integer;
bIsGrouping, IsEndFullUpdate, IsEmpty, IsCollapsedGroup: Boolean;
vKeyValues, vLocateValues, vFieldValueCurrent: Variant;
sFields: string;
sKeyFieldNames: string;
cxDbColumn: TcxGridDBColumn;
vRecord: TcxCustomGridRecord;
// ---
procedure LDoDefresh();
begin
if not ReopenDataSource then
begin
cxGrid_DBTableView.DataController.RefreshExternalData();
end
else
begin
vDataSet.Close;
vDataSet.Open;
end;
Result := True;
end;
// ---
begin
RestoredPosition := 0;
Result := False;
if cxGrid_DBTableView = nil then
Exit;
if (cxGrid_DBTableView.DataController.DataSource <> nil)
and (cxGrid_DBTableView.DataController.DataSource.DataSet <> nil) then
vDataSet := cxGrid_DBTableView.DataController.DataSource.DataSet
else
vDataSet := nil;
if vDataSet = nil then
Exit;

if not RestorePosition then
begin
LDoDefresh();
Exit;
end;

sFields := '';
// ---
IsCollapsedGroup := False;
IsEmpty := vDataSet.IsEmpty;
// ---
iCount := cxGrid_DBTableView.GroupedColumnCount;
if (iCount > 0) then
begin
bIsGrouping := not IsEmpty;
if bIsGrouping and (cxGrid_DBTableView.Controller.FocusedRow <> nil) then
begin
if cxGrid_DBTableView.Controller.FocusedRow.Expandable then
IsCollapsedGroup := not cxGrid_DBTableView.Controller.FocusedRow.Expanded;
if iCount = 1 then
begin
for i := 0 to cxGrid_DBTableView.GroupedColumnCount - 1 do
begin
cxDbColumn := cxGrid_DBTableView.GroupedColumns[i] as TcxGridDBColumn;
sFields := cxDbColumn.DataBinding.FieldName;
vLocateValues := cxGrid_DBTableView.Controller.FocusedRow.Values[cxDbColumn.Index];
end;
end
else
begin
vLocateValues := VarArrayCreate([0, iCount-1], varVariant);
iCount := 0;
for i := 0 to cxGrid_DBTableView.GroupedColumnCount - 1 do
begin
cxDbColumn := cxGrid_DBTableView.GroupedColumns[i] as TcxGridDBColumn;
sFields := sFields + cxDbColumn.DataBinding.FieldName + ';';
vFieldValueCurrent := cxGrid_DBTableView.Controller.FocusedRow.Values[cxDbColumn.Index];
vLocateValues[iCount] := vFieldValueCurrent;
Inc(iCount);
end;
SetLength(sFields, Length(sFields) - 1);
end;
end;
end
else
begin
bIsGrouping := False;
end;
// ---
IsEndFullUpdate := False;
cxGrid_DBTableView.DataController.BeginFullUpdate();
try
if not IsEmpty then
vKeyValues := cxGrid_DBTableView.DataController.GetKeyFieldsValues
else
vKeyValues := Unassigned;

LDoDefresh();

cxGrid_DBTableView.ViewData.Collapse(True);

cxGrid_DBTableView.DataController.EndFullUpdate();
IsEndFullUpdate := True;

if not ( VarIsEmpty(vKeyValues) or VarIsNull(vKeyValues) ) then
try
if cxGrid_DBTableView.DataController.LocateByKey(vKeyValues) then
RestoredPosition := 1;
if RestoredPosition = 0 then
begin
if bIsGrouping and (sFields <> '') then
begin
try
sKeyFieldNames := cxGrid_DBTableView.DataController.KeyFieldNames;
try
cxGrid_DBTableView.DataController.KeyFieldNames := sFields;
if cxGrid_DBTableView.DataController.LocateByKey(vLocateValues) then
RestoredPosition := -1;
finally
cxGrid_DBTableView.DataController.KeyFieldNames := sKeyFieldNames;
end;
except
on e: Exception do
begin
//Application.HandleException(e); {<-: debug}
if vDataSet.Locate(sFields, vLocateValues, []) then
begin
RestoredPosition := -1;
vKeyValues := cxGrid_DBTableView.DataController.GetKeyFieldsValues;
cxGrid_DBTableView.DataController.LocateByKey(vKeyValues);
end;
end;
end;
end;
end;

if (RestoredPosition <> 0) then
begin
vRecord := cxGrid_DBTableView.Controller.FocusedRow;
if vRecord <> nil then
begin
if IsCollapsedGroup then
vRecord.ParentRecord.Collapse(False);
vRecord.MakeVisible();
end;
end;

except
end;
finally
if not IsEndFullUpdate then
cxGrid_DBTableView.DataController.EndFullUpdate();
end;
end;

function Refresh_cxGridDBTableView(cxGrid_DBTableView: TcxGridDBTableView;
RestorePosition: Boolean = True; ReopenDataSource: Boolean = True): Boolean;
var
RestoredPosition: Integer;
begin
Result := Refresh_cxGridDBTableViewEx(cxGrid_DBTableView, RestoredPosition,
RestorePosition, ReopenDataSource);
end;

end.
[/more]
Автор: waik
Дата сообщения: 14.08.2006 21:56
VadimLou

Спасибо. Очень нужные моменты осветил.
Автор: SuperBtr
Дата сообщения: 15.08.2006 10:11
Доброе время суток.
Может кто-нибудь прояснит ситуацию с ParentID в cxSheduler, зачем он там используеться, я так понимаю древовидные задачи он отображать не может, для чего это свойство преназначено?

И можно ли как нибудь заставить cxSheduler в разрезе дня показывать задачи продолжительность которых более 2-3 дней? А то в таком случае он показывает пустой календарь.
Автор: jicoff
Дата сообщения: 15.08.2006 17:20
Никто не пробовал реализовывать на основе TcxButton безфокусную кнопку, например, как TSpeedButton?
Автор: Widoms
Дата сообщения: 16.08.2006 11:30
Какая то беда приключилась с последними Девками.
Есть проект на Delphi 6 + MSSQL 2000
При добавлении значений в СxGrid в поля DateTime, валится ошибка
Overflow while converting variant of type (Integer)into type (Date)

В чем может быть дело ?
Автор: vadson6666
Дата сообщения: 16.08.2006 11:52
Widoms

Этот вопрос уже неоднократно жевали, нр: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=2214&start=1180
Автор: svs123456789
Дата сообщения: 16.08.2006 12:13
подскажите компонент доступа к БД (желательно основанный на TWebBrowser),
который бы позволял показывать (и желательно редактировать ) пользователю документы практически любого типа (Officе, JPEG , и т.п.)
хранящиеся в виде BLOB (и добавлять-удалять их)
Автор: jicoff
Дата сообщения: 16.08.2006 14:28
svs123456789

Какое-то желание огромное - "хочу, чтобы компонент делал все". Вот только DevExpress тебе вряд ли поможет.
Автор: svs123456789
Дата сообщения: 16.08.2006 14:42
jicoff
практически все (за исключением доступа к полю БД) из указанного в вопросе умеет делать компонент из стандартной поставки delphi - попробуй поставить себе delphi и посмотреть на палитру компонентов
следовательно я мог надеятся что DevExpress немного расширили функционал стандартных компонентов !
и мне не понятно зачем ты написал свое сообщение если не знаешь ответа ?!

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Kylix


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