Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Combobox и где хранить ключи к выбранным значениям / 25 сообщений из 38, страница 1 из 2
23.07.2020, 17:52
    #39983268
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
Коллеги, у меня такой вопрос. Натолкните на мысль.

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

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

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

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

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

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

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

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

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

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

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

Для начала ему бы определиться, нафига он вообще хочет их получить.
...
Рейтинг: 0 / 0
23.07.2020, 18:51
    #39983297
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
Dimitry Sibiryakov
_Vasilisk_Он из словаря заносит уникальные Values
А, засада. Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".так пущай два васи в комбобоксе будут.
а кто из них вася№1, а кто вася№2 - какая разница...
...
Рейтинг: 0 / 0
23.07.2020, 20:09
    #39983335
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
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
23.07.2020, 20:44
    #39983343
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
wsnet
Задача связать два комбобокса

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

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

Лучше всего ни в какой. Это совершенно лишняя операция.
...
Рейтинг: 0 / 0
23.07.2020, 21:12
    #39983354
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
softwarer, хочу поработать с ними, то есть основной вопрос, как мне заполнить комбо уникальными именами ? Я так понимаю это будет приуроченный к комбо и TDictionary<String, TArray<String>>?
Если так то ключом будет Вася? А значением массив ID работ? Так ?
...
Рейтинг: 0 / 0
23.07.2020, 23:00
    #39983381
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
Код: 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
23.07.2020, 23:19
    #39983386
Combobox и где хранить ключи к выбранным значениям
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
23.07.2020, 23:20
    #39983387
Combobox и где хранить ключи к выбранным значениям
rgreat,

По памяти бьёшь... По памяти...
...
Рейтинг: 0 / 0
23.07.2020, 23:30
    #39983388
Combobox и где хранить ключи к выбранным значениям
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
24.07.2020, 01:24
    #39983407
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Combobox и где хранить ключи к выбранным значениям
ВсеРазумный,

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

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

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


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

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

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

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


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

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

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

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

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

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


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

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


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

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

rgreat


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


Это уже детали,которые настраиваются в TDictionary перед выводом.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Combobox и где хранить ключи к выбранным значениям / 25 сообщений из 38, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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