![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Sender... кто же вызвал процедуру?... [D7]
chir © (2005-01-12 18:47:00)Хочу сделать такую процедуру:
procedure TForm1.MyControl(Sender: TObject);
begin
RichEdit1.Lines.Add(TControl(Sender).Name+': MyControl');
case TControl(Sender).Name of
'cxDBTL_FIO': ;
'ToolButton1': ;
'ToolButton2': ;
'ToolButton3': ;
'ToolButton5': ;
end;
end;
Но компилятор ругается... не нравится ему TControl(Sender).Name в case. "Ordinal type required"
Как мне преобразовать к нужному типу?
jack128 (2005-01-12 19:17:00) [1]2chir, icWasya, XmeD
Квалификацию Дельфи программиста можно опеределить как раз по тому как он решает сабжеваю задачу.
Сначала люди пишут
if TControl(Sender).Name = 'cxDBTL_FIO' then
else if TControl(Sender).Name = 'ToolButton1' then
else if TControl(Sender).Name = 'ToolButton2' then
else if TControl(Sender).Name = 'ToolButton3' then
else if TControl(Sender).Name = 'ToolButton5' then
Потехоньку люди узнают про свойство таг и пишут что - то типа
case TControl(Sender).Tag of
1: ;
2: ;
3: ;
4: ;
5: ;
end;
Ну и наконец приходит понимание, что нефига городить огород, там где он не нужен ;-) и получается такой код:
if Sender = cxDBTL_FIO then
else if Sender = ToolButton1 then
else if Sender = ToolButton2 then
else if Sender = ToolButton3 then
else if Sender = ToolButton5 then
:-)
XmeD (2005-01-12 19:00:00) [2]
Вот наверное мне нужен Tag...
Этот Tag долго осваивать? что это вообще?
Tag - integer - целочисленное проперти любого компонента в Делфи.
По дефолту 0, а вообще используется в основном именно для таких случаев
jack128 (2005-01-12 18:57:00) [3]chir (12.01.05 18:56) [6]
Хотя в Pascal'е case брал char
и в дельфи берет. кейс принимает все ПЕРЕЧИСЛЯЕМЫЕ типы.
chir (2005-01-12 18:57:00) [4]> icWasya
про Tag вроде тоже понял.
ща попробую, спасибо
chir (2005-01-12 18:56:00) [5]такс... пасибочки
Про case понял. спасибо. После php тяжело вспоминать Pascal. Хотя в Pascal'е case брал char... про String не помню.
> Александр Иванов
Вот наверное мне нужен Tag...
Этот Tag долго осваивать? что это вообще?
icWasya (2005-01-12 18:54:00) [6]увы, строки в Case не поддерживаются. Поэтому либо
procedure TForm1.MyControl(Sender: TObject);
var
S:String;begin
RichEdit1.Lines.Add(TControl(Sender).Name+': MyControl');
S:= TControl(Sender).Name
if S='cxDBTL_FIO' then ;
if S='ToolButton1' then ;
if S='ToolButton2' then ;
if S='ToolButton3' then ;
if S='ToolButton5' then ;
end;
,
Либо чуть-чуть доработать, например установив свойство Tag у компонент и
procedure TForm1.MyControl(Sender: TObject);
begin
RichEdit1.Lines.Add(TControl(Sender).Name+': MyControl(' +IntToStr(TControl(Sender).Tag+')' );
case TControl(Sender).Tag of
1: ;
2: ;
3: ;
4: ;
5: ;
end;
end;
Walker (2005-01-12 18:52:00) [7]структура case X of ... end работает только с целочисленным типом, т.е. X: Integer; а у тебя TControl(Sender).Name - тип String
выход в данной ситуации может быть таким:
procedure TForm1.MyControl(Sender: TObject);
var
s: String;
begin
RichEdit1.Lines.Add(TControl(Sender).Name+': MyControl');
s := TControl(Sender).Name;
if s = 'cxDBTL_FIO' then ... else
if s = 'ToolButton1' then ... else
if s = 'ToolButton1' then ... else
if s = 'ToolButton2' then ... else
и так далее
end;
begin...end (2005-01-12 18:50:00) [8]> chir (12.01.05 18:47)
Заменяйте на if'ы.
jack128 (2005-01-12 18:50:00) [9]if TControl(Sender).Name = 'cxDBTL_FIO' then
else if TControl(Sender).Name = 'ToolButton1' then
else if TControl(Sender).Name = 'ToolButton2' then
else if TControl(Sender).Name = 'ToolButton3' then
else if TControl(Sender).Name = 'ToolButton5' then
Александр Иванов (2005-01-12 18:50:00) [10]Вопрос в чем в том как сделать работающий case? Или как преобразовать тип? Или как сделать один обработчик на разные компоненты?
Насколько я понял - последне. Тогда лучше использовать Tag.