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

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Имеем 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

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

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

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

Откуда: Москва
Сообщений: 1945
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
Сообщений: 13038
Ладно, если данных не много будет, например, записей 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
Сообщений: 13038
Valery_B, да пробовал так перед созданием темы, ругается компилитор: Class does not have a default property
8 май 19, 15:20    [21881201]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
DesWind
Member

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

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


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

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

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

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

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

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

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

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

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

Откуда: Оттуда
Сообщений: 26
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
Сообщений: 13038
Да, вы все, наверное, правы. У меня дизайн кода не очень. Надо пересмотреть.
9 май 19, 10:40    [21881656]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Идея в том, что нужно "нарисовать" клавиатуру для Телеграм. Есть ранее созданный список из 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

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

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

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

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


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

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

      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
Сообщений: 13038
даже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю

      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

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

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

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

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

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


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

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

Так не надо, есть замечательные операторы:
 div mod
9 май 19, 19:16    [21881855]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1742
X11
у телеграм кнопок есть только Caption и Data


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

Откуда: Kharkiv, Ukraine
Сообщений: 13038
DesWind
А кнопка не может сообщить какой у ней ID?


Может. В свойство Data можно напихать 4000 символов.
10 май 19, 09:07    [21882019]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Aleksandr Sharahov, не понял... в Телеграме можно свои кнопки/клавиатуры создавать?
Согласно документации есть только 2 вида клавиатур: над строй ввода сообщения и под строкой.
10 май 19, 09:08    [21882022]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Aleksandr Sharahov
Member

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

причем тут телеграмма?
10 май 19, 12:38    [21882091]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13038
Aleksandr Sharahov, при том, что я пишу бота для сервиса Телеграм.
10 май 19, 13:06    [21882102]     Ответить | Цитировать Сообщить модератору
 Re: TDictionary значение по индексу  [new]
Aleksandr Sharahov
Member

Откуда: Москва
Сообщений: 1742
X11
Aleksandr Sharahov, при том, что я пишу бота для сервиса Телеграм.


И что это меняет?

Способы добавить левую информацию к нужному классу тебе показали:
1. создать класс-наследник с доп. полями
2. упаковать данные в единственном поле имеющегося класса
3. использовать ссылку из объекта на внешние доп. данные
4. использовать ссылку из внешних доп. данных на объект

Используй то, что умеешь, но не городи огород.
Будет проще, когда все данные помещены в одну структуру, например, массив записей.
10 май 19, 13:25    [21882109]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить