Подтвердить что ты не робот

Какова цель свойства "Tag" компонентов Delphi VCL?

Существует ли какая-либо конкретная цель для свойства Tag для компонентов Delphi VCL? У меня есть несколько примеров использования Googled в качестве, например, свойства "color" или использования значения в качестве адреса указателя, но "хорошая практика" его использует или считается "плохой практикой", поскольку она связывает программная логика для пользовательского интерфейса?

4b9b3361

Ответ 1

Свойство "tag" существует как "контейнер для груза" для всего, что вы можете с ним делать.

То, что он часто использовал, - это обработчики событий, когда у вас много похожих компонентов, совместно использующих один обработчик событий. Обработчик события может найти своего вызывающего абонента, а затем запросить его значение тега, чтобы получить дополнительную информацию о том, на что он должен действовать.

EDIT:

Пример: приложение калькулятора может пометить числовые кнопки соответствующими номерами... глупый и неполный пример, но вы получите эту идею. Обработчик события мог бы затем вытащить номер, чтобы добавить в дисплей и аккумулятор прямо из тега, вместо того, чтобы идти, выяснить, какая кнопка предназначена для выполнения.

Ответ 2

Это место, где можно добавить часть информации к любому компоненту, даже если у вас нет источника для этого компонента. Его следует использовать осторожно, потому что вы можете использовать его только для одной цели для каждого компонента. По этой причине Библиотеки никогда не должны ее использовать.

Ответ 3

У меня есть некоторые фундаментальные проблемы с свойством Tag. Ну не совсем это свойство, потому что оно работает по назначению.

В целом я считаю использование универсальных/общих/многоцелевых переменных "плохой практикой". Они могут быть полезны во время отладки, но очень вредны в критической среде производства/миссии. Они уменьшают читаемость и понятность кода, потому что никто не знает, что такое атрибут или свойство Tag. Конечно, вы знаете, почему вы используете эту переменную. Но рано или поздно вы забудете (я знаю, что вы это сделаете), и полагаться на это значение делает что-то более сложное. Вот почему мы должны правильно указывать каждую переменную и свойство, чтобы помочь нам понять, что делает код.

Использование свойства Tag - это всего лишь обходной путь/сокращение, чтобы избежать реализации понятного и хорошо написанного кода. Это ПРАКТИКА, и это вызывает привыкание. В следующий раз, когда вам нужно сохранить новое целочисленное значение, связанное с компонентом, вы будете использовать свойство Tag, не считая другого способа сохранить нужные значения. И сохранение указателя в свойстве Tag - это ужасная идея: вы должны указывать это значение каждый раз, когда вы отлаживаете указатели.

Скажите мне: сколько раз вы оказались в ситуации, когда вы хотели сохранить новое значение в свойстве Tag, но вы поняли, что это свойство уже используется для другой цели (если бы существовал только "Tag2", свойство в каждом компоненте...).

Ответ 4

Как говорили другие, это место, где можно что-то положить. Обычно это пригодится при связывании двух объектов с помощью ссылки на объект или указателя. Тег имеет идеальный размер, чтобы удерживать указатель, поэтому, если вам нужно, например, сохранить объект, привязанный к элементу в списке, это становится довольно простым.

Ответ 5

Также он может использоваться для группировки, например, вы хотите получить доступ ко всем компонентам с определенным значением тега независимо от типа компонента.

Ответ 6

Это здорово! Халява. Я все время использую его для хранения дополнительной информации, связанной с объектом.

Часто я сохраняю указатель на связанную структуру данных или иногда целое число, которое может быть индексом в какой-либо другой массив.

Вы можете использовать его в качестве счетчика для времени доступа к объекту или что-то еще.

Единственным недостатком является то, что ваша программа использует много памяти, и у вас есть миллионы объектов, эти 4 байта для каждого тега складываются, особенно если вы не используете его. В этом случае для наиболее распространенного типа объекта вы можете создать свою собственную версию без тега.

Ответ 7

У вас есть две кнопки в вашей форме, на одной из которых вы устанавливаете тег = 1, а другой - тег = 2. Теперь вы назначаете то же событие OnClick на обе кнопки и записываете код как это:

procedure TForm28.Button1Click(Sender: TObject);
begin
  case (Sender as TButton).Tag of
   1: Caption := 'you pressed button 1';
   2: Caption := 'you pressed button 2';
  end;
end;

или более компактный:

procedure TForm28.Button1Click(Sender: TObject);
begin
  Caption := 'you pressed button ' + IntToStr((Sender as TButton).Tag);
end;

В основном, тег позволит вам определить, какой элемент управления запустил событие. Подумайте, есть ли у вас форма с динамически создаваемыми кнопками... список с пользователями из базы данных, а на каждой записи вы нажимаете кнопку "Удалить пользователя". В этой ситуации вы не можете создать событие для каждой кнопки, вы создадите одно событие, которое будет назначено всем кнопкам... и вы можете поместить в тег идентификатор пользователя, например. Таким образом, когда вы реализуете событие для обработки всех кнопок, вы будете знать, какой пользователь удалить.

Ответ 8

Я использую теги все время. вот несколько примеров:

простой пример: у вас есть записная книжка (например, pagecontroll без вкладок) поэтому вы можете определить кнопки в качестве вкладок и написать

NoteBook.ActivePage := TButton(Sender).Tag;

Более сложный образец; целое число может содержать 16 побитовых боллеров; Затем я могу проверить отправителей до 16 условий, чтобы решить, как продолжить ценовое обозначение

If (BitCheck (Bit2,TButton(sender).tag=True) And BitCheck(bit12,TButton(Sender).Tag=False) Then
Begin
end;

If (BitCheck (Bit9,TButton(sender).tag=True) Or BitCheck(bit14,TButton(Sender).Tag=True) Then
Begin
end;

Вы получаете идею