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

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

Автор: alsterkh
Дата сообщения: 03.11.2015 10:42
Добрый день! Подскажите, может кто знает. Есть в TcxGridDBTableView панель поиска FindPanel. Как сделать, чтобы при открытии формы фокус был в строке поиска?
Автор: dimm78
Дата сообщения: 03.11.2015 12:23
alsterkh

type
TcxGridTableControllerAccess = class (TcxGridTableController);

TcxGridTableControllerAccess(<AView>.Controller).FindPanel.Edit.SetFocus;
Автор: alsterkh
Дата сообщения: 03.11.2015 12:43
Спасибо, dimm78!

Автор: vcrank
Дата сообщения: 03.11.2015 22:31
Подскажите пожалуйста, как можно связать 3 таблицы в двухуровневом гриде?
Таблица 1 - Список клиентов
Таблица 2 - Список уколов
Таблица 3 - Список препаратов

Таблица 1 и 2 связаны между собой самым обычным образом. В гриде в таблице второго уровня через LookupCombobox отображаются названия прививок
Таблицы 2 и 3 связаны тоже обычным образом (каждой прививке может соответствовать несколько препаратов)



Как в гриде сделать выпадающие список в колонке Вакцина и чтобы в этом выпадающем списке были препараты, соответствующие только для текущей прививки? Соответственно переходим на след. строку и выпадающий список обновляется на новые значения.
Ну и само собой заносился бы только ID, а не само название
Автор: dimm78
Дата сообщения: 04.11.2015 00:20
vcrank

Посмотри вот эти примеры
_https://www.devexpress.com/Support/Center/Question/Details/T135466
_https://www.devexpress.com/Support/Center/Question/Details/T246058
Автор: G787
Дата сообщения: 09.11.2015 22:56
----------------------
Автор: LoneWolfII
Дата сообщения: 12.11.2015 08:52
DLL со скинами из библиотеки dxSkins, автор Ziltoid - ссылка опять сдохла....
можете переложить ?
Автор: WSWCORP
Дата сообщения: 16.11.2015 10:59
Приветствую уважаемые! Возможно, кто-то подскажет... Имеем dxRibbon, на ленте имеем 3 группы, которые прижаты к левому краю формы. Есть ли возможность одну из групп прижать к правой части ленты, не изменяя положения остальных групп?
Автор: tanaseduard
Дата сообщения: 16.11.2015 11:29
WSWCORP
Когдато возник такой вопрос, и решение не было найдено.
Автор: WSWCORP
Дата сообщения: 17.11.2015 07:25
Очень жаль, придется что-то мудрить... А очень не хотелось ломать общий стиль...
Автор: LoneWolfII
Дата сообщения: 22.11.2015 09:04

Цитата:
DLL со скинами из библиотеки dxSkins, автор Ziltoid - ссылка опять сдохла....
можете переложить ?


Не ужели ни у кого нет?
Автор: marser
Дата сообщения: 22.11.2015 09:24
LoneWolfII
А зачем она нужна? Хранить скины в отдельном файле? Так это можно сделать и стандартными средствами devexpress.
Автор: LoneWolfII
Дата сообщения: 23.11.2015 09:01
marser

Цитата:
А зачем она нужна? Хранить скины в отдельном файле? Так это можно сделать и стандартными средствами devexpress.

Ради спортивного интереса
Автор: MagistrAnatol
Дата сообщения: 24.11.2015 16:28
Можно как-то задать цвет RibbonRadialMenu не используя скины и рибон?

Добавлено:
И как добавить в dxRibbonRadialMenu кнопки программно?

Добавлено:
С кнопками разобрался
Автор: vavavol
Дата сообщения: 01.12.2015 08:36
Добрый день! Подскажите, пожалуйста, как при группировке по полю в cxGrid убрать название поля, а оставить только его значение? Заранее спасибо за ответ
Автор: marser
Дата сообщения: 01.12.2015 09:25
vavavol

Цитата:
Подскажите, пожалуйста, как при группировке по полю в cxGrid убрать название поля

Обработать событие OnCustomDrawGroupCell. В AViewInfo.Text пишите что угодно.
Автор: dimm78
Дата сообщения: 01.12.2015 09:34
vavavol


Цитата:
Добрый день! Подскажите, пожалуйста, как при группировке по полю в cxGrid убрать название поля, а оставить только его значение? Заранее спасибо за ответ


Самый простой вариант это использовать событие OnGetDisplayText колонок. Вот код обработчика:

procedure <MyForm>.<MyColumn>GetDisplayText(Sender: TcxCustomGridTableItem;
ARecord: TcxCustomGridRecord; var AText: String);
begin
if ARecord is TcxGridGroupRow then
AText := VarToStr(ARecord.Values[Sender.Index]);
end;
Автор: vavavol
Дата сообщения: 01.12.2015 10:33
marser
dimm78

Спасибо, очень помогли. Даже не в том, какой текст выводить в TcxGridGroupRow, а где теперь можно копать.

Теперь опять новый тупик. В гриде есть два поля, скажем LevelInt и LevelName. В первом 0,1,2....,
а в другом - названия. Сгруппировал по LevelName, чтобы было понятно, но оно ж и сортирует, собака при группировке по названию. Получается, что название с levelInt 0 может стоять в любом месте, а мне нужно - чтобы первым. Добавил сначала группировку по levelInt. Но тогда грид некрасиво смотрится - с двумя группировками. Помогите решить этот вопрос - больше не буду приставать. Спасибо
Автор: dimm78
Дата сообщения: 01.12.2015 11:44
vavavol

Попробуй сделать кастомную сортировку колонки LevelName через обработчик <MyView>.DataController.OnCompare. Думаю если в нем учитывать не само значение LevelName, а значение LevelInt, то все должно получиться.

Что-то типа этого:

procedure <MyForm>.<MyView>DataControllerCompare(
ADataController: TcxCustomDataController; ARecordIndex1, ARecordIndex2,
AItemIndex: Integer; const V1, V2: Variant; var Compare: Integer);
var
AVal1, AVal2 : Integer;
begin
if (<MyView>.Items[AItemIndex] = ColLevelName) then
begin
AVal1 := ADataController.Values[ARecordIndex1, ColLevelInt.Index];
AVal2 := ADataController.Values[ARecordIndex2, ColLevelInt.Index];
Compare := AVal1 - AVal2;
end
else
Compare := VarCompare(V1, V2);
end;

Автор: vavavol
Дата сообщения: 01.12.2015 12:30
dimm78

Спасибо, попробую и так. Решил вопрос другим способом:

procedure TfrmEditContract.cxGrid1DBTableView1CustomDrawGroupCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableCellViewInfo; var ADone: Boolean);
var
col_ContractLevelName: TcxCustomGridTableItem;
ContractLevelName_Value:string;
AView:TcxGridDBTableView;
Aindex: Integer;
AList: Tlist;
begin
inherited;
AView :=TcxGridDBTableView(Sender);
col_ContractLevelName:= cxGrid1DBTableView1.GetColumnByFieldName('ContractLevelName');
try
AList := Tlist.Create;
AView.DataController.Groups.LoadRecordIndexesByRowIndex(AList,AViewInfo.GridRecord.Index);

if AList.Count > 0 then begin
Aindex := Integer(AList.Items[0]);
if (not VarIsNull(AView.DataController.Values[Aindex, col_ContractLevelName.Index]))
then
ContractLevelName_Value := VarAsType(AView.DataController.Values[Aindex, col_ContractLevelName.Index],varString)
else
ContractLevelName_Value :='';
AViewInfo.Text:=ContractLevelName_Value;
end;
finally
AList.Free;
end;
end;
Автор: VitaliM
Дата сообщения: 03.12.2015 13:02
LoneWolfII
Вот нашел. Не знаю то это что было или нет, но работает.
Автор: LoneWolfII
Дата сообщения: 04.12.2015 08:32
VitaliM


Цитата:
Вот нашел. Не знаю то это что было или нет, но работает.


Исходя из описания в шапке:


Цитата:
Архив включает в себя:
- DLL со скинами (помимо скинов есть битмапы 16х16 для ImageCombobox'ов, битмапы 32х32 для RibbonGallery, константы цветов полосатости и фонов для каждого скина)
- модулек SkinHandle.pas с процедурками загрузки и навешивания скина на приложение.
- тестовый пример.


Это немного другое, но тоже пойдет. Спасибо!
Автор: VadimLou
Дата сообщения: 07.12.2015 19:29
Проблема в последнем DevExpress 2014.vol.2.10.
В cxGrid(cxGridDBTableView) с наличием группировки полей и с выключенным dcoImmediatePost в DataController.Options после модификации записи и переходе на другую запись при помощи мышки все не текущие группы схлопываются. В версии 2011.vol.2.6 такого поведения не было. Смена фокуса клавиатурой не на соседнюю позицию (PageUp/PageDown) так же схлопывает группы.
Автор: sonopydnaef
Дата сообщения: 08.12.2015 13:58
DevExpress 2014.vol.2.10

cxDrawTextUtils.pas fix "Out of memory"
...
function cxMakeTextRows(AHandle: TCanvasHandle; AText: PWideChar; ATextLength: Integer;
...
ANextLine := GetLineBreak(AHandle, P, ATextLength, W, ATextRowFormat,
ATextRow, ACalcTextExtentsProc, AUserData);
{<FIX>}
if ANextLine <= P then
ANextLine := P + SizeOf(WideChar);
//Break;
{</FIX>}
Dec(ATextLength, ANextLine - P);
P := ANextLine;

cxCustomData.pas // fix "RowIndex вышел за границы диапазона"
...
function TcxCustomDataControllerInfo.GetFocusedRecordIndex: Integer;
{<FIX>}
function _AlowRowIndex(ARowIndex: Integer): Boolean; { from "TcxCustomDataControllerInfo.CheckRowIndex" }
begin
Result := ((0 <= ARowIndex) and (ARowIndex < GetRowCount));
end;
{</FIX>}
begin
if (FFocusingInfo.RowIndex <> -1)
{<FIX>} and _AlowRowIndex(FFocusingInfo.RowIndex){</FIX>} then
Result := GetRowInfo(FFocusingInfo.RowIndex).RecordIndex
else
Result := -1;
end;


cxSplitter.pas // fix AV
...
procedure TcxCustomSplitter.SetControl(Value: TControl);

function CanAssign: Boolean;
var
I: Integer;
begin
Result := not ((Value is TcxCustomSplitter) or (Value is TSplitter));
{<FIX>}
if Result and (Parent = nil) then
Exit;
{</FIX>}
if Result then
...

dxmdaset.pas // fix sorting
...
function TdxCustomMemData.InternalCompareValues(const ABuffer1, ABuffer2: Pointer;
AMemField: TdxMemField; AIsCaseInsensitive: Boolean; ACount: Integer = -1): Integer;

function CompareStrings: Integer;
const
AIgnoreCaseFlag: array [Boolean] of Cardinal = ({<FIX>}SORT_STRINGSORT{0}, NORM_IGNORECASE or SORT_STRINGSORT</FIX>);
var
AFlags: Cardinal;
..

Добавлено:
cxCalendar.pas // fix UseDelphiDateTimeFormats
...
procedure TcxCustomDateEdit.PrepareEditValue(
const ADisplayValue: TcxEditValue; out EditValue: TcxEditValue;
AEditFocused: Boolean);
var
ATempValue: TDateTime;
begin
try
ActiveProperties.InternalPrepareEditValue(ADisplayValue, EditValue);
finally
if not VarIsNull(EditValue) then
begin
if not VarIsNullDate(EditValue) and
(ActiveProperties.Kind = ckDate) and ActiveProperties.SaveTime then
begin
ATempValue := Int(EditValue) + cxSign(EditValue) * FSavedTime;
{<FIX>}
if cxFormatController.UseDelphiDateTimeFormats and (VarType(EditValue) = varDate) then
EditValue := VarAsType(ATempValue, varDate)
else
{</FIX>}
EditValue := ATempValue; // restore varDate type
end;
...
cxContainer.pas // fix SetFocus
...
procedure TcxCustomPopupWindow.Popup(AFocusedControl: TWinControl);
...
procedure ShowPopupWindow;
...
if FFocusedControl = nil then
SetFocus
else {<FIX>} if FFocusedControl.CanFocus then {</FIX>}
FFocusedControl.SetFocus;
SetWindowPos(Handle, GetPopupWindowShowingFlags, 0, 0, 0, 0,
SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
...
cxCurrencyEdit.pas // fix IsDisplayValueValid
function TcxCustomCurrencyEditProperties.IsDisplayValueValid(
var DisplayValue: TcxEditValue; AEditFocused: Boolean): Boolean;
var
C, AIsOnGetTextAssigned: Boolean;
D: Double;
S: string;
begin
Result := not AEditFocused or
(InternalGetEditFormat(C, AIsOnGetTextAssigned) <> '') or
AIsOnGetTextAssigned;
if not Result then
begin
S := Trim(VarToStr(DisplayValue));
Result := {<FIX>}(Nullable and (S='')) or{</FIX>} StrToFloatEx(S, D);
if Result then
DisplayValue := S;
end;
end;

procedure TcxCustomCurrencyEditProperties.ValidateDisplayValue(
var ADisplayValue: TcxEditValue; var AErrorText: TCaption;
var AError: Boolean; AEdit: TcxCustomEdit);
var
AValue: Double;
begin
{<FIX>}
if Nullable and (TrimLeft(VarToStr(ADisplayValue)) = '') then
AError := False
else
{</FIX>}
AError := not StrToFloatEx(VarToStr(ADisplayValue), AValue);
inherited ValidateDisplayValue(ADisplayValue, AErrorText, AError, AEdit);
end;

cxDB.pas // fix SetFieldValue
procedure SetFieldValue(AField: TField; const AValue: Variant);
begin
{<FIX>}
case VarType(AValue) of
varEmpty, varNull:
AField.Clear;
varDouble:
if (AField is TDateTimeField) then
TDateTimeField(AField).Value := AValue // bug in Delphi
else
AField.Value := AValue;
else
AField.Value := AValue;
end;
{</FIX>}
end;
...

cxGridCustomView.pas // fix AV DrawText
...
procedure TcxCustomGridCellPainter.DrawText;
var
R: TRect;
begin
with Canvas, ViewInfo do
if TextForPainting <> '' then
begin
R := TextAreaBounds; // can call font change
{<FIX>}if Params.Font <> nil then{</FIX>}
Font := Params.Font;
...
function TcxCustomGridCellViewInfo.CalculateTextWidth(AAngle: Integer = 0): Integer;
var
R: TRect;
begin
CalculateParams;
R := Rect(0, 0, cxMaxRectSize, cxMaxRectSize);
{<FIX>}if Params.Font <> nil then{</FIX>}
Canvas.Font := Params.Font;
...
function TcxCustomGridCellViewInfo.CalculateTextHeight(AForPainting: Boolean;
AAngle: Integer = 0): Integer;
var
R: TRect;
begin
CalculateParams;
R := TextAreaBounds;
{<FIX>}if Params.Font <> nil then{</FIX>}
Canvas.Font := Params.Font;



Добавлено:
ps: VadimLou но проблему с группировкой это не решает
Автор: WSWCORP
Дата сообщения: 10.12.2015 08:31
Приветствую, уважаемые... Вопрос возможно глупый и уже обсуждался, но все-же... Проблема такая. Есть cxGrid, есть группировка по одному полю. Как сделать так, чтобы при развернутой группе фокус проскакивал строку группы, а при свернутой - нет. Может кто подскажет?
Автор: marser
Дата сообщения: 10.12.2015 12:08
WSWCORP

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

Обработать событие CanFocusRecord

Код: procedure <Form>.<cxCridTableView>CanFocusRecord(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; var AAllow: Boolean);
begin
if ARecord is TcxGridGroupRow then
AAllow := not TcxGridGroupRow(ARecord).Expanded;
end;
Автор: d3adb33f
Дата сообщения: 10.12.2015 12:21
sonopydnaef
А вы эти фиксы отослали владельцам ?
Автор: WSWCORP
Дата сообщения: 10.12.2015 13:07
marser
Спасибище огромное!!! Самое то, что надо было!!!
Автор: sonopydnaef
Дата сообщения: 11.12.2015 15:13
d3adb33f
Если бы купил, то так и сделал бы, а так - пусть сами тут читают
Автор: Zioma
Дата сообщения: 12.12.2015 13:23
А как в TcxGridViewRepository програмно создать TcxGridDBTableView, а в нем колонки ?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211

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


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