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

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

Автор: Petrenuk
Дата сообщения: 21.06.2010 11:45
Спасибо за ответ про Bitmap, я бы и сам разобрался, но документация к гридам кривовато сделана...


Цитата:
а надо ли так часто обновлять? сколько раз в секунду ты обновляешь грид?


Таблицу я обновляю 30 раз в секунду, точнее не таблицу, а одну или несколько ячеек. Обновляется она при приходе сообщения от сервера (реализация не имеет значения), потому что в этих ячейках может находиться время (в фреймах от начала проигрывания видео-файла). Сделать это необходимо, нужно заказчику. Короче, в чем задача, как сделать так, чтобы обновлялось только одно поле, а вся остальная таблица вообще не была задействована.



Добавлено:

Цитата:
у колонки свойство Properties ставишт в Image.


А как поставить Image? мне это нужно сделать обязательно из кода.
Не катит ни

Код: Col.Properties := Image;
Автор: linker_2009
Дата сообщения: 21.06.2010 20:59
[b]Petrenuk[/b]
Col.PropertiesClass:=tcximageproperties;

Автор: mmi
Дата сообщения: 22.06.2010 08:17
Petrenuk

30 раз в секунду не многовато ли? Про 25-ый кадр слышали?

Вот попробовал сделать пример, подрагивания не увидел.
Delphi 6, Grid 5.11, используется еще TdxMemData - 1.8.9
[more]
Unit1.pas

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData,
cxDataStorage, cxEdit, DB, cxDBData, ExtCtrls, cxGridCustomTableView,
cxGridTableView, cxGridDBTableView, cxGridLevel, cxClasses, cxControls,
cxGridCustomView, cxGrid, dxmdaset, StdCtrls;

type
TForm1 = class(TForm)
mdMain: TdxMemData;
mdMainI1: TIntegerField;
mdMainI2: TIntegerField;
mdMainI3: TIntegerField;
mdMainI4: TIntegerField;
dscMain: TDataSource;
cxGrid1DBTableView1: TcxGridDBTableView;
cxGrid1Level1: TcxGridLevel;
cxGrid1: TcxGrid;
cxGrid1DBTableView1RecId: TcxGridDBColumn;
cxGrid1DBTableView1I1: TcxGridDBColumn;
cxGrid1DBTableView1I2: TcxGridDBColumn;
cxGrid1DBTableView1I3: TcxGridDBColumn;
cxGrid1DBTableView1I4: TcxGridDBColumn;
Timer1: TTimer;
Button1: TButton;
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
begin
for i := 0 to 2 do
with mdMain do
begin
RecNo := Random(RecordCount + 1);
Edit;
mdMainI1.AsInteger := Random(1000);
mdMainI2.AsInteger := Random(1000);
mdMainI3.AsInteger := Random(1000);
mdMainI4.AsInteger := Random(1000);
Post;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with Timer1 do
Enabled := not Enabled;
end;

initialization
Randomize;
end.
Автор: linker_2009
Дата сообщения: 22.06.2010 09:41
[b]Petrenuk[/b]

Давай свою форму и pas файл.
Тоже сварганил тест(delphi2009 + 49девки), что со скином что без все четко.
Автор: Petrenuk
Дата сообщения: 22.06.2010 12:00

Цитата:
Col.PropertiesClass:=tcximageproperties;
linker_2009, спасибо большое.

Проблему с "мерцанием" решил, с помощью чтения вопросов к техподдержке DevExpress, если кому-то пригодится:


Код: TableView.ViewData.Site.DoubleBuffered := True;
Автор: fortezza
Дата сообщения: 24.06.2010 13:05
есть cxGrid, у него 2 уровня. главный и дочерний с вьювами и подключаемыми к ним сорсами, связи настроены. отображается все правильно.
хочу сделать кнопку с универсальным обновлением, код такой:


Код:
for dsInd := 0 to VetArrivalForm.ComponentCount - 1 do
if (VetArrivalForm.Components[dsInd] is TcxGrid) then
with (VetArrivalForm.Components[dsInd] as TcxGrid) do
if CanFocusEx then
for i := 0 to ViewCount - 1 do
if (Views[i] is TcxGridDBTableView) then
with TcxGridDBTableView(Views[i]).DataController do
if DataSource <> nil then if DataSource.DataSet.Active then
DataSource.DataSet.Refresh;
Автор: TechnoDreamer
Дата сообщения: 24.06.2010 13:34
А как народ реализует добавление новых строчек в cxGrid? (TableView, BoundMode). Строчка "Click here to add new record" вверху таблицы выглядит стильно, и с мышкой довольно удобно. Но вот последовальное добавление большого количества записей не очень удобно (мягко говоря). Нельзя эту строку каким то образом отправить вниз таблицы? Было бы удобно переходить с последнего ряда на нее и заполнять столбцы с клавы.
Автор: X11
Дата сообщения: 24.06.2010 13:48
Используй клавишу Insert или нажатие клавиши Вниз в конце таблицы. И посмотри набор свойств OptionsData у грида.
Автор: TechnoDreamer
Дата сообщения: 24.06.2010 18:12
про Insert знаю, но происходит перекидывание на верхнюю строку, вводим все поля. Дальше как? Нажатие Enter на последнем поле (столбце)., ничего не дает, нажатие стрелку вниз добавляет запись, но переходит на первую строку в грид. В OptionsData всё включено.
При нажатии стрелки вниз на последней строке ничего не происходит. Может какое свойство отвечает?
В принципе, могу конечно вручную сделать, что бы после добавления новой записи перекидывало вниз, но будет прикольно, если потом окажется, что это достигается устновкой пары свойств. Уже сколько раз делал велосипед, что бы потом обломаться...
Автор: X11
Дата сообщения: 25.06.2010 08:39

Цитата:
про Insert знаю, но происходит перекидывание на верхнюю строку

Так отключи её


Цитата:
В OptionsData всё включено.


Цитата:
При нажатии стрелки вниз на последней строке ничего не происходит.

Если Append включен в гриде и в наборе данных (в датасете), то должна вниз добавляться пустая строка.

На крайний случай сделай пример с использованием dxMemData, желательно для неюникодной версии Delphi.
Автор: X11
Дата сообщения: 25.06.2010 13:45
Не у кого не появился случайно более полный ini файл с переводом? А то часть принтосистемы на буржуйском. Я бы и сам не прочь перевести, но не знаю списка констант. Исп. Dev48.
Автор: marser
Дата сообщения: 25.06.2010 14:22
X11

Цитата:
Я бы и сам не прочь перевести, но не знаю списка констант

Так их несложно найти. В RAD Studio: Search -> Find in Files; Text to find: dxResourceStringsRepository; Search in directories (True), File mask: *.pas; Directories: C:\Program Files\Developer Express Inc; Include subdirectories (True). Получите список файлов. Константы находятся в начале файла, после ключевого слова: resourcestring.
Автор: MagistrAnatol
Дата сообщения: 25.06.2010 16:16
Народ, немного глупий вопрос- как поменять скин для рибона?
в dxBarManager меняю скин а на рибоне никаких изминений

Добавлено:
я имею ввиду поменять в дизайнере в design time

Добавлено:
со скинами разобрался, а вот как сделать кнопку как 2010 ворде вставить - тоесть кнопка как бы двух частей - сверху сама кнопка и подменю?

Добавлено:
пытаюсь сгруппировать ларже буттон и под-елемент - сгуппируются токо по горизонту, а мне надо по вертикали
Автор: linker_2009
Дата сообщения: 25.06.2010 20:26
MagistrAnatol

Цитата:
вот как сделать кнопку как 2010 ворде вставить - тоесть кнопка как бы двух частей - сверху сама кнопка и подменю?

вам нужно положить на форму dxRibbonPopupMenu, на рибоне создать кнопку dxBarLargeButton, у нее в свойстве buttonstyle выставить bsDropDown, а в свойстве DropDownMenu выбрать dxRibbonPopupMenu.
Автор: TechnoDreamer
Дата сообщения: 27.06.2010 02:59
X11


Цитата:
Цитата:про Insert знаю, но происходит перекидывание на верхнюю строку

Так отключи её

Цитата:При нажатии стрелки вниз на последней строке ничего не происходит.
Если Append включен в гриде и в наборе данных (в датасете), то должна вниз добавляться пустая строка.


