powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary значение по индексу
31 сообщений из 31, показаны все 2 страниц
TDictionary значение по индексу
    #39811308
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеем Dictionary: TDictionary<integer, String>;

Наполняем
Код: pascal
1.
2.
3.
4.
Dictionary.Add(14, 'Тип 14');
Dictionary.Add(1173, 'Тип 1173');
Dictionary.Add(50, 'Тип 50');
Dictionary.Add(25, 'Тип 25');



Я не могу найти и понять,Ю как получить значения, находящиеся в индексе 2, т.е. 1173 и 'Тип 1173'.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811318
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только перебором.

Если надо словарь с индексацией - можешь попробовать мой:
http://rgreat.ru/tmp/Delphi/Indexes.pas
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811329
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кошмар :(
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811380
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
var
 s:string;
begin
 s:= Dictionary.Values[1];
end;

var
 Key:integer;
 s:string;
begin
 Key:= Dictionary.Keys[1];
 s:=Dictonary[Key];
end;
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811384
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, если данных не много будет, например, записей 20-100, то на скорость сильно не повлияет, надеюсь.
Тогда можно хелпер прикрутить?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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;
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811387
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B, да пробовал так перед созданием темы, ругается компилитор: Class does not have a default property
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811415
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

Перебор как-то так
Код: pascal
1.
2.
3.
4.
5.
  for Element in Dict do
  begin
      x:=Element.Key;
      y:=Element.Value
  end;
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811425
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну нужно обязательно где-то как-то узнать индекс
if i = Index then
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811426
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11
Код: pascal
1.
class function TDectionaryHelper<T>.ValueByIndex(var Arr: TArray<T>; Index: integer): T;



не, что-то не то я накуролесил
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811431
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Valery_B, да пробовал так перед созданием темы, ругается компилитор: Class does not have a default property
Да, это я ступил.
Странно что цикле foreach работает.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811435
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

Ну добавь еще Inc(i). Но надо учесть, что смысла у индекса для словаря особого смысла нет.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811436
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

fundamentals умеет обращаться к элементам своих контейнеров по индексу.
А нафига тебе это? Напиши собственный класс, который умеет то, что ты хочешь. При добавлении добавляй ссылку на значение в массив, вот и все.Ну, с учетом твоих требований, конечно, добавь логики касаемо удаления.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811455
Голландец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

В Rapid.Generics у словарей есть свойство List
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811474
pvv.pas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11Имеем Dictionary: TDictionary<integer, String>;

Наполняем
Код: pascal
1.
2.
3.
4.
Dictionary.Add(14, 'Тип 14');
Dictionary.Add(1173, 'Тип 1173');
Dictionary.Add(50, 'Тип 50');
Dictionary.Add(25, 'Тип 25');



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

А с чего ты взял что под индексом 2 должен быть 'Тип 1173'. Определись что тебе нужно - словарь или список, а может и то и другое? Зачем забивать гвозди микроскопом
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811637
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, вы все, наверное, правы. У меня дизайн кода не очень. Надо пересмотреть.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811638
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идея в том, что нужно "нарисовать" клавиатуру для Телеграм. Есть ранее созданный список из ID + имён (из таблицы), данные вставлены в TDictionary<integer, String>.

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

Код: 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.
    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

...
...
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811674
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тебе не надо ничего искать, тебе надо всего лишь вывести базу. А не построить базу на основе других данных.

Другие данные могут быть не полными. Тогда легче на основе других данных построить с моральными ценностями главных данных внешнюю среду. То есть создать список, который будет в себя включать возможно имя буквы(код буквы), отображаемую картинку юникода (не все телефоны поддерживают юникод, и часто приходится делать свой). Порядок расположения в главном выводе, с возможностью автоматизирования и так далее
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811675
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проще говоря, строй клаву с помощью Dictionary используя DicTypes по необходимости
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811682
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pvv.pasА с чего ты взял что под индексом 2 должен быть 'Тип 1173'.

а мне пофиг, что там - что есть, то и покажу пользователю на экране
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811699
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, переделал так, получилось по три кнопки в каждом ряду

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
      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
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811701
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
      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
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811720
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

TDictionary тут вообще не нужен.
Достаточно обычного массива записей или доп.полей у кнопок.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811723
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у телеграм кнопок есть только Caption и Data
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811729
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,

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

А кнопка не может сообщить какой у ней ID?
"Чужая душа потемки"(с), но надо как-то попроще решать проблему, без "модных" фишек.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811734
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
X11,
автордаже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю
Так не надо, есть замечательные операторы:
Код: pascal
1.
 div mod
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811750
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11у телеграм кнопок есть только Caption и Data

и возможность создать наследника с любыми нужными свойствами
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811800
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DesWindА кнопка не может сообщить какой у ней ID?

Может. В свойство Data можно напихать 4000 символов.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811803
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, не понял... в Телеграме можно свои кнопки/клавиатуры создавать?
Согласно документации есть только 2 вида клавиатур: над строй ввода сообщения и под строкой.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811845
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11,

причем тут телеграмма?
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811852
Фотография X11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, при том, что я пишу бота для сервиса Телеграм.
...
Рейтинг: 0 / 0
TDictionary значение по индексу
    #39811855
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X11Aleksandr Sharahov, при том, что я пишу бота для сервиса Телеграм.

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

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

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


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