Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary значение по индексу / 25 сообщений из 31, страница 1 из 2
08.05.2019, 14:09
    #39811308
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Имеем 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
08.05.2019, 14:21
    #39811318
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Только перебором.

Если надо словарь с индексацией - можешь попробовать мой:
http://rgreat.ru/tmp/Delphi/Indexes.pas
...
Рейтинг: 0 / 0
08.05.2019, 14:29
    #39811329
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Кошмар :(
...
Рейтинг: 0 / 0
08.05.2019, 15:17
    #39811380
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
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
08.05.2019, 15:18
    #39811384
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Ладно, если данных не много будет, например, записей 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
08.05.2019, 15:20
    #39811387
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Valery_B, да пробовал так перед созданием темы, ругается компилитор: Class does not have a default property
...
Рейтинг: 0 / 0
08.05.2019, 15:45
    #39811415
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
X11,

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



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

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

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

В Rapid.Generics у словарей есть свойство List
...
Рейтинг: 0 / 0
08.05.2019, 17:45
    #39811474
pvv.pas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
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
09.05.2019, 10:40
    #39811637
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Да, вы все, наверное, правы. У меня дизайн кода не очень. Надо пересмотреть.
...
Рейтинг: 0 / 0
09.05.2019, 11:00
    #39811638
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Идея в том, что нужно "нарисовать" клавиатуру для Телеграм. Есть ранее созданный список из 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
09.05.2019, 14:17
    #39811674
shonli95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
Тебе не надо ничего искать, тебе надо всего лишь вывести базу. А не построить базу на основе других данных.

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

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

Код: 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
09.05.2019, 15:43
    #39811701
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
даже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю

Код: 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
09.05.2019, 18:06
    #39811720
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
X11,

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

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

А кнопка не может сообщить какой у ней ID?
"Чужая душа потемки"(с), но надо как-то попроще решать проблему, без "модных" фишек.
...
Рейтинг: 0 / 0
09.05.2019, 19:16
    #39811734
DesWind
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
TDictionary значение по индексу
X11,
автордаже вот так надо, иначе если количество кнопок не кратно трём, то не все данные будут показаны пользователю
Так не надо, есть замечательные операторы:
Код: pascal
1.
 div mod
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TDictionary значение по индексу / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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