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

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

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.


Наверх

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