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

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

Автор: gpi
Дата сообщения: 09.01.2006 12:25
Vitus_Bering

Цитата:
Цитата:Какой тип редактора в ячейке?
Не понял вопрос.

Alex47 спрашивает, какое значение прописано в cxGridDBTableViewColumn.Properties

Автор: Alex47
Дата сообщения: 09.01.2006 13:56
Vitus_Bering
Работает такой вариант:

1. В обработчик View.OnInitEdit вставить код
if AItem.Caption = 'Нужная колонка' then // Если нужна проверка на колонку,
// так как обработчик работает для всех колонок
PostMessage(Handle,CM_EndText, 0, 0); // Посылаем сообщение
2. Само сообщение в Implementation:
procedure TMyForm.CMEndText(var Msg: TMessage);
begin
with TcxCustomTextEdit(cxGrid1DBTableView1.Controller.EditingController.Edit) do
SelStart := length(Text);
end;
3. Еще строки для определения сообщения:
unit
...
interface
uses
...
const
CM_ENDTEXT = WM_USER + 1111;
type
TMyForm= class(TForm)
......
private
procedure CMEndText(var Msg: TMessage); message CM_ENDTEXT;
protected
{ Protected declarations }
public
{ Public declarations }
end;
Автор: magic2003
Дата сообщения: 09.01.2006 14:06
Всем доброго времени суток!
Кто-нить сталкивался с такой проблемой с dxDBTreeList:
подключаю его к запросу следующего содержания:
sqlText:=
'select date_name_string as model_name, model_id as parent_id, '+
'calc_data.date_id as model_id, '+calc_data_section+ ' from CALC_DATA, DATES_DOLLAR '+
'where calc_data.date_id=dates_dollar.date_id AND date_name>=:date1 '+
'AND date_name<=:date2'+#13+
'union'+#13+
'select model_name, PARENT_ID, MODEL_ID, '+goods_section+ ' from GOODS';

запрос отображает в виде дерева товары, при разворачивании узла с товарами появляются даты. На пересечении дат и колонок с фирмами указываются цены.
Так вот, такой запрос все корректно отображает в трилисте, но при навигации по узлам и ячейкам компонента не меняется Parent_id в принципе! Как будто трилист не связан с dataset-ом.
И если пролистать в конец дерева, а затем поменять какие-нибудь 2 бэнда местами, трилист опять фокусируется на первую запись из CALC_DATA.
Может кто-нибудь знает в чем проблема?
Автор: Alex47
Дата сообщения: 09.01.2006 15:20
korobovmax

Цитата:
Не проще ли найти место, где рисуется градиент и чуть-чуть его подправить?
Собственно, я этим и занимаюсь (ищу место).

Если Вас больше вдохновляет путь правки исходников, то вероятно поможет следующее:

1. Если в unit cxSchedulerCustomResourceView
поправить следующую функцию, то градиент исчезает
function TcxSchedulerDayHeaderCellViewInfo.CheckSelection: Boolean;
begin
//Result := True; // Убрано
Result := False;
end;

2. Или можно править функцию
procedure TcxSchedulerHeaderCellViewInfo.ValidateSelection;
begin
{if CheckSelection and (Date = DateOf(FDateTime)) then
FButtonState := cxbsHot;} //Убрано
if Selected then
begin
if Selected then
TextColor := FSelectionTextColor;
FSelectionRect := PainterHelper.ExcludeBorders(Bounds, Borders);
if FButtonState = cxbsHot then
begin
FSelectionRect.Left := Max(FSelectionRect.Left, FSelectionRect.Right -
PainterHelper.TextWidth(Font, DisplayText) - cxTextOffset * 2);
end;
end;
end;
3. Или можно заменить на какую-то свою процедуру
class procedure TcxSchedulerPainterHelper.DrawGradientRect
Автор: alexpiv
Дата сообщения: 09.01.2006 16:23
Данные в ExpressQuantumGrid 5 у меня отображаются в виде карточки. Eсть поле “Param” тип bit, если в поле 1, тогда эта запись должна быть обведена в рамку , т.е Styles=>CardBorder=>color=>clMaroon, а если 0 тогда отображать в нормальном виде т.е без рамки. Как сделать чтобы не все данные обводились в рамочку, а с заданным параметром т.е по полю “Param”. Если 1— то с рамочкой, если 0—то без.
Или проще чтобы первая и вторая запись обводилась в рамочку, а остальные не обводились- как это сдалать,если можно с примером.
Автор: korobovmax
Дата сообщения: 09.01.2006 19:40
Alex47, такой вариант (такие варианты ) устраивают.
Благодарю за ответ и за терпение.
Автор: gpi
Дата сообщения: 09.01.2006 20:01
alexpiv
В проект добавить StyleRepository, создать стиль cxStyle1

Код: procedure TMainForm.cvPersonsStylesGetCardBorderStyle(
Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
out AStyle: TcxStyle);
begin
if ARecord.Index<2 then
AStyle:=cxStyle1
else
AStyle:=nil;
end;
Автор: Vitus_Bering
Дата сообщения: 10.01.2006 09:58
Alex47
Спасибо за вариант, буду пробовать.
Автор: Deedl1
Дата сообщения: 10.01.2006 15:24
Всем привет!
Подскажите, можно ли в cxGridе сделать Footer в несколько строк.
В каждой строке своя сумма.
Автор: golkanavt
Дата сообщения: 11.01.2006 09:53
Deedl1
а зачем? рядом не умещаются суммы? FooterAutoHeight должно помочь
Автор: Deedl1
Дата сообщения: 11.01.2006 10:11
рядом умещаются... визуально не очень красиво все выходит....
мне нужно под одним столбцом показать 2 суммы, которые суммируются данными из этого столбца по какому-либо признаку....
в моем случае - признак оплаты.
т.е. хочу чтобы выглядело это так - Оплачено: ХХХ
Долг:ХХХ

И смотрелось бы все красивее и понятнее....

Знаю что в Eh-ом гриде есть такая штука, как высота строки подвала...
а в этом уже 2 дня копаюсь, ничего похожего не нахожу...

пыталась задавать на один column - видим только первый...
Автор: alexpiv
Дата сообщения: 11.01.2006 10:54
Помогите не могу разобраться, как получить значения полей на против которого стоит галочка? Надо что бы при нажатии кнопки, все строчки на против которых стоят галочки скопировались в другую таблицу, но как получить значение этих полей. Как таблице CompT.FieldByName('firmy').AsString присвоить значение поля напротив которого стоит галочка. Т.е у меня пробегает цикл по записям и проводится проверка если галочка стоти значит скопировать ее в в другую таблицу.

procedure Tfr_Main.dxBarButton4Click(Sender: TObject);
var i:integer;
val:boolean;
begin
j:=0;
try
for I:=0 to cxGrid1DBTableView1.DataController.RecordCount-1 do
begin
val := cxGrid1DBTableView1.DataController.GetValue(i,cxGrid1DBTableView1Column1.Index);
if val then
begin
compt.Append;
CompT.FieldByName('firmy').AsString:=(Как получить значение поля на против которого стоит галочка?);
end;
end;
except
compt.Append;
CompT.FieldByName('firmy').AsString:=;
end;
Автор: felixz
Дата сообщения: 11.01.2006 12:37

Цитата:
alexpiv

Скорей всего нужно бежать по cxGrid1DBTableView1.DataController.DataSource.DataSet
и проверять значения соотв. полей.
Автор: Alex47
Дата сообщения: 11.01.2006 13:14
alexpiv
Часто использую цикл по cxGrid1DBTableView1.ViewData - там хранятся видимые
записи грида, с учетом текущего фильтра. Ниже дан пример с точностью до идеи.
Count := cxGrid1DBTableView1.ViewData.RecordCount;
IndexCheck := cxGrid1DBTableView1CheckColumn.Index; // Индекс колонки в которой
for I := 0 to Count-1 do // проставляются галочки
begin
if cxGrid1DBTableView1.ViewData.Records[I].Values[IndexCheck] = True then
begin // это, если тип данных в колонке с галочкой - boolean, считаем, что при True
compt.Append; // галочка проставлена, а при false - нет
CompT.FieldByName('firmy').AsString:= cxGrid1DBTableView1.ViewData.
Records[I].Values[IndexCheck];
или
CompT.FieldByName('firmy').AsString:= cxGrid1DBTableView1.ViewData.
Records[I].DisplayTexts[IndexCheck];

