Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];

Вниз

Case Sender Of   Найти похожие ветки 

 
fatboy   (2002-11-14 21:36) [0]

Почему не работает:
Case Sender Of
Button1 : ...;
Button2 : ...;
Button3 :...
или как можно узнать какая именно кнопка была нажата
If Sender = Button1 then .... - получается, но это же не дело.


 
Song   (2002-11-14 22:01) [1]

Ordinal type required


 
fatboy   (2002-11-14 22:46) [2]

>Ordinal type required

Угадал, а дальше?


 
apay   (2002-11-15 00:45) [3]

а дальше


if Sender = Button1 then ...
else if Sender = Button2 then ...
...


и никак иначе

если вдруг получится по другому - пиши, очень интересно :)


 
Almaz   (2002-11-15 00:50) [4]


> fatboy (14.11.02 21:36)
> Почему не работает:
> Case Sender Of
> Button1 : ...;
> Button2 : ...;
> Button3 :...
> или как можно узнать какая именно кнопка была нажата
> If Sender = Button1 then .... - получается, но это же не
> дело.

Для этого существует поле Tag. Оно имеется у каждого визуального компонента. Установите для Button1.Tag = 1, Button2.Tag = 2 и т.д.
А затем используйте это поле для идентификации компонента:

procedure TForm1.ButtonClick(Sender: TObject);
begin
case TComponent(Sender).Tag of
1: ShowMessage("Button1");
2: ShowMessage("Button2");
3: ShowMessage("Button3");
else
ShowMessage("Неизвестно что :))) ");
end;
end;


Удачи.


 
fatboy   (2002-11-15 01:12) [5]

>Almaz
Спасибо, очень красиво !!


 
apay   (2002-11-15 01:37) [6]

2 Almaz
поле Tag не всегда свободно (неиспользуемо)
можно конечно их в List загнать, а потом ч/з IndexOf, но ... :)


 
Almaz   (2002-11-15 02:29) [7]


> apay © (15.11.02 01:37)
> 2 Almaz
> поле Tag не всегда свободно (неиспользуемо)

Tag не используеться нигде внутри VCL. Оно создано как раз для идентификации компонентов.
Но если уж вышло так, что вы уже заняли Tag, то при условии, что кнопки будут иметь имена по умолчанию, т.е. Button1, ..., Button20, ..., ButtonNNN то можно использовать такой, не слишком красивый, но работающий способ:

procedure TForm1.Button1Click(Sender: TObject);
begin
if Copy(TComponent(Sender).Name, 1, 6) = "Button" then
case StrToInt(Copy(TComponent(Sender).Name, 7, MaxInt)) of
1: ShowMessage("Button1");
2: ShowMessage("Button2");
3: ShowMessage("Button3");
20: ShowMessage("Button20");
else
ShowMessage("Неизвесто что");
end;
end;


Удачи.


 
Александр Павлов   (2002-11-15 04:31) [8]

Мой подход к таким вещам:

1)Новый тип:

TMyButton = class(TButton)
public
SomeInt: Integer;
end;

2)В приложении:

if Sender is TMyButton then
case TMyButton(Sender).SomeInt of
...
end;
=========================================================
1)Можно на кнопку сразу "прицепить" какой-либо указатель:
PSomeRec = ^TSomeRec;
TSomeRec = record
FileName, FileParams: string[252];
FName,LName,MName: string[40];
FreeSpaceMb, TotalSpaceMb : word;
SomeByte, : word;
и тд...
end;

TDatedButton = class(TButton)
public
Data: Pointer;
end;


2) В приложении:

var
P: PSomeRec;
btn: TButton;
begin
btn := TDatedButton.Create(Self);
btn.Parent := Form1;
New(P);
P^.FileName := "c:\test.exe";
P^.FName := "Петров";
..
btn.Data := P;
end;

...

if (Sender is TDatedButton) then
case PSomeRec(TDatedButton(Sender).Data)^.SomeByte of
...
end;

Прим: перед освобождением кнопки незабыть освободить указатель:
Dispose(PSomeRec(TDatedButton(Sender).Data)), или переопределить метод деструктора новой кнопки..



 
mmb   (2002-11-15 08:53) [9]

А ещё можно конвертировать в Integer, тоже 4 байта .


 
Александр Павлов   (2002-11-15 09:09) [10]

:)


 
Skier   (2002-11-15 10:29) [11]

>fatboy
А св-во Tag не выручит ?


 
Song   (2002-11-15 10:45) [12]

Может просто одной строкой? :-)

ShowMessage("Button"+IntToStr(TComponent(Sender).Tag));


 
Calm   (2002-11-15 12:40) [13]


> Tag не используеться нигде внутри VCL. Оно создано как раз
> для идентификации компонентов.

А я то думал, для идентификации компонентов специально создано поле Name :)

2 Almaz & All
Я считаю, что подход Александра Павлова более правилен.
Может случится ситуация, что мы задействовали свойство Tag в своей компоненте и передали ее кому-нибудь в пользование. А этот кто-нибудь возьмет и тоже использует свойство Tag. Глюков будет немеряно...


 
Skier   (2002-11-15 12:44) [14]

>Calm

> Может случится ситуация, что мы задействовали свойство Tag
> в своей компоненте и передали ее кому-нибудь в пользование.
>

Этот как посмотреть...
Может случится, а может и нет - выбирать автору.
Как говорится, есть две пословицы :
1) Не плюй в колодец - пригодится воды напиться.
2) Плюй в колодец - не пригодится воды напиться. :)



 
Calm   (2002-11-15 13:16) [15]


> Этот как посмотреть...
> Может случится, а может и нет - выбирать автору.


2 Skier
Это вопрос расширяемости программы.
IMHO, нужно заранее создавать (или хотя бы не закрывать) пути для дальнейшего расширения функциональности программы.

Это вопрос стилья программирования и работы (смотрим шире - стиля жизни). Чего предерживаться и к чему стремиться, действительно, каждый должен решать для себя сам.


 
PVOzerski   (2002-11-15 13:44) [16]

Идея с конверсией (mmb © (15.11.02 08:53))всем бы хороша, но только вапианты состояния (те, что перед двоеточиями) должны быть нетипизированными константами. Так что если Вы гарантированно знаете, какие значения будут иметь указатели на объекты-кнопки, вперёд! :^)
А если более серьезно, кто-нибудь проверял, что даёт более и насколько более эффективный код - case или много раз if..else if... ? Потому как с точки зрения компактности записи различия могут быть не так уж велики, как это кажется на 1-й взгляд.

if Sender=Button1 then
Procedure1
else if Sender=Button2 then
Procedure2
else if Sender=Button3 then
Procedure3
else
CommonProcedure;


 
Diouzshev   (2002-11-15 14:00) [17]

Чем не подходит
if ... then
else if ... then
.....
?
если уж совсем невтерпеж то можно развить идею:

case Integer(Sender) of
Integer(Button1) : DoSomething1;
Integer(Button2) : DoSomething2;
Integer(Button3) : DoSomething3;
end;

этот код не работает т.к. перед двоеточием не поддерживаются выражения.
Origin: А ларчик просто отрывался.


 
Calm   (2002-11-15 14:32) [18]


> А если более серьезно, кто-нибудь проверял, что даёт более
> и насколько более эффективный код - case или много раз if..else
> if... ? Потому как с точки зрения компактности записи различия
> могут быть не так уж велики, как это кажется на 1-й взгляд.


Не берусь утверждать точно, но читал я когда-то, что много-много if () then () работают немного медленнее, чем case, но только в том случае, если ключевые значения в case расположены по возрастанию. Сколько это "много-много" - не знаю. Если же вариантов меньше, то различия вроде как бы отсутствует либо незаметно.


 
TTCustomDelphiMaster   (2002-11-15 15:44) [19]


> много-много if () then () работают немного медленнее, чем
> case


Думаю что заметить разницу вы заметить не сможете.


 
Almaz   (2002-11-15 23:19) [20]


> Diouzshev (15.11.02 14:00)
> если уж совсем невтерпеж то можно развить идею:
> case Integer(Sender) of
> Integer(Button1) : DoSomething1;
> Integer(Button2) : DoSomething2;
> Integer(Button3) : DoSomething3;
> end;

А вы попробовали этот код, прежде чем написать ? Перед ":" должна стоять КОНСТАНТА. см. PVOzerski © (15.11.02 13:44)


 
fatboy   (2002-11-16 00:28) [21]

Еще раз всем большое спасибо за несколько интересных вариантов. Все же считаю использование много if...then...else - дурным тоном


 
Alex44   (2002-11-16 13:10) [22]

IMHO, edinstvennoe otlichie mezhdu if ... then i case ... of---
eto to, chto v if sravnivayutsya dve peremennye (iz pamyati), a v case---peremennaya i constanta (kotoraya mozhet byt" prosto zashita v instructiyu CPU). Tem samym if mozhet byt" na 1--2 instructii popbol"she (zagruzit" odnu iz peremennyh v register), no vryad li eto sil"no skazhetsya na bystrodejstvii.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
3-92938
Mic_2000
2002-11-08 18:35
2002.11.28
Не могу занести в поле char русскую строку, помогите


1-93103
Интересующийся...
2002-11-17 11:43
2002.11.28
Мастера, подскажите как сделать...


4-93306
d_coder
2002-10-08 21:21
2002.11.28
<<<<<<Проблема с несоответствием типов>>>>>


14-93222
Сатир
2002-11-10 16:11
2002.11.28
Именинники 10 ноября


4-93298
Zone_666
2002-10-18 00:53
2002.11.28
Как заблокировать доступ к папке (к каталогу)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский