Jump to content

UniComboBox вопрос по использованию


dbf_usr

Recommended Posts

UniComboBox1.items - при выборе какого-то пункта списка можно определить какой выбран по названию или по индексу (номер в списке).

Вопрос: можно ли каждому пункту списка присвоить не изменяемый индекс/номер, который бы не менялся при изменении места в списке?

Ели можно то как это сделать?

Link to comment
Share on other sites

ну я давал здесь несколько примеров, как работать со свойством Objects

 

http://forums.unigui.com/index.php?/topic/17909-unicolorcombobox/page/2/&tab=comments#comment-99611

 

Если кратко, используем свойства AddObject для наполнения и Objects для получения

Link to comment
Share on other sites

Еще пример с RemoteQuery

в событии OnRemoteQueryEx()

procedure TfmmEditObjectParent.comboStreetsRemoteQueryEx(Sender: TComponent; const QueryString: string; Result: TStrings);
begin
  comboOnRemoteQuery3(Sender as TUniCustomDBLookupComboBox, 'STREETS', QueryString, Result);
end;

procedure comboOnRemoteQuery3(combo: TUniCustomDBLookupComboBox; const sTable, QueryString: string; var Result: TStrings);
Var
 n: integer;
 q: TUniQuery;
begin
  q := combo.ListSource.DataSet as TUniQuery;

  q.Close;
// выбрать из справочника нужные данные
  q.SQL.Text := 'SELECT ID, NAME FROM ' + sTable + ' WHERE UPPER(NAME) CONTAINING(UPPER(:NAME)) AND DELETED IS DISTINCT FROM 1 ORDER BY NAME';

  if (QueryString.Length <= 2) and (QueryString <> '*') then// если пользователь ввел меньше 2 символов, но не звездочку, то поиск не начинать
    exit;

  if (QueryString = '*') or (QueryString = '[null]') then // если пользователь ввел звездочку или нажал на кнопку раскратия выпадающего списка - значит нужно выбрать из базы всеп значения
    q.Params[0].AsString := ''
  else
    q.Params[0].AsString := QueryString;// искомое название, что ввел пользователь

  q.Open;

  if q.RecordCount = 0 then
  begin
    Result.Add(constEmptyRes);// если в базе нет походящих записей, показать ему "данных нет"
    exit;
  end;

  n := 0;
  q.First;
  while not q.Eof do
  begin
    Result.AddObject(q.Fields[1].AsString, Pointer(q.Fields[0].AsInteger));// добавляем в выпадающий список имена и ID
    q.Next;
    inc(n);
    if N > 100 then Break;// макс. 100 строк
  end;

end;

 

 

В событии OnGetKeyValueEx()

procedure TfmmEditObjectParent.comboStreetsGetKeyValueEx(const Sender: TComponent; const Value: string; var KeyValue: Variant);
var
 lcb: TUniCustomDBLookupComboBox;
begin
  lcb := Sender as TUniCustomDBLookupComboBox;
  if (lcb.Items.Count = 0) or (lcb.ItemIndex = -1) then exit;

  lcb.Tag := integer(lcb.Items.Objects[lcb.ItemIndex]);// что выбрал польлователь - записываем в TAG id из базы
  if lcb.Tag > 0 then
    lcb.KeyValue := lcb.Tag;// выбираем нужную запись по ID
end;

 

 

 

 

 

Link to comment
Share on other sites

21 hours ago, x11 said:

 

Если в БД хранить. то ComboBox вообще не нужен. Тогда DBLookupCombobox прямо из таблицы все достанет сам и курсор поставит на нужную запись из которой можно вычитать ID

Вопрос в том как обойтись без БД, как можно конкретной строке присвоить статичный номер или код, что бы он не менялся если добавится строка сверху. 

Link to comment
Share on other sites

On 12/1/2021 at 11:09 AM, dbf_usr said:

DBLookupCombobox

Согласен. Но если данных много в списке, и списков несколько, то лучше использовать функционал RemoteQuery. А у RemoteQuery нет ID. Т.е. если в списке попадется два одинаковых названия, то как узнать, какие именно выбрал пользователь? Без ID нет уникальности.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...