end;


Добавлено:
Deedl1

Сделать можно, но, практически, ручками. Вот ответ Sinan Demir
на подобный вопрос от 20.11.2003:

- Создать a style for the footer
- Выбрать в Style двойной размер шрифта,
чтобы получить место для двух строк
(Double the style.Font.Size. eg. 16 instad of 8
=> you get two lines, no auto height!)
- Нарисовать футер в обработчике CustomDrawFooterCell:
(Ваш код прорисовки, естественно, будет отличаться)
procedure TForm1.YourViewCustomDrawFooterCell(
Sender: TcxGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean);
var FBounds: TRect;
begin
ACanvas.Font.Size := 8;
ACanvas.FillRect(AViewInfo.Bounds);
FBounds := AViewInfo.TextAreaBounds;
FBounds.Bottom := FBounds.Bottom*2;
ACanvas.DrawTexT(AViewInfo.Text, FBounds,cxWordBreak);
ACanvas.FrameRect(AViewInfo.ContentBounds,clGray);
ADone := True;
end;
Для последних версий Grid5 может быть возможны и другие варианты.

Автор: Kr_Alex
Дата сообщения: 11.01.2006 16:44
Deedl1
Не знаю можно ли две строки в футере, но в демке есть как поле в футере через контекстное меню поменять на другое
Автор: Legion
Дата сообщения: 11.01.2006 19:43
Вопрос по DBTreeList
В 3-й версии, если утащить строку на "пустое" место, то эта запись переносилась на самый верхний уровень.
В 4-й с удивлением обнаружил, что этот вариант уже не проходит, запись остается там, где была.
Поигрался с подходящими по смыслу опциями - результат нулевой.
Как с этим бороться? Неужто самому drag-drop обрабатывать?
Автор: Alex47
Дата сообщения: 12.01.2006 14:41
Deedl1

Похоже, можно сделать проще:

У TcxGridDBTableSummaryItem есть событие OnGetText.
В его обработчик и можно вставить формат текста на две строки.
Я пробовал такой вариант:

procedure TwsSalesInput.cxGrid1DBTableView1TcxGridDBDataController
TcxDataSummaryFooterSummaryItems0GetText(
Sender: TcxDataSummaryItem; const AValue: Variant; AIsFooter: Boolean;
var AText: String);
begin
AText := 'Строка1'+#10+'Строка2';
end;
Футер на экране выглядит так:
Строка1
Строка2
FooterAutoHeight должно быть True.
Остается получить нужные значения вместо Строка1 и Строка2.
Сделать это можно.
Автор: sasku
Дата сообщения: 12.01.2006 19:27
При экспорте с помощью ExportGrid4ToExcel числа сохраняются как текст, а если поле в Properties определить как Calc,Currency - то в екселе сохраняется как дельги и без копеек - как лечить ?
Автор: Alex47
Дата сообщения: 12.01.2006 20:57
sasku
Если не читали, то прочитайте в Help раздел
ExportGrid4ToExcel - определенная информация там есть.
Автор: PocoBOR
Дата сообщения: 13.01.2006 07:28
2 Alex47

> 1. В DataSet (первая таблица) вашего cxGrid1DBTableView1 создать lookupfield "Direction"

в самой FB+ DataSet? научите как в ней это создавать...

> с KeyFields = часть IP адреса;порт
> c LookupKeyFields = часть IP адреса;порт
> c LookupDataSet = вторая таблица
> c LookupResultField = направление

> 2. В cxGrid1DBTableView1 завести column с FieldName = Direction

Автор: Alex47
Дата сообщения: 13.01.2006 10:13
PocoBOR

Цитата:
в самой FB+ DataSet? научите как в ней это создавать...


Излагаю на примере TQuery (у меня нет FB).
У Вас вместо TQuery будет соответствующий ему в FB.
1. Выделить мышью на форме TQuery, для которого создаем lookupfield.
После этого открыть редактор полей для него - FieldsEditor, правой кнопкой мыши или
двойной клик по TQuery.
2. В появившемся окне редактора полей по правой кнопке мыши выбрать
NewField.
3. В появившемся окне NewField поставить тип поля Lookup и заполнить все
остальные поля.
4. Нажать OK, после этого будет создано требуемое lookupfield.
Автор: PocoBOR
Дата сообщения: 13.01.2006 11:19
сделал (вспомнил что такое уже делал как то
но вместо требуемого результата только пустые поля


KeyFields = часть IP адреса;порт
LookupKeyFields = часть IP адреса;порт
LookupDataSet = вторая таблица
LookupResultField = направление

lookupcache=false

если делаю

KeyFields = порт
LookupKeyFields = порт

то результат выводится но не совсем коректный (берется первое значение соответсвуюшее запросу)
Автор: korobovmax
Дата сообщения: 13.01.2006 11:25
Стандартная высота одной записи в Гриде - 16 пикселей.
Если добавить столбец с Properties ImageComboBox с картинками 16x16, то высота увеличивается до 18 пикселей.

Как возможно оставить высоту нетронутой?
<GridTableView>.OptionsView.CellAutoHeight := False не выполняет задачу.
Автор: PocoBOR
Дата сообщения: 13.01.2006 11:32
2 Alex47

спасибо разобрался

Добавлено:
а еще вопрос: можно ли просуммировать несколько полей типа STRING и вывести в одном поле?
Автор: Alex47
Дата сообщения: 13.01.2006 12:59
korobovmax
1. Можно попробовать использовать обработчик

View.OnGetCellHeight

2. Посмотрите в http://www.devexpress.com/Support/KnowledgeBase
статью с индексом 334 (dxEQG4_CustomViewRowHeightDelphi.zip)
Автор: OXDBA
Дата сообщения: 13.01.2006 13:06

Цитата:
а еще вопрос: можно ли просуммировать несколько полей типа STRING и вывести в одном поле?

Можно через calculated поля TpFIBDataSet, но я обычно такие вещи делаю в запросе типа:

select
t1.field1||' '||t2.field2
from
TABLE1 t1
Автор: PocoBOR
Дата сообщения: 13.01.2006 13:09
OXDBA

у меня нет такой возможности потому что в базе хранятся численные значения, а в гриде преобразуются в удобопонимаемое значение. так что нужно именно это удобопонимаемые значения обединить в один столбец
Автор: OXDBA
Дата сообщения: 13.01.2006 13:22
PocoBOR
Тогда создай вычисляемое поле, делается это аналогично созданию LookUp полей, только Field Type ставишь calculated, а в обработчике OnCalcFields пишешь что надо делать.

procedure TdmUsers.itShablonParamsCalcFields(DataSet: TDataSet);
begin
DataSet.FieldByName('MyCalcField').asString := 'Вася купил ' +
DataSet. FieldByName('FIELD1').asString + ' ящиков пива';
end;



Добавлено:
Стоп, я не совсем понял что значит

Цитата:
а в гриде преобразуются в удобопонимаемое значение
?
Если ты имеешь ввиду справочники, которые ты визуализируешь через LookUp и тебе необходимо соединять значения LookupResultField, то все решается обычным join'ом в запросе, если что-то другое, тогда поясни.
Автор: korobovmax
Дата сообщения: 13.01.2006 15:41
Alex47, благодарю.
Автор: minkus
Дата сообщения: 14.01.2006 14:08
Есть связка Master/Detail в cxGrid-e в Detail-e есть Summary, нужнл при изменение итога по Detail изменить соответственно и запись в Mastere. Как правилно ето сделать оставаясь в Detail-e

Спасибо!

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

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


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