Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.048 c
14-1127992163
Coder_
2005-09-29 15:09
2005.10.23
Протокол ICQ


14-1127989683
dr Tr0jan
2005-09-29 14:28
2005.10.23
Кратово - Жуковский


1-1128220868
Sergey_R
2005-10-02 06:41
2005.10.23
Сортировка Stringgrid


4-1124138161
ronyn
2005-08-16 00:36
2005.10.23
Net Send по заданному адресу


5-1104312423
Anatoly
2004-12-29 12:27
2005.10.23
Вызов редактора компонента из Popup-меню