2016-01-02 7 views
2

Я использую общие процедуры для всех виртуальных Treeviews (TVirtualStringTree), поэтому у меня есть только 1 код, чтобы сохранить, как для OnClick я использую Common_VST_OnClick, который все элементы управления VST установил:Как определить, какой элемент управления является отправителем?

procedure TForm1.Common_VST_OnClick(Sender: TObject); 

и выполнить код, на основании которого VST называет это по процедуре щелчка, я понял, что я использую много разных способов, чтобы распознать, управляющих является Sender:

if Sender = VST1 then 

if Sender.Name = VST1.Name then  

if TVirtualStringTree(Sender) = VST1 then 

if TVirtualStringTree(Sender).Name = VST1.Name then 

if TVirtualStringTree(Sender).Name = 'VST1' then 

Последнее, вероятно, худшим, как зовут жёстко, так что я пытаюсь использовать только 1 тип идентификации , во всех процедурах.

Каков наилучший способ определить, какой элемент управления является отправителем?

+3

Ваш первый вариант правильный - 'если Sender = VST1' - это самый правильный способ сделать это. Однако, если вы пишете предположительно общий код, который зависит от идентификации конкретного компонента, вы, вероятно, делаете что-то неправильно. –

+0

@KenWhite Это только для того, чтобы определить, какой VST называется процедурой, а не какие-либо другие типы компонентов. –

+1

Да, я это понимаю, и я дал вам информацию в первом предложении. Вы по-прежнему ограничиваете использование своей * общей функции * компонентами определенного имени: 'if Sender = VST1 then ... else if Sender = VST2 then ...' и т. Д. Если у вас есть код, специфичный для управления, используйте отдельный обработчик событий для каждого элемента управления. Если код должен действовать на любом элементе управления VST, вам не нужно знать, какой он по имени. –

ответ

3

Вы должны предпочесть тест, который использует идентификатор объекта. То есть, первый тест на ваш вопрос:

if Sender = VST1 then 

Ссылка на объект, такой как Sender или VST1 это адрес объекта. Если два таких адреса равны, то ссылки указывают на один и тот же объект. И наоборот.

Испытания, основанные на контрольном имени, могут работать, но являются хрупкими. Возможно, что несколько элементов управления имеют одно и то же имя. Можно изменить имя элемента управления, но не обновлять все использование имени в программе.

Что касается варианта литья типа

if TVirtualStringTree(Sender) = VST1 then 

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

+0

Отлично, около 200 LOC изменено и работает как ожидалось! Код намного чище. –

+0

@DavidHeffernan жаль возродить это, но лучше попросить здесь, чем создать новый пост. Если я сделаю, если Sender = Button1, то могу ли я сделать ButtonTag = (Sender as TButton) .tag и использовать этот тег, чтобы удалить объект из списка? поэтому ObjectList.delete (ButtonTag-1) у меня будет -1, потому что мои теги начинаются с 1. –

+0

@miketorrettinni знаете ли вы? –

 Смежные вопросы

  • Нет связанных вопросов^_^