Да, если NewItemRow отключить, то нажатием стелки вниз, новые рядки добавляются. Только вот отключать не хочется, стильная штука. К тому же всё равно придется, что то визуальное делать, или отдельные эдиты, или хотя бы кнопку добавления - иначе "блондинки" не догадаются как работать. А так всё интуитивно понятно и удобно, вот если надо ввести штук 40 новых записей, то весьма гимморно... Если бы была возможность поместить эту строку вниз, было бы отлично, может в будущих версиях реализуют... похожий тикет у них на сайт есть и даже accepted.

Добавлено:
P.S. Обнаружил еще свойство Navigator, не знал о нем, тоже вариант.
Но всё таки сделал добавление новой записи по нажатию клавиши низ на последней записи, но столкнулся с проблемой - не знаю как перевести фокус на первый столбец. Т.е. у меня фокус остается на там стоблце в котором вниз нажато было. Жду подсказки

Добавлено:
Нарыл, если кому надо:
DBTableView.Controller.FocusedItemIndex:=0;
Автор: afiget
Дата сообщения: 27.06.2010 12:18
TechnoDreamer
Ну, тем кому надо, думаю, делают View.OptionsBehavior.FocusFirstCellOnNewRecord

По ранее заданным вопросам.
В обработчике события AfterPost можно сделать View.DataController.GotoFirst и тогда строка добавления будет перед глазами (но в длинных таблицах только что введенная строка может уйти из поля зрения).
Автор: TechnoDreamer
Дата сообщения: 27.06.2010 12:56
afiget, FocusFirstCellOnNewRecord у меня включена, но в данном случае она не работает. Может я неправильно запись добавляю... DBTableView.DataController.Append


Цитата:
По ранее заданным вопросам.
В обработчике события AfterPost можно сделать View.DataController.GotoFirst и тогда строка добавления будет перед глазами (но в длинных таблицах только что введенная строка может уйти из поля зрения).

Это я вообще не понял. Зачем переходить на первую строку? У меня как раз наоборот GotoLast.

В общем выглядит так:

Код:
if Key=VK_DOWN then
if DBTableView.DataController.GetRecordCount-1=DBTableView.DataController.Controller.FocusedRecordIndex then
begin
DBTableView.DataController.Append;
DBTableView.DataController.GotoLast;
DBTableView.Controller.FocusedItemIndex:=0;
end;
Автор: afiget
Дата сообщения: 27.06.2010 17:19

Цитата:
FocusFirstCellOnNewRecord у меня включена, но в данном случае она не работает. Может я неправильно запись добавляю... DBTableView.DataController.Append

Эта настройка сработает при использовании встроенного функционала добавления записи. Если добавлять в коде, как у вас, тогда действительно нужно самому активизировать первую колонку.
Автор: JohnSilver182
Дата сообщения: 27.06.2010 18:57
Кстати а вы замечали что скин = MCSKIN идет с глюками ? Там у MDI CHild окон системные иконки не видны .
Автор: vladman
Дата сообщения: 28.06.2010 16:28
Cryogen2003
Вот, что получилось реализовать касательно вашего вопроса по PivotGrid.
[more=.pas]
unit Unit12;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, dxmdaset, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles, dxSkinsCore,
dxSkinMcSkin, dxSkinscxPCPainter, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxDBData,
cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGridLevel, cxClasses, cxGridCustomView, cxGrid,
cxCustomPivotGrid, cxDBPivotGrid;

type
TForm12 = class(TForm)
dxMemData1: TdxMemData;
DataSource1: TDataSource;
dxMemData1Employee: TStringField;
dxMemData1Region: TIntegerField;
dxMemData1Date: TDateField;
dxMemData1Clients: TIntegerField;
dxMemData1AcceptedClients: TIntegerField;
cxDBPivotGrid1: TcxDBPivotGrid;
procedure FormCreate(Sender: TObject);
procedure DoCalculateQuality(Sender: TcxPivotGridField; ASummary: TcxPivotGridCrossCellSummary);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form12: TForm12;

implementation

{$R *.dfm}

