Информация

Последние записи

Теги


Блоги


Записи из всех блогов с тегом: combobox


Как получить видимое значение в строке типа LookupComboBox в TcxVerticalGrid?

Есть cxVerticalGrid со строкой (Properties.EditProperties) типа LookupComboBox. Как получить не значение ключевого поля, а именно то, значение, которое видит пользователь?

S := TcxLookupComboBoxProperties(cxEditorRow1.Properties.EditProperties).GetDisplayText(cxEditorRow1.Properties.Value);
автор: X11 добавлено: 14 ноя 14 просмотры: 2843, комментарии: 0



TcxComboboxProperties ItemIndex

Если TcxCombobox встроен, например, в строку (row) вертикальной сетки (TcxVerticalGrid), то есть проблемы с установкой значения, т.к. свойство ItemIndex в этом случае ReadOnly.

Можно попробовать установить значение через свойство Properties.Value, но это ничего не даст, в Combobox`е не будет выбрано нужное значение.

Есть простой выход - использовать ImageCombobox. Т.е. у строки в свойстве EditProperties нужно выбрать ImageComboBox. Тогда значение списка можно устанавливать через Properties.Value.

Начало проблемы здесь >> https://www.sql.ru/forum/1060510/cxcomboboxproperties-i-perechislyaemoe-svoystvo
автор: X11 добавлено: 21 ноя 13 просмотры: 3149, комментарии: 0



DevExpress - получить список скинов программно

Как получить список скинов (DevExpress skins) и загрузить их (скины) в Combobox


uses LookAndFeelPainters;
...

procedure GetSkins(comboSkins: TcxCombobox);
Var
 PaintersManager : TcxCustomLookAndFeelPainter;
 i: integer;
begin
  //загружаем список скинов
  comboSkins.Properties.Items.Clear;
  comboSkins.Properties.Items.Add('');//пустую строку тоже нужно добавить, чтобы пользоватtль мог отменять выбор скина

  for i := 0 to Pred(cxLookAndFeelPaintersManager.Count) do
    comboSkins.Properties.Items.Add(cxLookAndFeelPaintersManager.Items[i].LookAndFeelName);

end;



Как получить список скинов (DevExpress skins) и загрузить их (скины) в TcxComboboxProperties
https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=542538&msg=12170122



uses LookAndFeelPainters;
...

Var
 PaintersManager : TcxCustomLookAndFeelPainter;
 i: integer;
begin
  //загружаем список скинов
  TcxComboBoxProperties(comboSkins.Properties).Items.Clear;
  TcxComboBoxProperties(comboSkins.Properties).Items.Add('');//пустую строку тоже нужно добавить, чтобы пользоватtль мог отменять выбор скина

  for i := 0 to Pred( cxLookAndFeelPaintersManager.Count ) do
    TcxComboBoxProperties(comboSkins.Properties).Items.Add(cxLookAndFeelPaintersManager.Items[i].LookAndFeelName);
автор: X11 добавлено: 01 ноя 13 просмотры: 3140, комментарии: 5



Выбор значения в cxExtLookupComboBox по щелчку (одинарный клик)

Есть TcxExtLookupComboBox, к которому привязан cxGrid из репозитория.
У cxExtLookupComboBox есть свойство FocusPopup типа boolean.
cxExtLookupComboBox1.Properties.FocusPopup := False;


Это свойство отвечает за то, что именно будет сфокусировано при выпадании списка: cxExtLookupComboBox или встроенный cxGridDBTableView? И от этого зависит, как будет происходить выбор нужной строки с помощью мышки: одним кликом или двумя. Если FocusPopup включен, то будет сфокусирован грид и выбор можно произвести двойным щелчком или клавишей Enter. Если FocusPopup отключен (False), то выбор можно произвести одним щелчком мышки.
автор: X11 добавлено: 20 июн 13 просмотры: 1633, комментарии: 0



Обращение к нужной колонке TcxLookupСombobox TcxDBLookupComboBox

Обращение к нужной колонке TcxLookupcombobox/TcxDBLookupComboBox
Получить данные не из 1 первой колонки TcxLookupcombobox/TcxDBLookupComboBox

with <TcxLookupCombobox>.Properties.Grid.DataController do
  caption := Values[FocusedRecordIndex, <ColumnIndex>];



cxDBLookupComboBox1.Properties.DataController.Values[cxDBLookupComboBox1.ItemIndex, Index колонки]);
автор: X11 добавлено: 19 июл 12 просмотры: 2073, комментарии: 0



Разные вопросы по DevExpress, cxGrid

Как узнать сфокусированную строку в гриде cxGridTableView?

AFocusedRecord := <Your>cxGridTableView.Controller.FocusedRecord


****

Как узнать в событии нажатия на кнопку, на какой колонке был клик?
Сохраняйте TcxGridRecordCellHitTest(Ht).Item из обработчика выше и анализируйте его в <YourcxGridDBTableView><YourField>PropertiesButtonClick


****

Как получить cxGrid по cxCustomGridTableView?
function cxGrid_FromTableView(TableView: TcxCustomGridTableView): TcxGrid; 
begin 
  if Assigned(TableView) and (TableView.Control is TcxGrid) then 
    Result := TcxGrid(TableView.Control) 
  else 
    Result := nil; 
end; 


или
<TcxGridDBTableView>.GetParentComponent



****

Как повесить TcxGridPopupMenu только на определенную колонку?
Следует обрабатывать событие OnPopup вашего TcxGridPopupMenu.
procedure <YourForm>.<YourcxGridPopupMenu>Popup(ASenderMenu: TComponent; AHitTest: TcxCustomGridHitTest; X, Y: Integer; var
    AllowPopup: Boolean);
begin
  AllowPopup := (AHitTest is TcxGridColumnHeaderHitTest ) and
      (TcxGridDBColumn(TcxGridColumnHeaderHitTest(AHitTest).Column).DataBinding.FieldName = '<YourColumnName>');
end;



Как вывести номер по порядку в столбце грида?
procedure TBaseDocWithRows.View1NumGetDisplayText(Sender: TcxCustomGridTableItem; ARecord: TcxCustomGridRecord; var AText: string); var
  Row: Integer;
begin
    inherited;
//    if ShowNumCol then
//    begin
        Row := Sender.GridView.DataController.GetRowInfo(Sender.GridView.DataController.GetRowIndexByRecordIndex(ARecord.RecordIndex, False)).DataRowIndex + 1; 
        AText := IntToStr(Row);
или // Row := Sender.GridView.DataController.GetRowIndexByRecordIndex(ARecord.RecordIndex, False)+1;
//    end;

//ARecord.RecordIndex
end;



****

Как после Locate установить (сфокусировать) найденную запись в центре грида?
По умолчанию, после Locate внутренние механизмы cxGrid отображают нужную запись в нижней половине представления.
procedure TForm1.Button1Click(Sender: TObject);
var
 Cnt: integer;
begin
  Cnt := cxGrid1DBTableView1.ViewInfo.RecordsViewInfo.VisibleCount;
  Table1.Locate('CustNo',2156,[]);
  cxGrid1DBTableView1.Controller.TopRecordIndex := cxGrid1DBTableView1.Controller.FocusedRecordIndex - Round((Cnt+1)/2);
end;



****

Как выводить изображение (картинку) в ячейку cxGrid в зависимости от значения поля?
Чтобы вывести в ячейках столбца картинки, надо на событие OnCustomDrawCell повесить код.
Пример.
procedure TForm1.cxGrid1DBTableView1VIP_StatusCustomDrawCell(
Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  VipStatus : string;
begin
  if not Assigned(AViewInfo) then  exit;

  try
    ACanvas.FillRect(AViewInfo.Bounds);
    ACanvas.Brush.Color := clWhite;
    if not VarIsNull(AViewInfo.DisplayValue) then
    begin
      VipStatus := AViewInfo.DisplayValue;
      if VipStatus = 'VIP' then
        ImageList.Draw(ACanvas.Canvas,AViewInfo.Bounds.Left+2,AViewInfo.Bounds.Top+2,0);

      if VipStatus = 'VIP Exec' then
        ImageList.Draw(ACanvas.Canvas,AViewInfo.Bounds.Left+2,AViewInfo.Bounds.Top+2,1);
    end;
  except
    on e:Exception do Sleep(0);
  end;
  ADone := true;// в этой строке не уверен
end;


****

Движение по гриду не зависимо от его сортировки
<View>.DataController.GotoNext



****

Как перерисовать cxGrid?
cxGrid1DBTableView1.LayoutChanged();


****


Как программно добавить столбец в cxGrid?
Добавляем колонку типа cxCheckBox (переключатель)
var 
f: TcxCheckBoxProperties;
 begin
 f:=TcxCheckBoxProperties.Create(self);
 f.NullStyle := nssUnchecked;
 f.ValueChecked:='true';
 f.ValueUnchecked:='false';
 f.ValueGrayed:='gray';
 f.DisplayChecked:='true';
 f.DisplayUnchecked:='false';
 f.DisplayGrayed:='gray';
 cxGrid1TableView1.CreateColumn.PropertiesClassName := 'TcxCheckBoxProperties';
 cxGrid1TableView1.Columns[0].Caption:='какое-то имя столбца';
 cxGrid1TableView1.Columns[0].Width:=150;
 cxGrid1TableView1.Columns[0].Properties := f;
 end;


****

Как показать/открыть редактор ячейки программно?
<TcxGrid1DBTableView>.Site.SetFocus(); //фокус устанавливать обязательно
<TcxGrid1DBTableView>.Controller.EditingController.ShowEdit(<cxGrid1DBColumn>);



****


Как запретить/разрешить редактирование текущей ячейки?
Следует обрабатывать событие <TcxGrid1DBTableView>.Editing, в котором использовать параметр AAllow
procedure cxGrid1TableView1Editing(Sender: TcxCustomGridTableView;
 AItem: TcxCustomGridTableItem; var AAllow: Boolean);
 begin
   AAllow := not ((AItem.Index = 1) and (Sender.Controller.FocusedRecordIndex = 1));
 end;



****


Как узнать RecordIndex выбранной/сфокусированной записи в любой момент
cxGrid1DBTableView1.DataController.FocusedRecordIndex



Как в колонке cxGrid`а вывести сумму с определённым форматом?
Например, если тип данных денежный, то поставь у колонки свойство DataBinding.ValueType := Currency и/или Properties := CurrencyEdit. Добавить на форму ТcxEditRepository в котором создать CurrencyItem и выставить DisplayFormat, равный DecimalPlaces. Затем назначить нужное колонке грида этот только что созданный RepositoryItem.
Или отформатировать DisplayFormat поля DataSeta.

****


Обращение к нужной колонке TcxLookupCombobox
Обратите внимание, что Properties.ListOptions.SyncMode должно иметь значение TRUE
with <TcxLookupCombobox>.Properties.Grid.DataController do
  caption := Values[FocusedRecordIndex, <ColumnIndex>];
автор: X11 добавлено: 13 июл 12 просмотры: 12719, комментарии: 0



Фильтр в cxLookupCombobox

2 варианта



Как сделать фильтрацию в TcxLookupCombobox?


Кроме стандартных для cxLookupCombobox свойств (ListSource, KeyFieldNames, ListFieldNames), нужно установить следующие значения:
<cxLookupCombobox>.Properties.DropDownListStyle  := lsEditList;
<cxLookupCombobox>.Properties.IncrementalFiltering := false;



Далее выполняем разделение строки на слова
// Разбивка строки по словам
procedure SplitDelimitedString(AStrings: TStrings; AText, ADelimiter: string);
var
  p, n: integer;
  Text: PChar;
begin
  Text := PChar(AText);
  AStrings.Clear;
  n := Length(ADelimiter);
  while Assigned(Text) do
  begin
    p := Pos(ADelimiter, Text) - 1;
    if p < 0 then
      Break;
    AStrings.Add(Copy(Text, 1, p));
    Inc(Text, p + n);
  end;
  if Assigned(Text) and (Length(Text) > 0) then
    AStrings.Add(Text);
end;



// Установка фильтра для полей lookup-а, с разбивкой по словам и полям
procedure ApplySearchFilter(Controller: TcxDBDataController; Fields: string; Text: string);
var
  i, j: integer;
  ItemLink: TObject;
  Filter: TcxDataFilterCriteria;
  FL: TcxFilterCriteriaItemList;
  FieldList, TextWords: TStrings;
begin
  TextWords := TStringList.Create;
  FieldList := TStringList.Create;
  try
    Filter := Controller.Filter;
    Filter.BeginUpdate;
    try
      Filter.Active := false;
      Filter.Clear;
      Filter.Options := Filter.Options + [fcoCaseInsensitive];
      Filter.Root.BoolOperatorKind := fboOr;
      SplitDelimitedString(FieldList, Fields, ';');
      SplitDelimitedString(TextWords, Text, ' ');
      for i := 0 to FieldList.Count - 1 do
        if FieldList[i] <> '' then
        begin
          FL := Filter.Root.AddItemList(fboAnd);
          ItemLink := Controller.GetItemByFieldName(FieldList[i]);
          if Assigned(ItemLink) then
            for j := 0 to TextWords.Count - 1 do
              if TextWords[j] <> '' then
                FL.AddItem(ItemLink, foLike, '%' + TextWords[j] + '%', TextWords[j]);
        end;
      Filter.Active := true;
    finally
      Filter.EndUpdate;
    end;
  finally
    TextWords.Free;
    FieldList.Free;
  end;
end;


// вызов
procedure TForm1.cxDBLookupComboBox1PropertiesChange(Sender: TObject);
var
  S: TcxDBLookupComboBox;
begin
  S := TcxDBLookupComboBox(Sender);
  ApplySearchFilter(S.Properties.DataController, S.Properties.ListFieldNames, S.Text);

  // для тестирования
  Label1.Caption := S.Properties.DataController.Filter.FilterText;
end;





Второй вариант
А ещё можно сделать связку cxGridViewRepository (TcxGridDBTableView) + TcxExtLookupCombobox и получить в выпадающем списке полноценную сетку - cxGridDBTableView
автор: X11 добавлено: 13 июл 12 просмотры: 3206, комментарии: 0



TcxCheckComboboxProperties

Описание свойства Properties.EditValueFormat

cvfInteger - создает битовую маску из отмеченных элементов;
cvfCaptions - создает строку с выбранными элементами, разделённые через точку с запятой;
cvfIndices - индексы, старт точка с запятой , разделение запятыми;
cvfStatesString - строка вида 010101 - если на позиции 1 значит элемент выбран;



Допустим, что есть TcxVerticalGrid со строкой типа cxCheckCombobox.
Как наполнить список из базы данных?
Как заполнить TcxCheckComboboxProperties из базы данных

в таблице есть 2 поля: ключ (ID) и название (NAME)

//Этот пример просто заполняет список неотмеченными элементами
//Эту процедуру используем, если пользователь добавляет новую запись
Procedure FillCheckComboBox(cxCheckComboBox: TcxCheckComboBox; tSpr: TpFibDataSet; sFieldName: string = 'NAME');
Var
 CheckComboboxItem: TcxCheckComboboxItem;
begin
 
    with tSpr do begin
      Open;
      First;
      cxCheckComboBox.Properties.Items.BeginUpdate;
      cxCheckComboBox.Properties.Items.Clear;
 
      While not Eof do
        begin
          CheckComboboxItem     := cxCheckComboBox.Properties.Items.AddCheckItem(FBN(sFieldName).AsString);
          CheckComboboxItem.Tag := FBN('ID').AsInteger;
          Next;
        end;
      close;
      cxCheckComboBox.Properties.Items.EndUpdate;
    end;
end;




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

function FeelCheckComboBox(cxCheckComboBox: TcxCheckComboBoxProperties; tSpr: TpFibDataSet; sChecksList: string; sFieldName: string = 'NAME'): string;
Var
 CheckComboboxItem: TcxCheckComboboxItem;
 State : TcxCheckBoxState;
 s1: TStringList;
 i: integer;
begin
  s1 := TStringList.Create;
  try
      s1.CommaText := sChecksList;
      s1.Delimiter := ',';

      with tSpr do
        begin
          Open;
          First;
          FetchAll;
          cxCheckComboBox.Items.BeginUpdate;
          cxCheckComboBox.Items.Clear;

          While not Eof do
            begin
              CheckComboboxItem     := cxCheckComboBox.Items.AddCheckItem(FBN(sFieldName).AsString);
              CheckComboboxItem.Tag := FBN('ID').AsInteger;
              SetLength(CheckStates, Length(CheckStates) + 1);

              if sChecksList <> '' then
                if IdInStringlist(s1, FBN('ID').AsString) then
                  CheckStates[CheckComboboxItem.index] := cbsChecked;

              Next;
            end;
          close;
          result := cxCheckBox.CalculateCheckStatesValue(CheckStates,
                                                         cxCheckComboBox.Items,
                                                         cxCheckComboBox.EditValueFormat);
        end;


      cxCheckComboBox.Items.EndUpdate;
  finally
    freeAndNil(s1);
  end;//try
end;




Получаем список выбранных ID через запятую или другой разделитель, например, 101,12,1024
этот список можно куда-то сохранить, в потом восстановить, см. function FeelCheckComboBox

function GetComboChecks(cxCheckComboBoxProperties: TcxCheckComboBoxProperties; vValues: Variant; sDelim: string = ','): string;
Var
  i: Integer;
  ACheckStates: TcxCheckStates;
begin
  with cxCheckComboBoxProperties do
    begin
      items.BeginUpdate;
      try
 
        CalculateCheckStates(vValues, items, EditValueFormat, ACheckStates);
 
        for I := 0 to items.Count - 1 do
          if ACheckStates[i] = cbsChecked then
            result := IntToStr(items[i].Tag) + sDelim + result;
 
        if result <> '' then //получаем 101,12,1024,
            Delete(result, Length(result), 1);//удаляем последнюю запятую
 
      finally
        items.EndUpdate;
      end;//try
    end;//with
end; 




//этот пример нарыт где-то на просторах тырнета
...
  CheckBox: TcxEditorRow;
...

var
  CheckComboboxItem: TcxCheckComboboxItem;
  i: Integer;
  ACheckBox: TcxCheckComboboxProperties;
  AValue: string;
begin
  ACheckBox := TcxCheckComboboxProperties(CheckBox.Properties.EditProperties);
  ACheckBox.EditValueFormat := cvfStatesString;
  ACheckBox.Items.BeginUpdate;
  ACheckBox.Items.Clear;
  for i := 1 to 5 do
  begin
    CheckComboboxItem := ACheckBox.Items.AddCheckItem('item ' + IntToStr(i));
    CheckComboboxItem.Tag := i;
    AValue := CheckBox.Properties.Value;
    if (i mod 2) <> 0 then
      AValue := AValue + '0'
    else
      AValue := AValue + '1';
    CheckBox.Properties.Value := AValue;
  end;
  ACheckBox.Items.EndUpdate;



Здесь ещё примеры работы с cxCheckComboBox
http://www.devexpress.com/Support/Center/p/B136670.aspx

uses
    cxCheckBox;

procedure TForm1.cxButton1Click(Sender: TObject);
var
  i: Integer;
  AStates: TcxCheckStates;
begin
  with cxCheckComboBox1 do
  begin
    try
      Properties.BeginUpdate;

      Properties.Items.Clear;
      Properties.Items.AddCheckItem('Item 0');
      Properties.Items.AddCheckItem('Item 1');
      Properties.Items.AddCheckItem('Item 2');
      Properties.Items.AddCheckItem('Item 3');
      Properties.Items.AddCheckItem('Item 4');
      Properties.Items.AddCheckItem('Item 5');

      SetLength(AStates, Properties.Items.Count);

      for i:= 0 to Properties.Items.Count-1 do
        AStates[I] := cbsChecked;
      EditValue := CalculateCheckStatesValue(AStates, Properties.Items, Properties.EditValueFormat)
    finally
      Properties.EndUpdate();
    end;
  end;
end;
автор: X11 добавлено: 12 июл 12 просмотры: 5234, комментарии: 0



cxLookupCombobox - Установка фильтра для полей по словам

Установка фильтра для полей lookup-а, с разбивкой по словам и полям

procedure ApplySearchFilter(Controller:  TcxDBDataController; Fields: string; Text: string);
var
  i, j: Integer;
  ItemLink: TObject;
  Filter: TcxDataFilterCriteria;
  FL: TcxFilterCriteriaItemList;
  FieldList, TextWords: TStrings;
begin
  TextWords := TStringList.Create;
  FieldList := TStringList.Create;
  try
    Filter := Controller.Filter;
    Filter.BeginUpdate;
    try
      Filter.Active := false;
      Filter.Clear;
      Filter.Options := Filter.Options + ;
      Filter.Root.BoolOperatorKind := fboOr;
      SplitDelimitedString(FieldList, Fields, ';');
      SplitDelimitedString(TextWords, Text, ' ');
      for i := 0 to FieldList.Count - 1 do
        if FieldList <> '' then
        begin
          FL := Filter.Root.AddItemList(fboAnd);
          ItemLink := Controller.GetItemByFieldName(FieldList);
          if Assigned(ItemLink) then
            for j := 0 to TextWords.Count - 1 do
              if TextWords <> '' then
                FL.AddItem(ItemLink, foLike, '%' + TextWords + '%', TextWords);
        end;
      Filter.Active := true;
    finally
      Filter.EndUpdate;
    end;
  finally
    TextWords.Free;
    FieldList.Free;
  end;
end;



// Разбивка строки по словам
procedure SplitDelimitedString(AStrings: TStrings; AText, ADelimiter: string); var
  p, n: Integer;
  Text: PChar;
begin
  Text := PChar(AText);
  AStrings.Clear;
  n := Length(ADelimiter);
  while Assigned(Text) do
  begin
    p := Pos(ADelimiter, Text) - 1;
    if p < 0 then
      Break;
    AStrings.Add(Copy(Text, 1, p));
    Inc(Text, p + n);
  end;
  if Assigned(Text) and (Length(Text) > 0) then
    AStrings.Add(Text);
end;
автор: X11 добавлено: 12 июл 12 просмотры: 1457, комментарии: 2