Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Combobox и где хранить ключи к выбранным значениям  [new]
wsnet
Member

Откуда:
Сообщений: 996
Коллеги, у меня такой вопрос. Натолкните на мысль.

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

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

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

Вопрос в следующем, при выборе элемента из combobox мне нужно получать и ключ его, как это сделать скажем для Васи, в котором несколько ключей?
1 - Вася
2 - Вася.
23 июл 20, 17:52    [22172601]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50849

wsnet
как это сделать скажем для Васи, в котором несколько ключей?

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

Posted via ActualForum NNTP Server 1.5

23 июл 20, 17:58    [22172605]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
wsnet
Как реализовать следующее с combobox

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

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

Вангую следующий вопрос автора: а если Вась трое?

Сообщение было отредактировано: 23 июл 20, 18:13
23 июл 20, 18:15    [22172613]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
wsnet,

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

И не забывать их удалять
23 июл 20, 18:20    [22172619]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50849

softwarer
Вангую следующий вопрос автора: а если Вась трое?

А не пофиг? У каждого же будет свой собственный TPair.

Posted via ActualForum NNTP Server 1.5

23 июл 20, 18:32    [22172631]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11984
Dimitry Sibiryakov
А не пофиг?
Он из словаря заносит уникальные Values
23 июл 20, 18:33    [22172633]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50849

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

Posted via ActualForum NNTP Server 1.5

23 июл 20, 18:42    [22172638]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
Dimitry Sibiryakov
Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".

Для начала ему бы определиться, нафига он вообще хочет их получить.
23 июл 20, 18:51    [22172646]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31323
Dimitry Sibiryakov
_Vasilisk_
Он из словаря заносит уникальные Values
А, засада. Тогда действительно надо определиться какой именно из ключей он хочет
получить "при выборе элемента из combobox".
так пущай два васи в комбобоксе будут.
а кто из них вася№1, а кто вася№2 - какая разница...

Сообщение было отредактировано: 23 июл 20, 20:38
23 июл 20, 18:51    [22172647]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
wsnet
Member

Откуда:
Сообщений: 996
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.

Натолкните на мысль что и где хранить и как это прикрутить к Комбобоксам.

Сообщение было отредактировано: 23 июл 20, 20:10
23 июл 20, 20:09    [22172720]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
wsnet
Задача связать два комбобокса

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

РаботаИсполнительСложность
1ВасяЛёгкая
1ВасяСложная
2ПетяЛёгкая
2ПетяСложная
2ВасяЛёгкая
2ВасяСложная
3ВасяЛёгкая

Соотвественно, проходишь по ней и добавляешь в первый комбобокс всех исполнителей, которых там ещё нет. При выборе в первом комбобоксе - проходишь и добавляешь во второй комбобокс все сложности, у которых есть такой исполнитель. Итп.

Сообщение было отредактировано: 23 июл 20, 20:42
23 июл 20, 20:44    [22172737]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
wsnet
Member

Откуда:
Сообщений: 996
softwarer, именно так, вопрос в какой дженерик мне загружать данные лучше? И какова структура будет генериков?
Выручайте!
23 июл 20, 21:05    [22172747]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 62846
Блог
wsnet
softwarer, именно так, вопрос в какой дженерик мне загружать данные лучше?

Лучше всего ни в какой. Это совершенно лишняя операция.
23 июл 20, 21:09    [22172748]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
wsnet
Member

Откуда:
Сообщений: 996
softwarer, хочу поработать с ними, то есть основной вопрос, как мне заполнить комбо уникальными именами ? Я так понимаю это будет приуроченный к комбо и TDictionary<String, TArray<String>>?
Если так то ключом будет Вася? А значением массив ID работ? Так ?
23 июл 20, 21:12    [22172750]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
rgreat
Member

Откуда:
Сообщений: 6068
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

К сообщению приложен файл. Размер - 2Kb


Сообщение было отредактировано: 23 июл 20, 23:04
23 июл 20, 23:00    [22172785]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
wsnet,

+
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 кстати хуже ещё..)
23 июл 20, 23:19    [22172795]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
rgreat,

По памяти бьёшь... По памяти...
23 июл 20, 23:20    [22172796]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
rgreat,

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

+
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.
23 июл 20, 23:30    [22172799]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
rgreat
Member

Откуда:
Сообщений: 6068
ВсеРазумный,

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

Почитай хоть условия задачи.

Сообщение было отредактировано: 24 июл 20, 01:26
24 июл 20, 01:24    [22172831]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
rgreat,

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


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

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

Он всё равно выдаст индекс каждого Васи. А не определённого. Без всего хлама что ты написал.
24 июл 20, 01:42    [22172833]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
rgreat,

К сообщению приложен файл. Размер - 46Kb
24 июл 20, 01:45    [22172834]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
rgreat,

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


Но ТС совершенно не нужна информация об всех ID Васей - в одном луксе
24 июл 20, 01:54    [22172836]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
Настал День Васи, но вот не задача, в фирме работают двое Васей. И в списке двое Васильевичей.

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

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

И вот сказочки конец
24 июл 20, 02:12    [22172839]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
rgreat
Member

Откуда:
Сообщений: 6068
ВсеРазумный
rgreat,

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

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


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

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

Сообщение было отредактировано: 24 июл 20, 02:12
24 июл 20, 02:13    [22172840]     Ответить | Цитировать Сообщить модератору
 Re: Combobox и где хранить ключи к выбранным значениям  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 408
rgreat
Не выведет.


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

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

rgreat


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


Это уже детали,которые настраиваются в TDictionary перед выводом.

Сообщение было отредактировано: 24 июл 20, 02:13
24 июл 20, 02:15    [22172841]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить