Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизSender... кто же вызвал процедуру?... Найти похожие ветки
← →
chir (2005-01-12 18:47) [0]Хочу сделать такую процедуру:
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"
Как мне преобразовать к нужному типу?
← →
begin...end © (2005-01-12 18:50) [1]> chir (12.01.05 18:47)
Заменяйте на if"ы.
← →
jack128 © (2005-01-12 18:50) [2]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) [3]Вопрос в чем в том как сделать работающий case? Или как преобразовать тип? Или как сделать один обработчик на разные компоненты?
Насколько я понял - последне. Тогда лучше использовать Tag.
← →
Walker © (2005-01-12 18:52) [4]структура 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;
← →
icWasya © (2005-01-12 18:54) [5]увы, строки в 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;
← →
chir (2005-01-12 18:56) [6]такс... пасибочки
Про case понял. спасибо. После php тяжело вспоминать Pascal. Хотя в Pascal"е case брал char... про String не помню.
> Александр Иванов
Вот наверное мне нужен Tag...
Этот Tag долго осваивать? что это вообще?
← →
jack128 © (2005-01-12 18:57) [7]chir (12.01.05 18:56) [6]
Хотя в Pascal"е case брал char
и в дельфи берет. кейс принимает все ПЕРЕЧИСЛЯЕМЫЕ типы.
← →
chir (2005-01-12 18:57) [8]> icWasya
про Tag вроде тоже понял.
ща попробую, спасибо
← →
XmeD (2005-01-12 19:00) [9]
Вот наверное мне нужен Tag...
Этот Tag долго осваивать? что это вообще?
Tag - integer - целочисленное проперти любого компонента в Делфи.
По дефолту 0, а вообще используется в основном именно для таких случаев
← →
jack128 © (2005-01-12 19:17) [10]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
:-)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c