![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как назначить одну процедуру многим компонентам [D6, XP]
alexm © (2005-09-22 10:03:00)Добрый день! Ситуация такова:имеется 25 ComboBox и 25 Shape. При изменении в поле ComboBox соответствующая Shape изменяет цвет.Процедура написана для ComboBox1 и Shape1. Как сделать так чтобы не переписывать эту же процедуру для остальных ComboBox.
alexm (2005-09-24 23:27:00) [1]Большое спасиб всем кто помогал. Уже все заработало. Я просто изменил переменную в операторе Gp := TGroupBox(Self.FindComponent('Group'+Sid));
Вместо Gp поставил GroupBox. Можно считать вопрос исчерпаным.
alexm (2005-09-24 22:56:00) [2]Прошу прощения за временное отсувствие.
> umbra
> А групбоксы называются Group1, Group2 ... или GroupBox1,
> GroupBox2 ... ?
GroupBox называются TGroupBox1 и т.д..
> Если GroupBox1 ... то цитируемый код не нашел ничего.
Если можно то поясните почему
> Digitman
> о что-то там класса TGroupBox он таки нашел, иначе схлопотал
> бы исключение
Исключения программа не выдает.Также просматривал значение переменной Gp. После оператора Gp := TGroupBox(Self.FindComponent('Group'+Sid)); оно равно nill.
Digitman (2005-09-23 15:52:00) [3]
> umbra © (23.09.05 15:44) [20]
> групбоксы называются Group1, Group2 ... или GroupBox1, GroupBox2
> ... ?
почем мне знать ? у автора уточнять нужно .. а он пропал аки партизан брянский)..
> Если GroupBox1 ... то цитируемый код не нашел ничего
если автор не врет (цитирую)
Прбовал просматривать значение переменной S во время выполнения программы -оно всегда ''
то что-то там класса TGroupBox он таки нашел, иначе схлопотал бы исключение, и хнык при этом был бы на совершенно иную тему..
umbra (2005-09-23 15:44:00) [4]
> Gp := TGroupBox(Self.FindComponent('Group'+Sid));
А групбоксы называются Group1, Group2 ... или GroupBox1, GroupBox2 ... ?
Если GroupBox1 ... то цитируемый код не нашел ничего.
Digitman (2005-09-23 15:36:00) [5]
> umbra © (23.09.05 15:30) [18]
> Надо намекнуть
ну автор же и намекнул !
см.
> TGroupBox(Self.FindComponent
и, поскольку якобы не схлопотал при этом исключение, то что он нашел ДЕЙСТВИТЕЛЬНО является компонентом класса TGroupBox ..
а вот кто такой тут Self - это еще под вопросом ..
umbra (2005-09-23 15:30:00) [6]FindComponent возвращает TComponent, общий предок всех компонентов. У него нет свойства Caption. Надо намекнуть делфи, что этот TComponent кроме всего прочего еще и TGroupBox
S:=(Gp as TGroupBox).Caption
msguns (2005-09-23 15:25:00) [7]Если контролы визуальные, вместо номеров в качестве аргументов поиска нужного рекомендую использовать тэги и контейнеризацию (каждая пара комбобокс+шэйп на "своей" панельке) и Controls+ControlCount для поиска нужной панели на панеле-платформе.
msguns (2005-09-23 15:25:00) [8]Если контролы визуальные, вместо номеров в качестве аргументов поиска нужного рекомендую использовать тэги и контейнеризацию (каждая пара комбобокс+шэйп на "своей" панельке) и Controls+ControlCount для поиска нужной панели на панеле-платформе.
Digitman (2005-09-23 15:18:00) [9]
> меня почемуто не работает фунция поиска компонента
что значит "не работает" ?
если бы компонент не был найден, ты получил бы AV-исключение при обращении к Gp.Caption, в противном случае компонент заведомо найден ... а вот ЧТО же за компонент найден - в том-то и вопрос ...
alexm (2005-09-23 12:44:00) [10]Sid - это идентификатор номера компонента. Его значения в пределах 1 - 25.В зависимости от того какой компонент вызвал событие. К сожалению у меня почемуто не работает фунция поиска компонента,отсюда и проблема. Хотя другие компоненты находятся нормалтно.
Digitman (2005-09-23 12:09:00) [11]а чему при этом равен Sid ?
и чему после поиска равно Gp.Name ?
alexm (2005-09-23 11:46:00) [12]Спасибо всем кто помогал. Уже все работает. Но у меня еще один вопрос. Почему я не могу присвоить некой переменной свойство Caption компонента TGroupBox. Делалось так объявлялась переменная типа TGoupBox, потом выполнялся поиск компонента
Gp := TGroupBox(Self.FindComponent('Group'+Sid)); далее строквой переменной S необходимо присвоить значение GroupBox().Caption. Но оператор S:=Gp.Caption; неработает. Прбовал просматривать значение переменной S во время выполнения программы -оно всегда '' (пусто). Если написать S:=Group1Box.Caption то все работает
jack128 (2005-09-22 18:44:00) [13]_RusLAN © (22.09.05 17:59) [9]
Form1.FindComponent('Shape'+sIdx)
ну уж тогда Self.FindComponent
Digitman (2005-09-22 18:04:00) [14]
> Старался разобратся в его логике работы
Как ? Конкретно ?
Описывай пошагово и детально свои действия ..
> Компиляция проходит нормально
Подразумевалось. Принято.
> при выполнении даного оператора, генерируется исключительная
> ситуация
ГДЕ детальные подробности ?
Скопировать сюда "один-в-один" текст увиденного тобой сообщения об исключении , думаю, вовсе не требует знания буржуйского языка.
> С английским у меня еще хуже чем с Delphi
Печально.
Хлебнешь горя. И не раз.
Займись пробелом в этих знаниях безотлагательно.
_RusLAN (2005-09-22 17:59:00) [15]
> with TComboBox(Sender)do
> begin
> sIdx := StringReplace(Name, 'ComboBox', '', []);
> Shape := TShape( FindComponent('Shape'+sIdx));
> if ItemIndex <> 0 Then
> begin
ИМХО надо
Form1.FindComponent('Shape'+sIdx)
а то так вызывается метод ФиндКомпонент у Комбобокса а не у формы
alexm (2005-09-22 17:21:00) [16]Старался разобратся в его логике работы и не нахожу ошибки, но тем не менее при работе программы, при выполнении даного оператора, генерируется исключительная ситуация. Компиляция проходит нормально. Прошу прощения за некоректные порой высказывания, и спасибо за терпение. Я только начинаю учится програмированию. С английским у меня еще хуже чем с Delphi, поэтому не могу сказать что вызывает эту ситуацию.
Digitman (2005-09-22 16:47:00) [17]
> Что с ним не так не могу понять
а КАК ты пытался понять ? конкретнее ...
> программа стопорит
я не знаю, что такое "программа стопорит" ..
alexm (2005-09-22 16:27:00) [18]Digitman, спасибо за идею. Условия которые Вы указали действительно имеют место. Но к сожалению программа стопорит при выполнении этого оператора: Shape.Brush.Color:= clGreen; Что с ним не так не могу понять.
Digitman (2005-09-22 15:11:00) [19]
> alexm (22.09.05 13:27) [3]
> имеется 25 ComboBox и 25 Shape
Соблюдаются ли при этом следующие условия :
1. Соответствуют ли имена компонентов класса TComboBox стр.представлению шаблона 'ComboBoxN', где N = '1'..'25' ?
2. Соответствуют ли имена компонентов класса TShape соответствуют стр.представлению шаблона 'ShapeN', где N = '1'..'25' ?
3. Каждому ComboBoxN поставлено ли в лог.соответствие ShapeN ?
предположим, что каждому компоненту с именем 'ComboBoxN' поставлен в лог.соответствие компонент с именем 'ShapeN', где N есть стр.представление целого числа в диапазоне [1..25]
тогда :
procedure TForm1.SomeComboBoxChange(Sender: TObject);
var
sIdx: String;
Shape: TShape;
begin
with TComboBox(Sender) do
begin
sIdx := StringReplace(Name, 'ComboBox', '', []);
Shape := TShape(FindComponent('Shape'+sIdx));
if ItemIndex <> 0 Then
begin
Shape.Brush.Color:= clRed ;
Edit1.Text:=TimeToStr(Time);
end
else
begin
Shape.Brush.Color:= clGreen;
Edit1.Text:='';
end;
end;
end;
в ран- или дизайн-тайм назначаешь метод SomeComboBoxChange() в кач-ве обработчика события OnChange всех своих 25-ти ComboBox'ов
подход к решению задачи, конечно же, "дубовый", но для ДАННЫХ условий сойдет.
Leonid Troyanovsky (2005-09-22 14:47:00) [20]
> alexm (22.09.05 10:03)
> Добрый день! Ситуация такова:имеется 25 ComboBox и 25 Shape.
> При изменении в поле ComboBox соответствующая Shape изменяет
> цвет.Процедура написана для ComboBox1 и Shape1. Как сделать
> так чтобы не переписывать эту же процедуру для остальных
> ComboBox.
IMHO, достаточно 25 Shape и 2 комбобокса - в одном выбирается shape,
а в другом - цвет.
И то и другое можно засунуть в Objects оных комбобоксов в Form.OnCreate.
Процедура (например) OnClick назначается им одна.
Что-то вроде:
if (cb1.ItemIndex >= 0) and (cb2.ItemIndex >= 0 then
TShape(cb1.Items.Objects[cb1.ItemIndex]).Brush.Color := TColor(cb2.Items.Objects[cb2.ItemIndex]);
--
Regards, LVT.