![]() |
|
|
#1
|
|||
|
|||
|
Вот условие: Расположите на форме компоненты TButton, в виде таблицы 4х4, с номерами от 1 до 16 в случайном порядке (почти как в игре "Пятнашки"). При щелчке на кнопке она должна меняться местами с левой от нее стоящей. Если обмен невозможен, выдавать соответствующее сообщение.
Сказали, что нужно использовать метод sender. Кто решит, пожалуйста обьясните, что это такое. |
|
#2
|
|||
|
|||
|
Это не метод, а переменная, передаваемая внутрь обработчика события.
По этой переменной можно определить, какой компонент вызвал это событие. Таким образом, можно написать один обработчик для нескольких однотипных компонентов. Пример: Код:
procedure TForm1.ButtonClick(Sender : TObject);
var
B1, B2 : TButton;
begin
If (Sender Is TButton) Then
Begin
B1 := Sender As TButton;
...
End;
end; |
|
#3
|
|||
|
|||
|
С sender теперь понятно, но программу все равно не могу написать.
![]() |
|
#4
|
||||
|
||||
|
Несколько непонятно, когда возможен/невозможен обмен.
Для пятнашек понятно. А тут как? Ведь свободного элемента нет. |
|
#5
|
|||
|
|||
|
если мы щелкаем на самый левый button, то обмен невозможен. А в остальных случаях - возможен.
Последний раз редактировалось km_, 26.12.2009 в 21:37. |
|
#6
|
||||
|
||||
|
Действительно.
Не сообразил.Вот вам почти рабочий вариант. Код:
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
|
||||
|
||||
|
Ну и собственно сам обмен:
Код:
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
|
||||
|
||||
|
Читер) не примут у человека такую задачку, ты ж надписи меняешь а не кнопки, а это может быть принципиально.
|
|
#9
|
||||
|
||||
|
Визуально, ничем не отличимо, да и не думаю, что это принципиально, а вот по реализации несколько сложнее будет.
|