Главная страница
    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.007 c
1-92991
sdram
2002-11-18 17:35
2002.11.28
Как определить OS?


1-93044
Crey
2002-11-14 13:41
2002.11.28
---|Ветка была без названия|---


1-93108
ctapik-net
2002-11-17 17:25
2002.11.28
Стандартный диалог


4-93294
pavel-ak
2002-10-17 11:53
2002.11.28
День добрый всем! Помогите пожалуюста с OnBeforeNavigate2


4-93291
Alexander
2002-10-17 14:24
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский