Изменить компонент, зная лишь его имя

 
0
 
Delphi, Kylix & Pascal
ava
serezhka1986 | 22.01.2013, 12:24
Добрый день!
У меня на форме есть несколько компонентов Shape. Допустим я знаю name одного из них (в виде простой строки). Как мне изменить (высоту, ширину) или удалить компонент, name которого у меня есть в строке, по нажатию на button?
Kommentare (22)
ava
Rennigth | 22.01.2013, 12:03 #
Перебором находишь свой компонент. Сравнение по классу и св-ву Name. Примеров навалом, поиск по ComponentCount,  Components.

später ergänzt:
serezhka1986, Вот только зачем? Никогда не понимал эти шаманства по поиску компонентов по имени, тегу и т.д.
ava
586 | 22.01.2013, 12:27 #
procedure TForm1.Button1Click(Sender: TObject);
var
  sh : TShape;
begin
  sh := FindComponent('Shape1') as TShape;
  if sh <> nil then
    sh.Width := 150;
end;
ava
kami | 22.01.2013, 13:32 #
Цитата (Rennigth @  22.1.2013,  12:03 findReferencedText)
 шаманства по поиску компонентов по имени, тегу и т.д.

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

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

später ergänzt:
Вот чес-слово, если мне попадается такое "шаманство" и мне еще копаться в нем, я готов задушить этого шамана.  smile 
ava
Данкинг | 22.01.2013, 14:13 #
Цитата (Rennigth @  22.1.2013,  13:03 findReferencedText)
Никогда не понимал эти шаманства по поиску компонентов по имени, тегу и т.д.

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

Если это контролы кинутые в дизайне на форму, то мы всегда и без всякого имени можем к ним обратиться. Если созданные динамически, то ссылки надо сохранять(TList, TObjectList, хоть массивы или просто переменные нужного типа). Вообще имхо считаю что св-во name нужно только в дизайнтайме чтоб видеть кого мы виделили ну и т.д. и при отладке иногда.
ava
serezhka1986 | 22.01.2013, 15:14 #
586, Спасибо! Лови +
ava
Данкинг | 22.01.2013, 15:39 #
Цитата (Rennigth @  22.1.2013,  15:36 findReferencedText)
Если это контролы кинутые в дизайне на форму, то мы всегда и без всякого имени можем к ним обратиться.

Т.е. вместо цикла до ComponentCount и вышеуказанного кода мы будем писать Shape1.Width:=100; Shape2.Width:=100; Shape100.Width:=100; ?
ava
Rennigth | 22.01.2013, 16:08 #
Цитата (Данкинг @  22.1.2013,  15:39 findReferencedText)
Т.е. вместо цикла до 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. это все конечно все мое мнение, и как я уже говорил ситуации бывают разные...
ava
serezhka1986 | 23.01.2013, 18:06 #
Цитата (Rennigth @  22.1.2013,  16:08 findReferencedText)
это все конечно все мое мнение, и как я уже говорил ситуации бывают разные... 

У меня ситуация как раз такая. У меня ActiveX на Delphi размещен на форме 1С, и я с 1С-ки динамически создаю компонент, сохраняя в 1С его name, потом из 1С-ки меняю свойство нужного компонента, зная его имя. Но не могу понять почему так получается, что когда с 1С передаю имя (например, Button2), и хочу его указать в создаваемом компоненте, то в Delphi ошибка.
Что-то типа: Произошла исключительная ситуация ''Button2
Я так понял появились какие-то кавычки в имени? Почему такое может быть?
ava
Akella | 23.01.2013, 20:43 #
ошибка в 17ой строке
ava
serezhka1986 | 24.01.2013, 10:31 #
Цитата (Akella @  23.1.2013,  20:43 findReferencedText)
ошибка в 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. В чем может быть проблема?
ava
serezhka1986 | 24.01.2013, 10:47 #
Сейчас попробовал загнать текст в 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 
ava
bems | 24.01.2013, 12:31 #
возможно компонент с именем panel1 уже существует, и это приводит к эксцепшну
ava
serezhka1986 | 24.01.2013, 13:18 #
Цитата (bems @  24.1.2013,  12:31 findReferencedText)
возможно компонент с именем panel1 уже существует, и это приводит к эксцепшну

Нет еще компонента с таким именем. Я же пишу, если взять с переменной panel1, тогда ошибка, если прописать в коде Panel.Name := 'Panel1' - тогда все отлично.
ava
bems | 24.01.2013, 13:52 #
уверен что в переменной нет ничего лишнего? например символов конца строки
ava
Akella | 25.01.2013, 17:09 #
Цитата (serezhka1986 @  24.1.2013,  10:31 findReferencedText)
Ладно, привожу пример:


Вот спасибо за одолжение НАМ! smile 
ava
serezhka1986 | 25.01.2013, 17:13 #
Цитата (Akella @  25.1.2013,  17:09 findReferencedText)
Вот спасибо за одолжение НАМ!

Та не одолжение это  smile Просто думал что и без кода было понятно суть проблемы. Ошибки же в коде нет?!
ava
Akella | 25.01.2013, 17:15 #
Цитата (serezhka1986 @  23.1.2013,  18:06 findReferencedText)
Что-то типа: Произошла исключительная ситуация ''Button2


Сделай нам ещё одно одолжение, если тебе не сложно  smile 

Пришли полный ТЕКСТ ошибки.

später ergänzt:
Цитата (serezhka1986 @ 25.1.2013,  17:13)
Цитата (Akella @  25.1.2013,  17:09 \\"findReferencedText\\")
Вот спасибо за одолжение НАМ!


Та не одолжение это  smile Просто думал что и без кода было понятно суть проблемы. Ошибки же в коде нет?!

Да, ошибки у нас в головах  :-D

später ergänzt:
а ещё лучше, если параллельно выложите картинку smile
ava
serezhka1986 | 25.01.2013, 17:43 #
Цитата (Akella @  25.1.2013,  17:15 findReferencedText)
Пришли полный ТЕКСТ ошибки.

Ошибка отображается в 1С, поскольку это ActiveX-элемент на 1С-овской форме.
Полный текст ошибки: Произошла исключительная ситуация (MyActiveX.MyForm): ''Panel1
Я его уже писал в этом посте
ava
gesper | 25.01.2013, 22:42 #
Цитата (serezhka1986 @  25.1.2013,  17:43 findReferencedText)
Полный текст ошибки: Произошла исключительная ситуация (MyActiveX.MyForm): ''Panel1

Это ты опечатался и два раза одинарную кавычку поставил перед Panel1?

Имена кроме Panel1 пробовал, например "mfxPanel1" ?
ava
Чучмек | 26.01.2013, 00:38 #
serezhka1986,
Посмотри, что на самом деле содержит NewPanelName.
Скорей всего

'Panel1'#0'ещечтонибудь'

Ставлю сто против одного, что если

Panel.Name := trim(PWideChar(NewPanelName)); 

ошибки не будет.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden