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

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

Автор: infomSB
Дата сообщения: 01.03.2009 15:44
X11
Используй для поиска DataController.Search там есть методы и Locate и LocateNext, т.е. практически все что надо.

deadbitch
Все отлично, если вы не разобрались, это не значит что компонент плохой или не работает. Телепатов тут нет, поэтому в чем проблема мы никак не поймем...
Вы так пробовали:
<Row>.Properties.Value := TcxComboBoxProperties(<Row>.Properties.EditProperties).Items[0];

Добавлено:
lorents
Один из самых популярных и крупных пакетов платных компонентов для Delphi и BCB. Здесь в основном обсуждается работа с БД.
Автор: brookson
Дата сообщения: 01.03.2009 16:31
народ, помогите переложить с одного языка на другой (кажется девки имеют для различных языков разный набор функций и свойств, или я не прав??).
нашёл на сайте поддержки пример почти как у меня:
http://www.devexpress.com/Support/Center/p/Q94859.aspx
разница лишь в том, что у меня есть Total Sum, Total Average, а мне надо вывести процент в третьем Total-e (Custom), базируясь на Total (Sum) и grand total для данной строки этого же столбца.
Вышел из положения с помощью такого вот кода, но мне он не нравится (SUMSERV - это столбец, в для которого всё считается, а всего есть 2 столбца faData):

Код: procedure TF_REPORTS.SUMSERVGetDisplayText(Sender: TcxPivotGridField;
ACell: TcxPivotGridDataCellViewInfo; var AText: string);
var
a1, a2: double;
begin
begin
if GridZV2F.ViewData.RowCount<2 then exit;

if acell.IsTotal then begin
if acell.SummaryType=stCustom then begin
if gridZV2F.ViewData.CellsAsText[acell.RowIndex-2,acell.ColumnIndex]='' then
a1:=0
else
a1:=strtofloat(gridZV2F.ViewData.CellsAsText[acell.RowIndex-2,acell.ColumnIndex]);
if gridZV2F.ViewData.CellsAsText[acell.RowIndex-2,GridZV2F.ViewData.ColumnCount-2]='' then
a2:=0
else
a2:=strtofloat(gridZV2F.ViewData.CellsAsText[acell.RowIndex-2,GridZV2F.ViewData.ColumnCount-2]);
atext:=floattostr(round(a1*100/a2))+'%';
end;
end;
Автор: Andrey128
Дата сообщения: 04.03.2009 06:10
Как сделать перемещение (reorder) закладок мышкой в TcxPageControl (TcxTabControl) покрасивше?
Имеется ввиду, не просто в событии OnDragOver вычислять IndexOfTabAt(X, Y), а чтобы как в Делфи 2007 делается перемещение закладок или перемещение колонок в TcxGrid.
Может кто в этом направлении копал, поделитесь идеями, а?
Автор: brookson
Дата сообщения: 04.03.2009 09:44
э-эх! что, ни у кого никаких мыслей?
Автор: vladman
Дата сообщения: 04.03.2009 13:37
Andrey128

Цитата:
Как сделать перемещение (reorder) закладок мышкой в TcxPageControl (TcxTabControl) покрасивше?

По ссылке есть пример.
How to reorder the pages in the ExpressPageControl via drag-and-drop

Для

Цитата:
чтобы как в Делфи 2007 делается перемещение закладок

можно немного подправить метод cxPageControl1DragOver (см. пример dxKB_1056.zip (2253 bytes)) -


Код: procedure TForm1.cxPageControl1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
Index: Integer;
begin
with TcxPageControl(Sender) do
begin
Index := IndexOfTabAt(X, Y);
Accept := (Index > - 1);// and (Pages[Index] <> TmyDragObject(Source).Tab);
if Index > - 1 then TmyDragObject(Source).Tab.PageIndex := Index;
end;
end;
Автор: Andrey128
Дата сообщения: 05.03.2009 07:22
vladman
Спасибо за идею.
Прикрутил, к приведенному вами примеру, TcxDragAndDropArrow и получил то что хотел.
Автор: deadbitch
Дата сообщения: 05.03.2009 10:26
infomSB

Цитата:
Все отлично, если вы не разобрались, это не значит что компонент плохой или не работает. Телепатов тут нет, поэтому в чем проблема мы никак не поймем...
Вы так пробовали:
<Row>.Properties.Value := TcxComboBoxProperties(<Row>.Properties.EditProperties).Items[0];


Мне нужно было при открытии формы указать в одном из EditorRow, который ComboBox, что у него должно быть значение с индексом "таким-то", но такой возможности нет напрямую. Так как ты указал я не пробовал, обошёлся ImageComboBox, где задавая Properties.Value я получаю, что КомбоБокс отображает Item с этим Value (Value получается как индекс айтема).

Вообще говоря до сих пор не понимаю, почему ВертикалГрид такая .. кхм.. странная, она же не полностью вписывается в их унификацию встроенных редакторов. Почему нельзя её реализовать в полной мере - не ясно.
Автор: sam291074
Дата сообщения: 05.03.2009 20:59

Цитата:
Мне нужно было при открытии формы указать в одном из EditorRow, который ComboBox, что у него должно быть значение с индексом "таким-то", но такой возможности нет напрямую.

А нужно ли напрямую? Если знаешь индекс, значит знаешь и значение записи. Ведь Вы не индекс хотите видеть на экране, а элемент ComboBox. Далее, зная значение можно вызвать IndexOf(Значение) и получите Index. А зная Index полю можно присвоить Value

Код: Row->Properties->Value = ((TcxComboBoxProperties*)(Row->Properties->EditProperties))->Items->Strings[Index];
Автор: X11
Дата сообщения: 05.03.2009 21:00
Почему AV возникает?

Неужели, кроме создания во время исполнения программы самого грида, нужно ещё и создавать вьюху уровень??

Код:
Var
grid: TcxGrid;
ds: TDataSource;
begin
.....
grid := TcxGrid.Create(nil);
ds := TDataSource.Create(nil);
try
ds.DataSet := ftFIB;


на этой строке AV
(grid.ActiveView as TcxGridDBTableView).DataController.datasource := ds;

Автор: vladman
Дата сообщения: 06.03.2009 00:33
X11

Цитата:
Почему AV возникает? Неужели, ....


Ужели. Нужно, даже необходимо
не мы ж такие, жизнь такая

Объекты типа TcxGrid - это только контейнер для Views, причем Views могут иметь иерархию(уровни), и также могут быть нескольких типов:
- Table View (TcxGridTableView and TcxGridDBTableView)
- Banded Table View (TcxGridBandedTableView and TcxGridDBBandedTableView)
- Card View (TcxGridCardView and TcxGridDBCardView)
- Chart View

Создавая эти уровни и необходимые типы View вы и получаете то, что необходимо в каждом конкретном случае.

А AV возникает так как объект grid.ActiveView еще не создан.

Автор: X11
Дата сообщения: 06.03.2009 10:51

Цитата:
А AV возникает так как объект grid.ActiveView еще не создан.

Нет, AV возникает ещё с 2007-го года (прочитал на сайте). Я выяснил, что нужно сначала создать колонки, а после этого открывать набор данных. У меня просто было сначала открытие набора данных.
Автор: vladman
Дата сообщения: 07.03.2009 01:08
X11


Цитата:
AV возникает ещё с 2007-го года

Думаю AV начало возникать гораздо раньше.
Уже в системах построенных на базе процессоров Motorola 68000 (1978 г.) могло возникать исключение segmentation fault, позднее ставшее привычным ACCESS_VIOLATION в MS Windows.

Ну а если немного серьезней, то AV происходит при обращении к памяти к которой обращение запрещено.
Наиболее типичные примеры возникновения AV это -
1. Обращение к еще не созданному объекту.
2. Обращение к уже разрушенному объекту.

ссылку на
Цитата:
прочитал на сайте
не помешало бы увидеть;

И каким образом
Цитата:
Я выяснил ...
, т.е. немного подробнее.

А в качестве примера -

Код: How to Dynamically Create a Level/View at Runtime
Solution

Here is some sample code which demonstrates how to create a DBTable View, bind it to data and populate it with columns.

[Delphi]
// Delphi code
var
Grid: TcxGrid;
Level: TcxGridLevel;
View: TcxGridDBTableView;

// Creates a Grid instance
Grid := TcxGrid.Create(SomeOwner);
Grid.Parent := SomeParent;
// Creates a Level
Level := Grid.Levels.Add;
Level.Name := 'SomeLevelName';
// Creates a View
View := Grid.CreateView(TcxGridDBTableView) as TcxGridDBTableView;
View.Name := 'SomeViewName';
// … and binds it to the Level
Level.GridView := View;
// Hooks up the View to the data
View.DataController.DataSource := SomeDataSource;
// … and creates all columns
View.DataController.CreateAllItems;
end;
Автор: Sufferer
Дата сообщения: 07.03.2009 22:39
Привет всем. Продолжаю биться с VerticalGrid в Девках.

Задача такая: Имеется несколько вертикальных гридов с родительской строкой типа TcxColorBox. У этой строки есть дочерняя строка тогоже типа.
Необходимо написать универсальный обработчик для дочерней строки который присваивал бы тоже самое значение цвета родительской строке.
Пытаюсь это сделать такой жуткой гусеницей:
procedure TForm1.EditRow1EditPropertiesEditValueChanged(Sender: TObject);
begin
TcxColorComboBoxProperties(TcxEditorRow(TcxCustomVerticalGrid(TControl(Sender).Parent).FocusedRow.Parent).Properties).DefaultColor :=
TcxColorComboBox(Sender).ColorValue;
end;
а оно панимашь по ексепшину вылетает. Где я наврал и может это короче сделать можно?

Уф, сам нашел ляп: Надо так:
TcxColorComboBoxProperties(TcxEditorRow(TcxCustomVerticalGrid(TControl(Sender).Parent).FocusedRow.Parent).Properties.EditProperties).DefaultColor :=
TcxColorComboBox(Sender).ColorValue;

Второй вопрос остался, как тоже самое сделать покороче?
Автор: vladman
Дата сообщения: 08.03.2009 04:29
Sufferer

Цитата:
Второй вопрос остался, как тоже самое сделать покороче?


TcxEditorRow(TcxVerticalGrid(TcxCustomEdit(Sender).Parent).FocusedRow.Parent).Properties.Value := TcxCustomEdit(Sender).EditValue;
Автор: infomSB
Дата сообщения: 08.03.2009 09:37

Цитата:
Второй вопрос остался, как тоже самое сделать покороче?

Вас смущает длина кода ? Я думаю это самое маленькое о чем стоит беспокоиться, можно разложить одну строку на несколько строк с проверкой на принадлежность классу если делать совсем правильно.
Автор: Sufferer
Дата сообщения: 08.03.2009 15:45
Конечно смущает такой каскад приведений типов - ненормально это как-то воспрнимается.
У меня вообще как-то туго получается с VerticalGridом работать. Особенно раздражает, что обращаясь по сути к одному и тому-же элементу я должен это делать по разному.
А для колорбокса прямо изврат какой-то:
Через Sender так:
TcxColorComboBox(Sender).ColorValue
Через элементы вертикалгрида уже по другому:
TcxEditorRow(Theme.Rows[1]).Properties.Value
причем еще и учесть, что это это значение может быть пустым, и тогда уже надо обращаться иначе:
TcxColorComboBoxProperties(TcxEditorRow(Theme.Rows[1]).Properties.EditProperties).DefaultColor

Считаете это нормально, что для получения простого значения цвета я должен изворачиваться таким штопором?
Автор: Meister Floh
Дата сообщения: 08.03.2009 20:25
Народ ну уже мозги сломал.. Если использую стандартный ПрогрессБар в цикле - все работает! Как только пробую пользовать аналогичные компоненты из ДевЭкспресс или из ТМС - шиш! Щаз с ума спрыгну.. Если ставлю таймер и меняю Позишен раз в секунду в ОнТаймер - работает, в цикле шиш...Попробуйте вот такую фичу:


Цитата:

void __fastcall TForm1::Button1Click(TObject *Sender)
{

    for (int i = 0; i < 101; i++) {
ProgressBar1->Position = i; //Стандартный ПрогрессБар
        AdvSmoothProgressBar1->Position = i; //ТМС ПрогрессБар
        cxProgressBar1->Position = i; //ДэвЭкспресс ПрогрессБар
        Sleep(100);
    };
}
Автор: Sufferer
Дата сообщения: 08.03.2009 22:10
А если так:
void __fastcall TForm1::Button1Click(TObject *Sender)
{

for (int i = 0; i < 101; i++) {
ProgressBar1->Position = i; //Стандартный ПрогрессБар
AdvSmoothProgressBar1->Position = i; //ТМС ПрогрессБар
cxProgressBar1->Position = i; //ДэвЭкспресс ПрогрессБар
Application->ProcessMessages;
Sleep(100);
};
}
Автор: infomSB
Дата сообщения: 08.03.2009 23:15
Sufferer
Вы постоянно жалуетесь на ВертикалГрид, хотя по прежнему продолжаете им пользоваться. Если не нравиться есть алтернативы, хотя от них у вас волосы на голове встанут, но это мелочи конечно.


Цитата:
Особенно раздражает, что обращаясь по сути к одному и тому-же элементу я должен это делать по разному

А почему не делаете так ?
<TcxEditorRow>.Properties.Value
Автор: Meister Floh
Дата сообщения: 09.03.2009 09:31
Sufferer
Спасибо большое уже нашел! Просто меня изначально смутило, что даже если вставить:

