powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Combobox и где хранить ключи к выбранным значениям
38 сообщений из 38, показаны все 2 страниц
Combobox и где хранить ключи к выбранным значениям
    #39983268
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, у меня такой вопрос. Натолкните на мысль.

Как реализовать следующее с combobox.

Имеется словарь DictRowPeopleId: TDictionary<Integer, String>, содержащий следующие
пары ключ (PeopleID уникальный номер) - значение (имя человека):
1 - Вася
2 - Вася
3 - Петя
4 - Олег

В Combobox мне нужно показать уникальные имена людей, то есть
Вася
Петя
Олег

Вопрос в следующем, при выборе элемента из combobox мне нужно получать и ключ его, как это сделать скажем для Васи, в котором несколько ключей?
1 - Вася
2 - Вася.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983269
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetкак это сделать скажем для Васи, в котором несколько ключей?

Заносить в TComboBox.Items.Objects значение TPair из Values.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983273
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Как реализовать следующее с combobox

Отделить мух от котлет. Собственно, если разобрать задачу шире - откуда "имеется этот словарь", как и зачем обрабатывается и т. п. - наверняка выяснится, что вообще глобально стоит менять подход. Но если ограничиться локальными рамками, то нужно сделать представление, адекватное задаче (например TDictionary<String, TArray<String>>), а затем подключать комбобокс к этому представлению.

Dimitry Sibiryakov
Заносить в TComboBox.Items.Objects значение TPair из Values.

Вангую следующий вопрос автора: а если Вась трое?
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983276
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

Заносить в TComboBox.Items.Objects объекты TList<Integer>

И не забывать их удалять
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983285
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerВангую следующий вопрос автора: а если Вась трое?

А не пофиг? У каждого же будет свой собственный TPair.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983286
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
А не пофиг?
Он из словаря заносит уникальные Values
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983290
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Он из словаря заносит уникальные Values
А, засада. Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983296
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".

Для начала ему бы определиться, нафига он вообще хочет их получить.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983297
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
_Vasilisk_Он из словаря заносит уникальные Values
А, засада. Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".так пущай два васи в комбобоксе будут.
а кто из них вася№1, а кто вася№2 - какая разница...
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983335
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

_Vasilisk_Он из словаря заносит уникальные Values
А, засада. Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".


Коллеги, пишу подробнее, подтолкните на мысль.

Задача связать два комбобокса.

1. Комбобокс 1 - Работы для людей - формируем из словаря:
ID работы - Имя человека,
1 - Вася
2 - Петя
2- Вася
3 -Вася

2. 1. Комбобокс 2 - Степень сложности работы - формируем из словаря:
ID работы - Степень сложности,
1 - Легкая
1 - Сложная
2 - Легкая
2 - Очень сложная
3 - Легкая

3. В Комбобокс 1 должны быть уникальные значения (Вася, Петя)
4. Выбрали в комбобокс 1 Васю, в комбобокс 2 показали степени сложности работы Васи: Легкая, Сложная!!!(связь по ключу - ID работы)
5. ID работы (значения 1,2,3) присутствуют и в комбобокс 1 и в комбобокс2.

Натолкните на мысль что и где хранить и как это прикрутить к Комбобоксам.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983343
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Задача связать два комбобокса

Вообще-то нет. Задача, судя по формулировке - выбрать комбинацию "человек - работа - сложность работы" из числа допустимых. Решать её можно кучей разных способов. В первую очередь, стоит выбрать визуальное решение. Два комбобокса... не единственный вариант и вряд ли самый хороший. Да и не очень понятно, почему их два, а не три. Далее, нужно выбрать техническое решение, а оно зависит в первую очередь от источника данных. Наиболее адекватный вариант - связать датасеты через мастер-деталь и использовать db-контролы, но если хочется геморроиться, то можно брать данные и инициализировать комбобоксы руками. Ну то есть в каком-то виде есть у тебя таблица

РаботаИсполнительСложность1ВасяЛёгкая1ВасяСложная2ПетяЛёгкая2ПетяСложная2ВасяЛёгкая2ВасяСложная3ВасяЛёгкая
Соотвественно, проходишь по ней и добавляешь в первый комбобокс всех исполнителей, которых там ещё нет. При выборе в первом комбобоксе - проходишь и добавляешь во второй комбобокс все сложности, у которых есть такой исполнитель. Итп.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983351
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, именно так, вопрос в какой дженерик мне загружать данные лучше? И какова структура будет генериков?
Выручайте!
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983352
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
softwarer, именно так, вопрос в какой дженерик мне загружать данные лучше?

Лучше всего ни в какой. Это совершенно лишняя операция.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983354
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarer, хочу поработать с ними, то есть основной вопрос, как мне заполнить комбо уникальными именами ? Я так понимаю это будет приуроченный к комбо и TDictionary<String, TArray<String>>?
Если так то ключом будет Вася? А значением массив ID работ? Так ?
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983381
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, 
  Indexes; // <-- Волшебные генерики тут :)

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    List : THashTable<string,integer>;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Готовим словарь
  List:=THashTable<string,integer>.Create;
  List.UniqueKeys:=False;
  List.Add('Вася',1);
  List.Add('Вася',2);
  List.Add('Петя',3);
  List.Add('Олег',4);

  // Заполняем лист с уникальными именами
  var Tmp: TArrayEx<string>;
  for var i:=List.Low to List.High do begin
    Tmp.AddUnique(List.IdByNum[i])
  end;

  for var i:=Tmp.Low to Tmp.High do begin
    ListBox1.Items.Add(Tmp[i]);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  List.Free;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  // Вытаскиваем нужные элементы из словаря
  var Res:=List.NumsById(Listbox1.Items[Listbox1.ItemIndex]);

  // Заполняем лист с ID-шниками
  ListBox2.Clear;
  for var i:=0 to High(Res) do begin
    ListBox2.Items.Add(List[Res[i]].ToString);
  end;
end;


http://www.rgreat.ru/tmp/Delphi/Indexes.pas
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983386
wsnet,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ComboBox1.Items[ComboBox1.ItemIndex] + #13 + Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).ToString)
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Item: TPair<Integer, String>;
begin
  List := TDictionary<Integer, String>.Create;

  // Test base
  for var I := 0 to 10000 do
    List.add(I, 'Name_' + I.ToString);

  // ...
  for Item in List do
    ComboBox1.AddItem(Item.Value, TObject(Item.Key));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  List.Free;
end;




Или создать ещё один массив(От 0 до X), который будет хранить информацию о индексах второго массива.

Таким образом, вы загружаете первый массив с именами в ComboBox и при выборе элемента, получаете индекс элемента, и обращаетесь к созданному массиву, что бы получить заветный идентификатор ключа первого массива.


Но всё это выглядит убого на фоне медленного компонента в целом (FMX кстати хуже ещё..)
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983387
rgreat,

По памяти бьёшь... По памяти...
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983388
rgreat,

Вот с доп массивом, лаконично и просто

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  System.Generics.Collections;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    List: TDictionary<Integer, String>;
    IndexArr: array of Integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  idx: Integer;
begin
  if ComboBox1.ItemIndex <> -1 then
  begin
    idx := IndexArr[ComboBox1.ItemIndex];
    ShowMessage(idx.ToString + #13 + ComboBox1.Items[ComboBox1.ItemIndex]);
  end
  else
    ShowMessage('Выбрать элемент! Я есть Элемент.')
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  Item: TPair<Integer, String>;
  i: Integer;
begin
  List := TDictionary<Integer, String>.Create;

  // Test base
  for var v := 0 to 10000 do
    List.add(v, 'Name_' + v.ToString);

  SetLength(IndexArr, List.Count);

  // ...
  i := 0;
  for Item in List do
  begin
    ComboBox1.Items.add(Item.Value);
    IndexArr[i] := Item.Key;
    inc(i);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  SetLength(IndexArr, 0);
  List.Free;
end;

end.

...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983407
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Что за фигню ты написал? У тебя там даже дубликатов имен нет.

Почитай хоть условия задачи.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983408
rgreat,

Эмм.. Я бы сейчас кое что сказал, но боюсь твоя нежная душа и модераторы не оценят правду.


Ты строишь проблемы на пустом месте. В моём коде, в двух вариантах - совершенно без разницы, есть ли дубликаты. Так как всё завязано на индексах.

Не важно сколько будет "Вася", "Вася", "Вася", "Вася",

Он всё равно выдаст индекс каждого Васи. А не определённого. Без всего хлама что ты написал.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983409
rgreat,
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983411
rgreat,

Как по мне, ТС получает список Аля Фрэнд Листа ВК, где идёт ID : Name, ... И вот ему надо вывести список имён в список, и при выборе определённого имени, взять этот самый ID и сделать с ним что - то.


Но ТС совершенно не нужна информация об всех ID Васей - в одном луксе
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983412
Настал День Васи, но вот не задача, в фирме работают двое Васей. И в списке двое Васильевичей.

ВБухгалтерии открывает программу и видит в списке 2 имени (Пусть у них не будет фамилий, ибо в задачи их не было)

БухГалХтер выбирает первый попавшийся, так как автор программы не предусмотрел вывод из списка уникального ID который бы позволил отделить ненужного Васелька. И на мальдивы поедет Васелёк который пинал своей треножкой в столе дырку, пока Василий вкалывал.

И вот сказочки конец
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983413
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
rgreat,

Эмм.. Я бы сейчас кое что сказал, но боюсь твоя нежная душа и модераторы не оценят правду.

Открой нам ПРАВДУ .


Он всё равно выдаст индекс каждого Васи. Не выведет.

Твой код даже всех "васей" в один item для combobox-а не группирует.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983414
rgreat
Не выведет.


Каким это образом он не выведет, если индекс списка указывает на индекс Уникального ID который привязан к Имени.

Сэр, прошу, объяснитесь.

rgreat


Твой код даже всех "васей" в один item для combobox-а не группирует.


Это уже детали,которые настраиваются в TDictionary перед выводом.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983415
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Но ТС совершенно не нужна информация об всех ID Васей - в одном луксе

Напиши это ТС, а то он не в курсе.
wsnet
В Combobox мне нужно показать уникальные имена людей, то есть
Вася
Петя
Олег
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983417
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
Сэр, прошу, объяснитесь.

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

И свой код напишешь так что бы он этим условиям соответствовал.
Что бы были повторяющиеся имена а не:

Код: pascal
1.
2.
  for var I := 0 to 10000 do
    List.add(I, 'Name_' + I.ToString);
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983418
rgreat,

Эмм.. Ты реально не понял, что автор имел введу что хотел видеть в списке Имена, которые можно выбрать и получить их ID. А не определённый для всех?

Мне жаль, что ты воспринял информацию не так.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983419
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Для задачи как понял ее ты никакие словари, массивы и генерики вообще не нужны.

Combobox1.Items.AddObject(PeopleName,pointer(PeopleID));
+
Showmessage(Integer(Combobox1.Items.Objects[Combobox1.ItemIndex]).ToString);


И все.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983421
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
автор имел введу что хотел видеть в списке Имена, которые можно выбрать и получить их ID.

Ага. И одному имени могут соответствовать несколько человек и, соответственно, несколько Id-шников.
wsnet
Вопрос в следующем, при выборе элемента из combobox мне нужно получать и ключ его, как это сделать скажем для Васи, в котором несколько ключей?
1 - Вася
2 - Вася.

Надо получить ID всех Васей. Внезапно.
И с базовым TDictionary это можно сделать только методом перебора, если вложенные структуры не городить.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983501
rgreat,

wsnet

при выборе элемента (В одном числе) - из combobox мне нужно получать и ключ (В одном числе). его (В одном числе), как это сделать скажем для Васи, в котором несколько ключей?
1 - Вася
2 - Вася.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983524
энди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
идею я думаю уловите

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
function Tdm.LoadFromQuery(d: TDataset; f_id, f_name: Variant; cbx: TStrings): boolean;
begin
  try

  try
    cbx.Clear;
    d.First;
    while not d.Eof do
    begin
       if VarIsNull(f_id) then
       cbx.AddObject(d.FieldByName(f_name).AsString, nil)
       else
       cbx.AddObject(d.FieldByName(f_name).AsString, Pointer(d.FieldByName(f_id).AsInteger));
       d.Next;
    end;
    Result := true;
  except
    Result := false;
  end;

  finally

  end;
end;
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983526
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лютый пензец...
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983893
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий
лютый
Мне понравился тип названий полей Variant.
Наверно, они могут тянуться из базы, так чтобы при NULL функция четко отрабатывала)
Похоже, это кусок кода из какой-то ERP, и блок finally просто секретный и очищен перед вставкой на форум.
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983909
YuRock,

Обычный говнокод.

Такой же как и сортировать перед каждой загрузкой в combobox данные, как это предлагает rgreat. А не 1 раз при создание базы - храня её отсортированную..
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983912
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
YuRock,

Обычный говнокод.

Такой же как и сортировать перед каждой загрузкой в combobox данные, как это предлагает rgreat. А не 1 раз при создание базы - храня её отсортированную..
А что такое отсортированная база?
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983916
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный,

Где ты у меня сортировку увидел?
...
Рейтинг: 0 / 0
Combobox и где хранить ключи к выбранным значениям
    #39983930
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть проблема в том, что ComboBox неправильно отрисовывает выбранный элемент ?
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Combobox и где хранить ключи к выбранным значениям
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]