function VarToInteger(const AValue: Variant): Integer;
begin
Result := 0;
if not VarIsNull(AValue) then
Result := AValue;
end;

procedure TForm12.FormCreate(Sender: TObject);
begin
dxMemData1.LoadFromTextFile('Data.txt');
dxMemData1.Active := True;
cxDBPivotGrid1.CreateAllFields;
cxDBPivotGrid1.Fields[1].Area := faRow;
cxDBPivotGrid1.Fields[2].Area := faRow;
cxDBPivotGrid1.Fields[4].Area := faData;
cxDBPivotGrid1.Fields[5].Area := faData;
with cxDBPivotGrid1.CreateField do
begin
Area := faData;
Caption := 'Quality';
Visible := True;
SummaryType := stCustom;
OnCalculateCustomSummary := DoCalculateQuality;
end;
dxMemData1.Refresh;
end;

procedure TForm12.DoCalculateQuality(Sender: TcxPivotGridField; ASummary: TcxPivotGridCrossCellSummary);
var
vAcceptedClients: Integer;
vClients: Integer;
begin
vClients := VarToInteger(ASummary.Owner.GetSummaryByField( cxDBPivotGrid1.Fields[4], stSum));
vAcceptedClients := VarToInteger(ASummary.Owner.GetSummaryByField( cxDBPivotGrid1.Fields[5], stSum));

if vClients <> 0 then
ASummary.Custom := vAcceptedClients / vClients * 100;
end;

end.
[/more]

[more=.dfm]
object Form12: TForm12
Left = 0
Top = 0
Caption = 'Form12'
ClientHeight = 702
ClientWidth = 1006
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object cxDBPivotGrid1: TcxDBPivotGrid
Left = 32
Top = 72
Width = 913
Height = 593
DataSource = DataSource1
Groups = <>
TabOrder = 0
end
object dxMemData1: TdxMemData
Indexes = <>
SortOptions = []
Left = 16
Top = 16
object dxMemData1Employee: TStringField
FieldName = 'Employee'
end
object dxMemData1Region: TIntegerField
FieldName = 'Region'
end
object dxMemData1Date: TDateField
FieldName = 'Date'
end
object dxMemData1Clients: TIntegerField
FieldName = 'Clients'
end
object dxMemData1AcceptedClients: TIntegerField
FieldName = 'AcceptedClients'
end
end
object DataSource1: TDataSource
DataSet = dxMemData1
Left = 48
Top = 16
end
end
[/more]

[more=Data.txt]
Employee    Region    Date    Clients    AcceptedClients
aa    5    27.07.2010    46    28
bb    5    30.06.2010    17    7
cc    2    21.07.2010    11    4
dd    6    16.07.2010    13    1
ee    6    22.07.2010    16    5
ff    2    18.07.2010    2    1
aa    8    12.07.2010    4    3
bb    3    18.07.2010    25    8
cc    7    17.07.2010    14    11
dd    2    01.07.2010    14    12
ee    2    15.07.2010    32    5
ff    2    05.07.2010    21    13
aa    5    28.07.2010    28    17
bb    6    24.07.2010    36    3
cc    6    20.07.2010    9    1
dd    8    20.07.2010    15    3
ee    3    23.07.2010    16    12
ff    5    26.07.2010    6    5
aa    1    17.07.2010    42    14
bb    6    21.07.2010    12    11
cc    5    10.07.2010    25    14
dd    5    29.06.2010    17    1
ee    7    14.07.2010    9    2
ff    3    14.07.2010    8    6
aa    4    14.07.2010    32    21
bb    2    10.07.2010    23    5
cc    2    26.07.2010    37    25
dd    1    01.07.2010    12    8
ee    9    30.06.2010    38    4
ff    9    13.07.2010    3    2
aa    8    18.07.2010    23    22
bb    7    13.07.2010    50    10
cc    2    08.07.2010    43    14
dd    9    14.07.2010    15    12
ee    5    06.07.2010    28    5
ff    2    04.07.2010    12    5
aa    10    27.07.2010    40    12
bb    10    26.07.2010    38    16
cc    10    24.07.2010    4    1
dd    9    22.07.2010    32    23
ee    10    26.07.2010    10    8
ff    9    15.07.2010    44    29
aa    6    10.07.2010    24    22
bb    4    05.07.2010    8    5
cc    5    13.07.2010    23    16
dd    3    02.07.2010    16    2
ee    4    15.07.2010    46    3
ff    5    25.07.2010    10    2
aa    9    23.07.2010    4    2
[/more]

Мое мнение - в Pivot нет необходимости давать уже сгруппированные данные. В том то и задача Pivotа самому выполнять всевозможные группировки и, что немаловажно, самим пользователем.

По поводу Скедюлера - чуть позже.
Автор: Cryogen2003
Дата сообщения: 28.06.2010 16:31
vladman
Большое спасибо, пошел пользовать
Автор: asvet
Дата сообщения: 28.06.2010 19:04
Народ, немного глупый вопрос, не бейте ногами
Как DevExpress проверяет то, что он зарегистрирован? Собрал DXPerience 10.1.4 из исходников, после этого он стал ругаться, что триальный.
Автор: marser
Дата сообщения: 29.06.2010 09:57
asvet
http://forum.ru-board.com/topic.cgi?forum=35&bm=1&topic=36529&start=3240#lt]
Автор: MagistrAnatol
Дата сообщения: 29.06.2010 12:15
linker_2009
тошо доктор прописал, пасибо
Автор: vladmal
Дата сообщения: 30.06.2010 01:31
Всем привет.
Пытаюсь в рантайме строить структуру уровней в cxGrid: при разворачивании добавлять нужные Level's, View и источники данных, при сворачивании - удалять.

Однако, обнаружил, что когда View в GridMode, то события DetailCollapsed/DetailCollapsing в некоторых иногда не вызываются. :(

Например, развернута одна из мастер-строк (видны детали). Выбираем (не нажимая на "плюс") другую мастер - строку, детали передыдущей строки автоматически (ибо GridMode) сворачиваются.

В этом случае DetailCollapsed/DetailCollapsing не стреляют. :(

Подскажете - как поймать момент сворачивания?

Спасибо.
Автор: BlackVetal
Дата сообщения: 30.06.2010 05:24
vladmal
У меня была ситуация с изменением текущей строки - в некоторых случаях событие изменения текущей строки не происходит. Я сделал ручную привязку события изменения текущей строки через BindingContext. Попробуй посмотреть - может что и получиться.
Автор: tanaseduard
Дата сообщения: 30.06.2010 08:45
Есть проблема, если в датасет вставить новую запись то она по умолчанию в гриде появляется как первая(сортировка по нужному полю установлена как в датасете так и в гриде), такое наблюдаеться когда эта строка постоянно обновляеться процедурой логирования, Application.ProcessMessages, GridView.BeginUpdate не помагают.
Как можно сортировать данные сразу после post в гриде?
Пример.

grd_View.BeginUpdate;
ds_Log.Insert;
ds_Log.FieldByName(FID).asinteger:=id;
ds_Log.FieldByName(FStatus).asString:=Status;
ds_Log.post;
grd_View.EndUpdate;
Application.ProcessMessages;
While Not ds_Data.EOF Do
Begin
If ds_Data.RecNo Mod 100=0 Then
Begin
grd_View.BeginUpdate;
ds_Log.Edit;
ds_Log.FieldByName(FID).asinteger:=id;
ds_Log.FieldByName(FStatus).asString:=Status;
ds_Log.post;
grd_View.EndUpdate;
Application.ProcessMessages;
End;
ds_Data.Next;
End;

Пока не закончиться весь блок новая строка будет вверху, хотя по сортировке должна быть последней, после окончания все ок.
Как можно побороть это?
Автор: Cryogen2003
Дата сообщения: 30.06.2010 08:48
tanaseduard
А ты попробуй заменить insert на append
Автор: tanaseduard
Дата сообщения: 30.06.2010 09:01
Cryogen2003

Спасибо. Я как то и забыл про этот метод.

Добавлено:
Как добавить свои варианты кода в Code Template?
Автор: JohnSilver182
Дата сообщения: 30.06.2010 14:57
Hi All
Я тут dxBar забыл уже
Что то добавил новый dxBar , а он широкий какой то . Иконки если положить 24*24 так они растягиваются (

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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