AdvSmoothProgressBar1->repaint() (или update() - не имеет значения) - то все равно не работает..
Автор: X11
Дата сообщения: 09.03.2009 12:34

Цитата:
И каким образом
Цитата:
Я выяснил ...
, т.е. немного подробнее.

просто перенёс строку открытия датасета после создания колонок и AV исчезло


Цитата:
ссылку на
Цитата:
прочитал на сайте
не помешало бы увидеть;

hххvladman
p://www.devexpress.com/Support/Center/p/AB15359.aspx

спасибо за пример
Автор: vladman
Дата сообщения: 09.03.2009 13:07
X11

Цитата:
www.devexpress.com/Support/Center/p/AB15359.aspx

Автор этого Bug Report сам признался, что

Цитата:

Hi
Im sorry it was our fault here
Not related to devexpress
My apologies

Автор: Andrey128
Дата сообщения: 09.03.2009 13:13
Хочу соорудить что-то наподобе TCategoryPanelGroup из D2009 с помощью Девок.
Подскажите, в каком направлении копать?

Почему не использую TCategoryPanelGroup:
1. Cижу на D2007 по ряду причин
2. Использую темы в Девках, и хотелось бы что бы все было в одном стиле

Более детально, задача такая:
1. Есть N компоненов TSyntaxMemo из EControl
2. У каждого TSyntaxMemo есть заголовок
3. Нужно чтобы они были расположены вертикально
4. Если они вмещаются, то должен быть вертикальный скроллер
5. Чтобы можно было один или более TSyntaxMemo свернуть

PS Девки не планируют родить свой TcxSyntaxMemo?
Уж очень я на них подсел.
Автор: X11
Дата сообщения: 09.03.2009 13:14
По этому примеру вопрос.
hххp://www.devexpress.com/Support/Center/KB/p/A295.aspx

Обязательно ли указывать Parent?
Просто у меня грид создаётся только для того, чтобы выполнить экспорт (это всё не на форме а в простом модуле).
Т.е. создаётся набор данных, источник данных, сам грид, в нём колонки, после этого экспорт данных и всё разрушается.

Добавлено:
vladman, странно, а сейчас AV не могу воспроизвести.
Автор: Meister Floh
Дата сообщения: 09.03.2009 13:26
Andrey128
Есть вот такя фича - TdxSideBar - посмотри может поможет..
Автор: X11
Дата сообщения: 09.03.2009 13:31
Вот код, который вызывает AV


Код:
procedure TUpdateFTP.SaveFilesToTempForFTPUpdate();
Var
grid: TcxGrid;
AView: TcxGridDBTableView;
cxLevel: TcxGridLevel;
ds: TDataSource;
begin
...
//ftFIB - TpFibDataSet;

ftFIB.close;
ftFIB.Conditions.CancelApply;
ftFIB.Conditions.Clear;

grid := TcxGrid.Create(nil);
ds := TDataSource.Create(nil);
try
ds.DataSet := ftFIB;

cxLevel := grid.Levels.Add;

AView := TcxGridDBTableView(grid.CreateView(TcxGridDBTableView));

cxLevel.GridView := AView;

ftFIB.Open; <-если эту строку поствить последней, то AV нет, но и грид пустой
AView.DataController.datasource := ds;

AView.DataController.CreateAllItems(False); <-- здесь AV



Автор: Andrey128
Дата сообщения: 09.03.2009 14:08
Meister Floh

Цитата:
Есть вот такя фича - TdxSideBar - посмотри может поможет..

Этот гад не дружит с TdxSkinController.SkinName
Автор: Meister Floh
Дата сообщения: 09.03.2009 14:22
Andrey128
Это есть такое.. Хотя.. Надо поковырять.. У девочек не всегда все очевидно, как должно быть.. например попробуйте из свойство впихнуть прогрессбар в панель контейнер
Автор: vladman
Дата сообщения: 09.03.2009 14:26
X11

Цитата:
Обязательно ли указывать Parent?

В случае, если нет необходимости визуализировать контрол на форме, то не обязательно.
По поводу
Цитата:
Вот код, который вызывает AV

Если посмотреть на метод AView.DataController.CreateAllItems, то видим в нем такой вызов

Код: Name := CreateUniqueName(GridView.Owner, GridView, AItem, ScxGridPrefixName, Fields[I].FieldName);
Автор: X11
Дата сообщения: 09.03.2009 17:47
vladman, спасибо!!
ты спас гиганта мысли

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081

Предыдущая тема: Delphi: tcp клиент в потоке


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