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

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Имеем Dictionary: TDictionary<integer, String>;

Наполняем
Dictionary.Add(14, 'Тип 14');
Dictionary.Add(1173, 'Тип 1173');
Dictionary.Add(50, 'Тип 50');
Dictionary.Add(25, 'Тип 25');


Я не могу найти и понять,Ю как получить значения, находящиеся в индексе 2, т.е. 1173 и 'Тип 1173'.
8 май 19, 14:09    [21881050]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
rgreat
Member

Откуда:
Сообщений: 4931
Только перебором.

Если надо словарь с индексацией - можешь попробовать мой:
http://rgreat.ru/tmp/Delphi/Indexes.pas
8 май 19, 14:21    [21881075]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Кошмар :(
8 май 19, 14:29    [21881095]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1911
X11,

var
 s:string;
begin
 s:= Dictionary.Values[1];
end;

var
 Key:integer;
 s:string;
begin
 Key:= Dictionary.Keys[1];
 s:=Dictonary[Key];
end;
8 май 19, 15:17    [21881190]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Ладно, если данных не много будет, например, записей 20-100, то на скорость сильно не повлияет, надеюсь.
Тогда можно хелпер прикрутить?

Type
  TDectionaryHelper<T> = class
    class procedure Append(var Arr: TArray<T>; Value: T);
    class function ValueByIndex(var Arr: TArray<T>; Index: integer): T;
  end;

...
...
...


class function TDectionaryHelper<T>.ValueByIndex(var Arr: TArray<T>; Index: integer): T;
Var
 i: integer;
begin
  for I := Low(arr) to High(Arr) do
    if i = Index then
    begin
      result := arr[i];
      exit;
    end;
end;
8 май 19, 15:18    [21881197]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Valery_B, да пробовал так перед созданием темы, ругается компилитор: Class does not have a default property
8 май 19, 15:20    [21881201]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
DesWind
Member

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

Перебор как-то так
  for Element in Dict do
  begin
      x:=Element.Key;
      y:=Element.Value
  end;
8 май 19, 15:45    [21881250]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
ну нужно обязательно где-то как-то узнать индекс
if i = Index then
8 май 19, 15:57    [21881270]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
X11
class function TDectionaryHelper<T>.ValueByIndex(var Arr: TArray<T>; Index: integer): T;


не, что-то не то я накуролесил
8 май 19, 15:57    [21881272]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1911
X11
Valery_B, да пробовал так перед созданием темы, ругается компилитор: Class does not have a default property

Да, это я ступил.
Странно что цикле foreach работает.
8 май 19, 16:06    [21881285]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
DesWind
Member

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

Ну добавь еще Inc(i). Но надо учесть, что смысла у индекса для словаря особого смысла нет.
8 май 19, 16:10    [21881297]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
ёёёёё
Member

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

fundamentals умеет обращаться к элементам своих контейнеров по индексу.
А нафига тебе это? Напиши собственный класс, который умеет то, что ты хочешь. При добавлении добавляй ссылку на значение в массив, вот и все.Ну, с учетом твоих требований, конечно, добавь логики касаемо удаления.
8 май 19, 16:11    [21881301]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Голландец
Member

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

В Rapid.Generics у словарей есть свойство List
8 май 19, 16:42    [21881331]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
pvv.pas
Member

Откуда: Оттуда
Сообщений: 24
X11
Имеем Dictionary: TDictionary<integer, String>;

Наполняем
Dictionary.Add(14, 'Тип 14');
Dictionary.Add(1173, 'Тип 1173');
Dictionary.Add(50, 'Тип 50');
Dictionary.Add(25, 'Тип 25');


Я не могу найти и понять,Ю как получить значения, находящиеся в индексе 2, т.е. 1173 и 'Тип 1173'.


А с чего ты взял что под индексом 2 должен быть 'Тип 1173'. Определись что тебе нужно - словарь или список, а может и то и другое? Зачем забивать гвозди микроскопом
8 май 19, 17:45    [21881370]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Да, вы все, наверное, правы. У меня дизайн кода не очень. Надо пересмотреть.
9 май 19, 10:40    [21881656]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
Идея в том, что нужно "нарисовать" клавиатуру для Телеграм. Есть ранее созданный список из ID + имён (из таблицы), данные вставлены в TDictionary<integer, String>.

Клавиатура создаётся в цикле. Это просто матрица из кнопок N на M. Каждой кнопке нужно присвоить своё имя (Caption) и ID, чтобы потом получить ID кнопки, которую нажал пользователь. Т.к. ID из базы, то идут не по порядку и не с 0, конечно же.

    Var
 DicTypes: TDictionary<integer, String>;
 Kb: TtgInlineKeyboardMarkup;
 InlineKeyboardButton: TtgInlineKeyboardButton;
 AKeyboardRow: TArray<TtgInlineKeyboardButton>;
 idxRow, idxBtn, iSelectedBtn, idxButton: Integer;
 RowQ: Integer;// кол-во строк (рядов с кнопками)
 BtnQ: Integer;// кол-во кнопок в одном ряде
...
begin
...
...
   DicTypes := GetTypes(.....);//получить данные из БД, например, 10 записей

    if Assigned(DicTypes) then
    begin
      RowQ := DicTypes.Count div 3;// рядов с кнопками
      BtnQ := DicTypes.Count - RowQ; // кнопок в одном ряду
      idxButton := 0;

      Kb := TtgInlineKeyboardMarkup.Create;

// создаем матрицу из кнопок
      for idxRow := 0 to pred(RowQ) do//цикл по рядам
      begin
        SetLength(AKeyboardRow, 0);// обнуляем кол-во кнопок в строке

        for idxBtn := 0 to pred(BtnQ) do// цикл по кнопкам в одном ряду
        begin
          
           где-то здесь нужно вытащить данные из DicTypes по idxButton, чтобы присвоить имя и код очередной кнопке



          //создаем кнопку
          InlineKeyboardButton := TtgInlineKeyboardButton.Create(имя , код id);
          //добавляем кнопку в ряд с помощью хелпера
          TAppender<TtgInlineKeyboardButton>.Append(AKeyboardRow, InlineKeyboardButton);
          Inc(idxButton);
        end;
        //добавляем ряд с кнопками в клавиатуру
        Kb.AddRow(AKeyboardRow);
      end;


    end;// if

...
...
9 май 19, 11:00    [21881659]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
shonli95
Member

Откуда:
Сообщений: 61
Тебе не надо ничего искать, тебе надо всего лишь вывести базу. А не построить базу на основе других данных.

Другие данные могут быть не полными. Тогда легче на основе других данных построить с моральными ценностями главных данных внешнюю среду. То есть создать список, который будет в себя включать возможно имя буквы(код буквы), отображаемую картинку юникода (не все телефоны поддерживают юникод, и часто приходится делать свой). Порядок расположения в главном выводе, с возможностью автоматизирования и так далее
9 май 19, 14:17    [21881726]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
shonli95
Member

Откуда:
Сообщений: 61
Проще говоря, строй клаву с помощью Dictionary используя DicTypes по необходимости
9 май 19, 14:18    [21881727]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
pvv.pas
А с чего ты взял что под индексом 2 должен быть 'Тип 1173'.


а мне пофиг, что там - что есть, то и покажу пользователю на экране
9 май 19, 14:57    [21881743]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
В общем, переделал так, получилось по три кнопки в каждом ряду

      SetLength(AKeyboardRow, 0);// обнуляем кол-во кнопок в строке
      idxButton := 0;
      for PairType in DicTypes do
      begin
        InlineKeyboardButton := TtgInlineKeyboardButton.Create(PairType.Value, PairType.Key.ToString);
        TArrayHelper<TtgInlineKeyboardButton>.Append(AKeyboardRow, InlineKeyboardButton);
        Inc(idxButton);

        if idxButton >= 3 then
        begin
          Kb.AddRow(AKeyboardRow);
          idxButton := 0;
          SetLength(AKeyboardRow, 0);// обнуляем кол-во кнопок в строке
        end;

      end;// for
9 май 19, 15:33    [21881768]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
даже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю

      for PairType in DicTypes do
      begin
        InlineKeyboardButton := TtgInlineKeyboardButton.Create(PairType.Value, PairType.Key.ToString);
        TArrayHelper<TtgInlineKeyboardButton>.Append(AKeyboardRow, InlineKeyboardButton);
        Inc(idxButton);

        if idxButton >= 3 then
        begin
          Kb.AddRow(AKeyboardRow);
          idxButton := 0;
          SetLength(AKeyboardRow, 0);// обнуляем кол-во кнопок в строке
          Continue;
        end;
      end;// for

      if Length(AKeyboardRow) > 0 then
        Kb.AddRow(AKeyboardRow);

      SetLength(AKeyboardRow, 0);// обнуляем кол-во кнопок в строке
    end;// if
9 май 19, 15:43    [21881771]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1739
X11,

TDictionary тут вообще не нужен.
Достаточно обычного массива записей или доп.полей у кнопок.
9 май 19, 18:06    [21881831]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 12968
у телеграм кнопок есть только Caption и Data
9 май 19, 18:16    [21881836]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
DesWind
Member

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

автор
чтобы потом получить ID кнопки, которую нажал пользователь.


А кнопка не может сообщить какой у ней ID?
"Чужая душа потемки"(с), но надо как-то попроще решать проблему, без "модных" фишек.
9 май 19, 18:51    [21881845]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
DesWind
Member

Откуда:
Сообщений: 105
X11,
автор
даже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю

Так не надо, есть замечательные операторы:
 div mod
9 май 19, 19:16    [21881855]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить