Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.12.2009, 19:48
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию Простая задачка

Вот условие: Расположите на форме компоненты TButton, в виде таблицы 4х4, с номерами от 1 до 16 в случайном порядке (почти как в игре "Пятнашки"). При щелчке на кнопке она должна меняться местами с левой от нее стоящей. Если обмен невозможен, выдавать соответствующее сообщение.

Сказали, что нужно использовать метод sender. Кто решит, пожалуйста обьясните, что это такое.
Ответить с цитированием
  #2  
Старый 26.12.2009, 20:23
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Это не метод, а переменная, передаваемая внутрь обработчика события.
По этой переменной можно определить, какой компонент вызвал это событие. Таким образом, можно написать один обработчик для нескольких однотипных компонентов.

Пример:
Код:
procedure TForm1.ButtonClick(Sender : TObject);
var
  B1, B2 : TButton;
begin
  If (Sender Is TButton) Then
    Begin
      B1 := Sender As TButton;
      ...
    End;
end;
Ответить с цитированием
  #3  
Старый 26.12.2009, 20:52
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

С sender теперь понятно, но программу все равно не могу написать.
Ответить с цитированием
  #4  
Старый 26.12.2009, 21:30
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Несколько непонятно, когда возможен/невозможен обмен.
Для пятнашек понятно. А тут как? Ведь свободного элемента нет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 26.12.2009, 21:34
km_ km_ вне форума
Прохожий
 
Регистрация: 12.12.2009
Сообщения: 41
Репутация: 10
По умолчанию

если мы щелкаем на самый левый button, то обмен невозможен. А в остальных случаях - возможен.

Последний раз редактировалось km_, 26.12.2009 в 21:37.
Ответить с цитированием
  #6  
Старый 26.12.2009, 22:56
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Действительно. Не сообразил.
Вот вам почти рабочий вариант.
Код:
unit Unit36;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm36 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure ButtonClick(Sender: TObject);
   private
    Buttons: Array of TSpeedButton;
  end;

Const
  Rows = 4;
  Cols = 4;
  ButtonSize = 50;

var
  Form36: TForm36;

implementation

{$R *.dfm}

procedure TForm36.ButtonClick(Sender: TObject);
begin
 ShowMessage('Нажата кнопка '+TSpeedButton(Sender).Caption);
end;

procedure TForm36.FormCreate(Sender: TObject);
var
  R,C,n: Integer;
  A: Array of Integer;

 function GetNumber: Integer;
 begin
  while True
  do begin
     n := Random(Rows * Cols);
     if A[n] <> -1
     then begin
          Result := A[n];
          A[n] := -1;
          Break;
          end;
     end;
 end;

begin
 BorderStyle := bsNone;
 KeyPreview := True;
 Randomize;
 SetLength(A, Rows * Cols);
 for n := 0 to Rows * Cols - 1 do A[n] := n + 1;

 for R := 0 to Rows - 1
 do for C := 0 to Cols - 1
    do begin
       SetLength(Buttons, Length(Buttons)+1);
       Buttons[(R * Rows + C)] := TSpeedButton.Create(Self);
       with Buttons[(R * Rows + C)]
       do begin
          Parent := Self;
          Width := ButtonSize;
          Height := ButtonSize;
          Left := C * Width;
          Top := R * Height;
          Caption := IntToStr(GetNumber);
          OnClick := ButtonClick;
          end;
       end;
 Width := ButtonSize * Cols;
 Height := ButtonSize * Rows;
end;

procedure TForm36.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if Key = VK_ESCAPE then Close;
end;

end.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 27.12.2009 в 01:27.
Ответить с цитированием
  #7  
Старый 26.12.2009, 23:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну и собственно сам обмен:
Код:
procedure TForm36.ButtonClick(Sender: TObject);
Var
   i: Integer;
   C: String;
begin
 for i := 0 to Length(Buttons) - 1
 do if Buttons[i] = Sender
    then begin
         if i Mod Cols = 0
         then ShowMessage('Не меняюсь!')
         else begin
              C := TSpeedButton(Buttons[i-1]).Caption;
              TSpeedButton(Buttons[i-1]).Caption := TSpeedButton(Buttons[i]).Caption;
              TSpeedButton(Buttons[i]).Caption := C;
              end;
         Break;
         end;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 27.12.2009 в 11:11.
Ответить с цитированием
  #8  
Старый 27.12.2009, 02:27
Аватар для Ferra
Ferra Ferra вне форума
Местный
 
Регистрация: 12.03.2006
Адрес: Минск
Сообщения: 527
Репутация: 1336
По умолчанию

Читер) не примут у человека такую задачку, ты ж надписи меняешь а не кнопки, а это может быть принципиально.
__________________
Нет повести печальнее на свете, чем повесть о заклиневшем Resete.
Ответить с цитированием
  #9  
Старый 27.12.2009, 11:08
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Визуально, ничем не отличимо, да и не думаю, что это принципиально, а вот по реализации несколько сложнее будет.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:18.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter