Текущий архив: 2005.10.23;
Скачать: CL | DM;
Внизкак назначить одну процедуру многим компонентам Найти похожие ветки
← →
alexm (2005-09-22 10:03) [0]Добрый день! Ситуация такова:имеется 25 ComboBox и 25 Shape. При изменении в поле ComboBox соответствующая Shape изменяет цвет.Процедура написана для ComboBox1 и Shape1. Как сделать так чтобы не переписывать эту же процедуру для остальных ComboBox.
← →
Digitman © (2005-09-22 10:16) [1]как сейчас выглядит эта процедура ?
← →
icWasya © (2005-09-22 11:30) [2]Самое простое - сделать Fame с Combobox и Shape. Обработчик ComboboxClick сделать методом Frame. А на форму поместить уже 25 Frame и ничего не надо будет менять.
← →
alexm (2005-09-22 13:27) [3]В даный момент процедура выглядит так:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex <> 0 Then
begin
Shape1.Brush.Color:= clRed ;
Edit1.Text:=TimeToStr(Time);
end
else
begin
Shape1.Brush.Color:= clGreen;
Edit1.Text:="";
end;
end;
← →
Leonid Troyanovsky © (2005-09-22 14:47) [4]
> 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.
← →
Digitman © (2005-09-22 15:11) [5]
> 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"ов
подход к решению задачи, конечно же, "дубовый", но для ДАННЫХ условий сойдет.
← →
alexm (2005-09-22 16:27) [6]Digitman, спасибо за идею. Условия которые Вы указали действительно имеют место. Но к сожалению программа стопорит при выполнении этого оператора: Shape.Brush.Color:= clGreen; Что с ним не так не могу понять.
← →
Digitman © (2005-09-22 16:47) [7]
> Что с ним не так не могу понять
а КАК ты пытался понять ? конкретнее ...
> программа стопорит
я не знаю, что такое "программа стопорит" ..
← →
alexm (2005-09-22 17:21) [8]Старался разобратся в его логике работы и не нахожу ошибки, но тем не менее при работе программы, при выполнении даного оператора, генерируется исключительная ситуация. Компиляция проходит нормально. Прошу прощения за некоректные порой высказывания, и спасибо за терпение. Я только начинаю учится програмированию. С английским у меня еще хуже чем с Delphi, поэтому не могу сказать что вызывает эту ситуацию.
← →
_RusLAN © (2005-09-22 17:59) [9]
> with TComboBox(Sender) do
> begin
> sIdx := StringReplace(Name, "ComboBox", "", []);
> Shape := TShape(FindComponent("Shape"+sIdx));
> if ItemIndex <> 0 Then
> begin
ИМХО надо
Form1.FindComponent("Shape"+sIdx)
а то так вызывается метод ФиндКомпонент у Комбобокса а не у формы
← →
Digitman © (2005-09-22 18:04) [10]
> Старался разобратся в его логике работы
Как ? Конкретно ?
Описывай пошагово и детально свои действия ..
> Компиляция проходит нормально
Подразумевалось. Принято.
> при выполнении даного оператора, генерируется исключительная
> ситуация
ГДЕ детальные подробности ?
Скопировать сюда "один-в-один" текст увиденного тобой сообщения об исключении , думаю, вовсе не требует знания буржуйского языка.
> С английским у меня еще хуже чем с Delphi
Печально.
Хлебнешь горя. И не раз.
Займись пробелом в этих знаниях безотлагательно.
← →
jack128 © (2005-09-22 18:44) [11]_RusLAN © (22.09.05 17:59) [9]
Form1.FindComponent("Shape"+sIdx)
ну уж тогда Self.FindComponent
← →
alexm (2005-09-23 11:46) [12]Спасибо всем кто помогал. Уже все работает. Но у меня еще один вопрос. Почему я не могу присвоить некой переменной свойство Caption компонента TGroupBox. Делалось так объявлялась переменная типа TGoupBox, потом выполнялся поиск компонента
Gp := TGroupBox(Self.FindComponent("Group"+Sid)); далее строквой переменной S необходимо присвоить значение GroupBox().Caption. Но оператор S:=Gp.Caption; неработает. Прбовал просматривать значение переменной S во время выполнения программы -оно всегда "" (пусто). Если написать S:=Group1Box.Caption то все работает
← →
Digitman © (2005-09-23 12:09) [13]а чему при этом равен Sid ?
и чему после поиска равно Gp.Name ?
← →
alexm (2005-09-23 12:44) [14]Sid - это идентификатор номера компонента. Его значения в пределах 1 - 25.В зависимости от того какой компонент вызвал событие. К сожалению у меня почемуто не работает фунция поиска компонента,отсюда и проблема. Хотя другие компоненты находятся нормалтно.
← →
Digitman © (2005-09-23 15:18) [15]
> меня почемуто не работает фунция поиска компонента
что значит "не работает" ?
если бы компонент не был найден, ты получил бы AV-исключение при обращении к Gp.Caption, в противном случае компонент заведомо найден ... а вот ЧТО же за компонент найден - в том-то и вопрос ...
← →
msguns © (2005-09-23 15:25) [16]Если контролы визуальные, вместо номеров в качестве аргументов поиска нужного рекомендую использовать тэги и контейнеризацию (каждая пара комбобокс+шэйп на "своей" панельке) и Controls+ControlCount для поиска нужной панели на панеле-платформе.
← →
msguns © (2005-09-23 15:25) [17]Если контролы визуальные, вместо номеров в качестве аргументов поиска нужного рекомендую использовать тэги и контейнеризацию (каждая пара комбобокс+шэйп на "своей" панельке) и Controls+ControlCount для поиска нужной панели на панеле-платформе.
← →
umbra © (2005-09-23 15:30) [18]FindComponent возвращает TComponent, общий предок всех компонентов. У него нет свойства Caption. Надо намекнуть делфи, что этот TComponent кроме всего прочего еще и TGroupBox
S:=(Gp as TGroupBox).Caption
← →
Digitman © (2005-09-23 15:36) [19]
> umbra © (23.09.05 15:30) [18]
> Надо намекнуть
ну автор же и намекнул !
см.
> TGroupBox(Self.FindComponent
и, поскольку якобы не схлопотал при этом исключение, то что он нашел ДЕЙСТВИТЕЛЬНО является компонентом класса TGroupBox ..
а вот кто такой тут Self - это еще под вопросом ..
← →
umbra © (2005-09-23 15:44) [20]
> Gp := TGroupBox(Self.FindComponent("Group"+Sid));
А групбоксы называются Group1, Group2 ... или GroupBox1, GroupBox2 ... ?
Если GroupBox1 ... то цитируемый код не нашел ничего.
← →
Digitman © (2005-09-23 15:52) [21]
> umbra © (23.09.05 15:44) [20]
> групбоксы называются Group1, Group2 ... или GroupBox1, GroupBox2
> ... ?
почем мне знать ? у автора уточнять нужно .. а он пропал аки партизан брянский)..
> Если GroupBox1 ... то цитируемый код не нашел ничего
если автор не врет (цитирую)
Прбовал просматривать значение переменной S во время выполнения программы -оно всегда ""
то что-то там класса TGroupBox он таки нашел, иначе схлопотал бы исключение, и хнык при этом был бы на совершенно иную тему..
← →
alexm (2005-09-24 22:56) [22]Прошу прощения за временное отсувствие.
> umbra
> А групбоксы называются Group1, Group2 ... или GroupBox1,
> GroupBox2 ... ?
GroupBox называются TGroupBox1 и т.д..
> Если GroupBox1 ... то цитируемый код не нашел ничего.
Если можно то поясните почему
> Digitman
> о что-то там класса TGroupBox он таки нашел, иначе схлопотал
> бы исключение
Исключения программа не выдает.Также просматривал значение переменной Gp. После оператора Gp := TGroupBox(Self.FindComponent("Group"+Sid)); оно равно nill.
← →
alexm (2005-09-24 23:27) [23]Большое спасиб всем кто помогал. Уже все заработало. Я просто изменил переменную в операторе Gp := TGroupBox(Self.FindComponent("Group"+Sid));
Вместо Gp поставил GroupBox. Можно считать вопрос исчерпаным.
Страницы: 1 вся ветка
Текущий архив: 2005.10.23;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.045 c