Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Для новичков > Изменить компонент, зная лишь его имя |
Автор: serezhka1986 22.1.2013, 11:24 |
Добрый день! У меня на форме есть несколько компонентов Shape. Допустим я знаю name одного из них (в виде простой строки). Как мне изменить (высоту, ширину) или удалить компонент, name которого у меня есть в строке, по нажатию на button? |
Автор: Rennigth 22.1.2013, 12:03 |
Перебором находишь свой компонент. Сравнение по классу и св-ву Name. Примеров навалом, поиск по ComponentCount, Components. Добавлено через 7 минут и 13 секунд serezhka1986, Вот только зачем? Никогда не понимал эти шаманства по поиску компонентов по имени, тегу и т.д. |
Автор: 586 22.1.2013, 12:27 | ||
|
Автор: kami 22.1.2013, 13:32 |
Иногда бывает нужно - при динамическом создании/удалении нескольких контролов одного класса (в ходе взаимодействия с пользователем), когда кроме них на контейнере есть еще "стационарные" контролы. |
Автор: Данкинг 22.1.2013, 14:13 | ||
А что непонятного? Есть 100 контролов, и каждому нужно изменить какое-то свойство. Какие ещё варианты решения этой задачи? |
Автор: Rennigth 22.1.2013, 14:36 | ||
Если это контролы кинутые в дизайне на форму, то мы всегда и без всякого имени можем к ним обратиться. Если созданные динамически, то ссылки надо сохранять(TList, TObjectList, хоть массивы или просто переменные нужного типа). Вообще имхо считаю что св-во name нужно только в дизайнтайме чтоб видеть кого мы виделили ну и т.д. и при отладке иногда. |
Автор: serezhka1986 22.1.2013, 15:14 |
586, Спасибо! Лови + |
Автор: Данкинг 22.1.2013, 15:39 | ||
Т.е. вместо цикла до ComponentCount и вышеуказанного кода мы будем писать Shape1.Width:=100; Shape2.Width:=100; Shape100.Width:=100; ? |
Автор: Rennigth 22.1.2013, 16:08 | ||||||
Если изменить надо трем, то да. Если 100, и изменить св-во всем на одинаковое, то конечно легче пройтись по ComponentCount/Components. Ну а если компонентов 100, а надо менять например:
а, еще хуже
То надо задуматься, все ли я делаю правильно... может стоило отдельный компонент например создать или еще что-то, а не накидывать на форму 100 шейпов... p.s. это все конечно все мое мнение, и как я уже говорил ситуации бывают разные... |
Автор: serezhka1986 23.1.2013, 18:06 | ||
У меня ситуация как раз такая. У меня ActiveX на Delphi размещен на форме 1С, и я с 1С-ки динамически создаю компонент, сохраняя в 1С его name, потом из 1С-ки меняю свойство нужного компонента, зная его имя. Но не могу понять почему так получается, что когда с 1С передаю имя (например, Button2), и хочу его указать в создаваемом компоненте, то в Delphi ошибка. Что-то типа: Произошла исключительная ситуация ''Button2 Я так понял появились какие-то кавычки в имени? Почему такое может быть? |
Автор: Akella 23.1.2013, 20:43 |
ошибка в 17ой строке |
Автор: serezhka1986 24.1.2013, 10:31 | ||||
Ладно, привожу пример: Допустим есть процедура, где я создаю динамически Panel
Из 1С передаются, например, такие параметры:
Произошла исключительная ситуация (MyActiveX.MyForm): ''Panel1 Если же напишу так:
... то панель нормально создается и имя остается Panel1. Пробовал trim(NewPanelName) вывести в Edit, так там все нормально, отображается текст Panel1. В чем может быть проблема? |
Автор: serezhka1986 24.1.2013, 10:47 | ||
Сейчас попробовал загнать текст в Edit1 и взять его как имя панели, и все нормально отработало:
Что за прикол, не пойму... ![]() |
Автор: bems 24.1.2013, 12:31 |
возможно компонент с именем panel1 уже существует, и это приводит к эксцепшну |
Автор: serezhka1986 24.1.2013, 13:18 | ||
Нет еще компонента с таким именем. Я же пишу, если взять с переменной panel1, тогда ошибка, если прописать в коде Panel.Name := 'Panel1' - тогда все отлично. |
Автор: bems 24.1.2013, 13:52 |
уверен что в переменной нет ничего лишнего? например символов конца строки |
Автор: Akella 25.1.2013, 17:09 |
Вот спасибо за одолжение НАМ! ![]() |
Автор: serezhka1986 25.1.2013, 17:13 |
Та не одолжение это ![]() |
Автор: Akella 25.1.2013, 17:15 | ||
Сделай нам ещё одно одолжение, если тебе не сложно ![]() Пришли полный ТЕКСТ ошибки. Добавлено через 24 секунды
Да, ошибки у нас в головах ![]() Добавлено через 3 минуты и 11 секунд а ещё лучше, если параллельно выложите картинку ![]() |
Автор: serezhka1986 25.1.2013, 17:43 |
Ошибка отображается в 1С, поскольку это ActiveX-элемент на 1С-овской форме. Полный текст ошибки: Произошла исключительная ситуация (MyActiveX.MyForm): ''Panel1 Я его уже писал в http://forum.vingrad.ru/index.php?showtopic=361330&view=findpost&p=2544081 |
Автор: gesper 25.1.2013, 22:42 | ||
Это ты опечатался и два раза одинарную кавычку поставил перед Panel1? Имена кроме Panel1 пробовал, например "mfxPanel1" ? |
Автор: Чучмек 26.1.2013, 00:38 | ||||
serezhka1986, Посмотри, что на самом деле содержит NewPanelName. Скорей всего
Ставлю сто против одного, что если
ошибки не будет. |