dbf_usr Posted November 28, 2021 Share Posted November 28, 2021 UniComboBox1.items - при выборе какого-то пункта списка можно определить какой выбран по названию или по индексу (номер в списке). Вопрос: можно ли каждому пункту списка присвоить не изменяемый индекс/номер, который бы не менялся при изменении места в списке? Ели можно то как это сделать? Quote Link to comment Share on other sites More sharing options...
x11 Posted November 30, 2021 Share Posted November 30, 2021 ну я давал здесь несколько примеров, как работать со свойством Objects http://forums.unigui.com/index.php?/topic/17909-unicolorcombobox/page/2/&tab=comments#comment-99611 Если кратко, используем свойства AddObject для наполнения и Objects для получения Quote Link to comment Share on other sites More sharing options...
x11 Posted November 30, 2021 Share Posted November 30, 2021 Еще пример с 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; Quote Link to comment Share on other sites More sharing options...
dbf_usr Posted December 1, 2021 Author Share Posted December 1, 2021 21 hours ago, x11 said: Если в БД хранить. то ComboBox вообще не нужен. Тогда DBLookupCombobox прямо из таблицы все достанет сам и курсор поставит на нужную запись из которой можно вычитать ID Вопрос в том как обойтись без БД, как можно конкретной строке присвоить статичный номер или код, что бы он не менялся если добавится строка сверху. Quote Link to comment Share on other sites More sharing options...
x11 Posted December 3, 2021 Share Posted December 3, 2021 On 12/1/2021 at 11:09 AM, dbf_usr said: DBLookupCombobox Согласен. Но если данных много в списке, и списков несколько, то лучше использовать функционал RemoteQuery. А у RemoteQuery нет ID. Т.е. если в списке попадется два одинаковых названия, то как узнать, какие именно выбрал пользователь? Без ID нет уникальности. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.