Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2010, 10:38   #1
vr83
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 12
Вопрос Вопрос о правильном понимании операторов or и and в операторе case.

Вроди бы все ясно как день, но вот с чем я столкнулся:

Сделал на форме(Delphi) панель (Height 186, Width 186). На панели кнопка (Height 186, Width 186, Left 0, Top 0, Tag 1).

Дальше код:

Код:
....

procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Button1.BeginDrag(false);
end;

procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  State: TDragState; var Accept: Boolean);
begin
Accept := Source is TButton
end;

procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
begin
case (source as TButton).Tag of

  1:
    begin 

    case ((source as TButton).Left) and ((source as TButton).Top) of

    ((0) and (0)):
    
    begin
    if ( X >= 93 ) and ( X < 186 ) and ( Y < 93 ) then
      begin
      (source as TButton).Left := 93;
      (source as TButton).Top := 0;
      end;
    if ( X < 93 ) and ( Y >= 93 ) and ( Y < 186 ) then
     begin
     (source as TButton).Left := 0;
     (source as TButton).Top := 93;
     end;
    end;



    end; // конец case left+Top блока

  end; // конец  1 tag




end; // конец case tag блока
end; // конец метода

end.
Ну вот. Теперь кнопке можно присвоить новые координаты перетаскиванием. Ee можно перетащить вправо или вниз на панели. И как ни странно по диагонали. Т.е. сначала перетащить например на координаты Лефт и Топ = (0 и 93), а потом от туда перетащить на координаты (93 и 0), так же и обратно. К тому же, если начальные координаты кнопки будут например не (0 и 0), а (0, 3) ее так же можно будет перетаскивать. Почему, ведь стоит оператор AND:

Код:
....

case ((source as TButton).Left) and ((source as TButton).Top) of

    ((0) and (0)):

....
Теперь если подставить вместо AND оператор OR:

Код:
....

case ((source as TButton).Left) or ((source as TButton).Top) of

    ((0) or (0)):

....
то кнопку нельзя будет перетаскивать по диагонали. К тому же если начальные координаты кнопки будут отличны от (0, 0) то их вообще нельзя будет поменять перетаскиванием. Опять же странно. Такое ощущение что в операторе CASE: AND это OR, а OR это AND. Объясните пожалуста.

Последний раз редактировалось vr83; 08.05.2010 в 10:40.
vr83 вне форума Ответить с цитированием
Старый 08.05.2010, 11:41   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Оператор case в делфи как и в паскале очень ограничен в возможностях.
Когда ты пишешь ((source as TButton).Left) or ((source as TButton).Top) это все равно что ((source as TButton).Left) + ((source as TButton).Top)
А ((0) or (0)) все равно что ((0) + (0)):
Вообще этим оператором не проверяют несколько параметров, лучше для этого использовать IF
Код:
    if
 ((source as TButton).Left=0) and ((source as TButton).Top=0) then
   begin
    if ( X >= 93 ) and ( X < 186 ) and ( Y < 93 ) then
      begin
      (source as TButton).Left := 93;
      (source as TButton).Top := 0;
      end;
    if ( X < 93 ) and ( Y >= 93 ) and ( Y < 186 ) then
     begin
     (source as TButton).Left := 0;
     (source as TButton).Top := 93;
     end;
    end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.05.2010, 14:00   #3
vr83
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 12
По умолчанию

Я сначала так и сделал, но потом решил использовать case, потому что код громоздкий получался. Я знал что в case нужно записать выражение а не условие. Но ведь все равно по логике оператор "and" больше подходит к значению "+", чем "or". А уменя получилось на оборот както.
И вот еще:

Код:
var
X, Y: integer;
Label L;

begin
L:
ReadLn(X, Y);
case (X) and (Y) of
((1) and (0)):
begin
Writeln(X, ' ', Y);
goto L;
end;
end;
writeln(X, '$', Y);
goto L;
end.
выдало следующее:
  • 0
    1
    0 1

    1
    0
    1 0

    0
    0
    0 0

    2
    0
    2 0

    0
    2
    0 2

    20
    0
    20 0

    02
    0
    2 0

    202
    0
    202 0

    0
    202
    0 202

    1
    202
    1 202

    202
    1
    202 1

    1
    1
    1$1

если же вместо "and" поставить "or":
  • 0
    1
    0 1

    1
    0
    1 0

    1
    1
    1 1

    0
    0
    0$0

а если вместо "or" поставить "+":
  • 1
    1
    1$1

    0
    0
    0$0

    0
    1
    0 1

    1
    0
    1 0

т.е. or это не совсем +. Опять же не понятно.
vr83 вне форума Ответить с цитированием
Старый 10.05.2010, 14:03   #4
vr83
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 12
Вопрос

Все я совсем запутался.
Код:
....
procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
label L;
begin
case (source as TButton).Tag of
// кнопкам присвоены различные значения tag в зависимости от формы

  1:
    begin   //кнопка 93*93 (height, width)

    if ((source as TButton).Left = 93) and ((source as TButton).Top = 0) then

          begin

          if ( X >= 93 ) and ( X < 186) and ( Y >= 93 ) and ( Y < 186 ) then
            begin
            (source as TButton).Left := 93;
            (source as TButton).Top := 93;
            end;

          end;

    if ((source as TButton).Left = 93) and ((source as TButton).Top = 93) then

          begin

          if ( X >= 93 ) and (X < 186 ) and ( Y < 93 ) then
            begin
            (source as TButton).Left := 93;
            (source as TButton).Top := 0;
            end;
          if ( X >= 93 ) and ( X < 186 ) and ( Y >= 186) and ( Y < 279 ) then
            begin
            (source as TButton).Left := 93;
            (source as TButton).Top := 186;
            end;

          end;


  2:
    begin //кнопка 186*93

    if ((source as TButton).Left = 0) and ((source as TButton).Top = 0) then

          begin

          if ( X < 93 ) and ( Y >= 186 ) and ( Y < 279 ) then

            begin
            (source as TButton).Left := 0;
            (source as TButton).Top := 93;
            end;
          if ( X >= 93 ) and ( X < 186 ) and ( Y < 186 ) then
          if (Button1.Left <> 93) or (Button1.Top <> 0) and (Button1.Top <> 93) then
          L:
            begin
            (source as TButton).Left := 93;
            (source as TButton).Top := 0;
            end;

          end;
Вот. На панели (Height 279, Width 186) две кнопки, маленкая (Button1)93*93 (height, width) с начальными координатами Left,Top (93,93) и большая 186*93 (height, width)с начальными координатами (0,0). Маленькую как видно из кода можно перетащить на координаты (93,0), (93,93) и (93,186).
Большую на координаты (0,93) и (93,0).
В последнем случае
Код:
if (Button1.Left <> 93) or (Button1.Top <> 0) and (Button1.Top <> 93) then
выполняется проверка нет ли на координатах (93,0) или (93,93) кнопки (Button1). Так вот, если написать так как я написал все работает нормально (т.е если на координатах (93,0) или (93,93) находится Button1 то перетащить большую кнопку на координаты (0,93) не получитья). Но почему ведь правильнее было бы написать так:
Код:
if (Button1.Left <> 93) and (Button1.Top <> 0) or (Button1.Top <> 93) then
Хотя если так сделать то большую кнопку можно будет перетащить если маленькая кнопка находиться на координатах (93,0)
Опять у меня ощущение что and это or.
Если же везде поставить and то кнопку вообще нельзя будет перетащить (что логично потому что невыполнены все условия), если везде поставить or то кнопку можно будет перетащить в любом случае (что тоже понятно, потому что некоторые их условий выполнены). Объясните пожалуста нубу.

Последний раз редактировалось vr83; 10.05.2010 в 14:26.
vr83 вне форума Ответить с цитированием
Старый 10.05.2010, 22:27   #5
vr83
Пользователь
 
Регистрация: 08.05.2010
Сообщений: 12
По умолчанию

Оказывается надо было просто вот так писать:
Код:
if (Button1.Left <> 93) and ( (Button1.Top <> 0) or (Button1.Top <> 93)) then
.
vr83 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос с оператором выбора Case Stratus Паскаль, Turbo Pascal, PascalABC.NET 9 10.08.2009 18:57
Вопрос по Select Case DENGA-RU Microsoft Office Excel 2 23.04.2009 21:03
Вопрос об дружественом операторе << Руслантус Общие вопросы C/C++ 2 21.01.2009 19:48
ошибка в операторе case wowka Помощь студентам 5 24.07.2008 11:47
Вопрос об операторе IF Лёка Общие вопросы Delphi 4 01.02.2008 22:33