Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

как назначить одну процедуру многим компонентам [D6, XP]


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо