|
#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
|
||||
|
||||
Читер) не примут у человека такую задачку, ты ж надписи меняешь а не кнопки, а это может быть принципиально.
Нет повести печальнее на свете, чем повесть о заклиневшем Resete. |
#9
|
||||
|
||||
Визуально, ничем не отличимо, да и не думаю, что это принципиально, а вот по реализации несколько сложнее будет.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |