Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Изменить компонент, зная лишь его имя 
:(
    Опции темы
serezhka1986
Дата 22.1.2013, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 12.6.2009

Репутация: нет
Всего: 0



Добрый день!
У меня на форме есть несколько компонентов Shape. Допустим я знаю name одного из них (в виде простой строки). Как мне изменить (высоту, ширину) или удалить компонент, name которого у меня есть в строке, по нажатию на button?
--------------------
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть жопой на клавиатуру... 
PM   Вверх
Rennigth
Дата 22.1.2013, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Перебором находишь свой компонент. Сравнение по классу и св-ву Name. Примеров навалом, поиск по ComponentCount,  Components.

Добавлено через 7 минут и 13 секунд
serezhka1986, Вот только зачем? Никогда не понимал эти шаманства по поиску компонентов по имени, тегу и т.д.

Это сообщение отредактировал(а) Rennigth - 22.1.2013, 12:03


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
586
Дата 22.1.2013, 12:27 (ссылка) |  (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Код
procedure TForm1.Button1Click(Sender: TObject);
var
  sh : TShape;
begin
  sh := FindComponent('Shape1') as TShape;
  if sh <> nil then
    sh.Width := 150;
end;

PM   Вверх
kami
Дата 22.1.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Rennigth @  22.1.2013,  12:03 Найти цитируемый пост)
 шаманства по поиску компонентов по имени, тегу и т.д.

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

Это сообщение отредактировал(а) kami - 22.1.2013, 13:34
PM MAIL WWW   Вверх
Rennigth
Дата 22.1.2013, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(kami @  22.1.2013,  13:32 Найти цитируемый пост)
Иногда бывает нужно - при динамическом создании/удалении нескольких контролов одного класса (в ходе взаимодействия с пользователем), когда кроме них на контейнере есть еще "стационарные" контролы.

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

Добавлено через 5 минут и 15 секунд
Вот чес-слово, если мне попадается такое "шаманство" и мне еще копаться в нем, я готов задушить этого шамана.  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Данкинг
Дата 22.1.2013, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Rennigth @  22.1.2013,  13:03 Найти цитируемый пост)
Никогда не понимал эти шаманства по поиску компонентов по имени, тегу и т.д.

А что непонятного? Есть 100 контролов, и каждому нужно изменить какое-то свойство. Какие ещё варианты решения этой задачи?


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Rennigth
Дата 22.1.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Данкинг @  22.1.2013,  14:13 Найти цитируемый пост)
А что непонятного? Есть 100 контролов, и каждому нужно изменить какое-то свойство. Какие ещё варианты решения этой задачи? 

Если это контролы кинутые в дизайне на форму, то мы всегда и без всякого имени можем к ним обратиться. Если созданные динамически, то ссылки надо сохранять(TList, TObjectList, хоть массивы или просто переменные нужного типа). Вообще имхо считаю что св-во name нужно только в дизайнтайме чтоб видеть кого мы виделили ну и т.д. и при отладке иногда.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
serezhka1986
Дата 22.1.2013, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 12.6.2009

Репутация: нет
Всего: 0



586, Спасибо! Лови +
--------------------
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть жопой на клавиатуру... 
PM   Вверх
Данкинг
Дата 22.1.2013, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 11
Всего: 130



Цитата(Rennigth @  22.1.2013,  15:36 Найти цитируемый пост)
Если это контролы кинутые в дизайне на форму, то мы всегда и без всякого имени можем к ним обратиться.

Т.е. вместо цикла до ComponentCount и вышеуказанного кода мы будем писать Shape1.Width:=100; Shape2.Width:=100; Shape100.Width:=100; ?



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Rennigth
Дата 22.1.2013, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 15
Всего: 76



Цитата(Данкинг @  22.1.2013,  15:39 Найти цитируемый пост)
Т.е. вместо цикла до ComponentCount и вышеуказанного кода мы будем писать Shape1.Width:=100; Shape2.Width:=100; Shape100.Width:=100; ?

Если изменить надо трем, то да. Если 100, и изменить св-во всем на одинаковое, то конечно легче пройтись по ComponentCount/Components. Ну а если компонентов 100, а надо менять например:
Цитата

Shape1.Width:=100; Shape2.Width:=100; Shape100.Width:=100

а, еще хуже
Код

Shape1.Width:=55; Shape2.Width:=18; Shape100.Width:=27

То надо задуматься, все ли я делаю правильно... может стоило отдельный компонент например создать или еще что-то, а не накидывать на форму 100 шейпов...

p.s. это все конечно все мое мнение, и как я уже говорил ситуации бывают разные...


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
serezhka1986
Дата 23.1.2013, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 12.6.2009

Репутация: нет
Всего: 0



Цитата(Rennigth @  22.1.2013,  16:08 Найти цитируемый пост)
это все конечно все мое мнение, и как я уже говорил ситуации бывают разные... 

У меня ситуация как раз такая. У меня ActiveX на Delphi размещен на форме 1С, и я с 1С-ки динамически создаю компонент, сохраняя в 1С его name, потом из 1С-ки меняю свойство нужного компонента, зная его имя. Но не могу понять почему так получается, что когда с 1С передаю имя (например, Button2), и хочу его указать в создаваемом компоненте, то в Delphi ошибка. 
Что-то типа: Произошла исключительная ситуация ''Button2
Я так понял появились какие-то кавычки в имени? Почему такое может быть?
--------------------
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть жопой на клавиатуру... 
PM   Вверх
Akella
Дата 23.1.2013, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 8
Всего: 329



ошибка в 17ой строке
PM MAIL   Вверх
serezhka1986
Дата 24.1.2013, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 12.6.2009

Репутация: нет
Всего: 0



Цитата(Akella @  23.1.2013,  20:43 Найти цитируемый пост)
ошибка в 17ой строке

Ладно, привожу пример:
Допустим есть процедура, где я создаю динамически Panel
Код

procedure TMyForm.CrPanel(HintText, NewPanelName: WideString; X,Y: integer);
var Panel: TPanel;
begin
  Panel := TPanel.Create(Self);
  Panel.Parent := Self;
  Panel.Width := 500;
  Panel.Height:= 200;
  Panel.Left := X;
  Panel.Top := Y;
  Panel.ShowHint := true;
  Panel.Name := trim(NewPanelName);
  Panel.Hint := trim(HintText);
  Panel.Caption := '';
end;

Из 1С передаются, например, такие параметры:
  • HintText = Текст подсказки;
  • NewPanelName = Panel1
  • X = 25
  • Y = 40
На что 1С мне возвращает такую ошибку:
Произошла исключительная ситуация (MyActiveX.MyForm): ''Panel1
Если же напишу так:
Код

procedure TMyForm.CrPanel(HintText, NewPanelName: WideString; X,Y: integer);
var Panel: TPanel;
begin
  Panel := TPanel.Create(Self);
  Panel.Parent := Self;
  Panel.Width := 500;
  Panel.Height:= 200;
  Panel.Left := X;
  Panel.Top := Y;
  Panel.ShowHint := true;
  Panel.Name := 'Panel1';
  Panel.Hint := trim(HintText);
  Panel.Caption := '';
end;

... то панель нормально создается и имя остается Panel1. Пробовал trim(NewPanelName) вывести в Edit, так там все нормально, отображается текст Panel1. В чем может быть проблема?
--------------------
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть жопой на клавиатуру... 
PM   Вверх
serezhka1986
Дата 24.1.2013, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 215
Регистрация: 12.6.2009

Репутация: нет
Всего: 0



Сейчас попробовал загнать текст в Edit1 и взять его как имя панели, и все нормально отработало:
Код

procedure TMyForm.CrPanel(HintText, NewPanelName: WideString; X,Y: integer);
var Panel: TPanel;
begin
  Panel := TPanel.Create(Self);
  Panel.Parent := Self;
  Panel.Width := 500;
  Panel.Height:= 200;
  Panel.Left := X;
  Panel.Top := Y;
  Panel.ShowHint := true;
  Edit1.Text := trim(NewPanelName);
  Panel.Name := trim(Edit1.Text); 
  Panel.Hint := trim(HintText);
  Panel.Caption := '';
end;

Что за прикол, не пойму...  smile 
--------------------
Для некоторых лучший способ написать что-нибудь осмысленное - это сесть жопой на клавиатуру... 
PM   Вверх
bems
Дата 24.1.2013, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



возможно компонент с именем panel1 уже существует, и это приводит к эксцепшну


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0920 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.