Друг рассказал о случае на своей работе в Канаде:
- У нас тут несколько русских программистов, и пара американцев рядом с
нами сидят. Так один американец долго сидел, слушал русских, потом
спрашивает - "Why do you call Visual Studio `your bunny`"? (почему вы
называете студию "твой кролик" (е банни)
unit uMain;
interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls, Buttons, ExtCtrls;
type
TfmMain = class(TForm)
sgMatrix: TStringGrid;
edEncode: TEdit;
edDecode: TEdit;
btEncode: TSpeedButton;
btDecode: TSpeedButton;
Label1: TLabel;
chAnimation: TCheckBox;
procedure btEncodeClick(Sender: TObject);
procedure btDecodeClick(Sender: TObject);
private{ Private declarations }procedure ClearMatrix; // Очистит матрицуprocedure WriteToMatrix(s: string; bSpiralWriteMode: boolean); // Записываем в матрицуfunction ReadFromMatrix(bSpiralWriteMode: boolean): string; // Считываем из матрицыpublic{ Public declarations }end;
var
fmMain: TfmMain;
implementation{$R *.DFM}// Записываем в матрицуprocedure TfmMain.WriteToMatrix(s: string; bSpiralWriteMode: boolean);
var
c, r, i, iWriteSymbols, iStep, iDirection, iIncStep, iHalfCell, x, y: integer;
pCursor: TPoint;
begin
sgMatrix.Selection := TGridRect(Rect(-1, -1, -1, -1));
GetCursorPos(pCursor);
iHalfCell := sgMatrix.DefaultColWidth div 2; // Половина ширины ячейки// Символы в матрицу вносим по спирали, начиная с центраif bSpiralWriteMode thenbegin
c := 5; // Индекс колонки
r := 5; // Индекс строки
iWriteSymbols := 0; // Кол-во вписанных символов
iStep := 1; // Шаг - кол-во вписываемых символов в одном направлении
iDirection := 0; // Направление: 1 - вверх, 2 - вправо, 3 - вниз, 4 - влево
iIncStep := -1; // Дельта шагаfor i := 1 to Length(s) dobegin
sgMatrix.Cells[c, r] := s[i];
// Визуализироватьif chAnimation.Checked thenbegin
Application.ProcessMessages;
x := fmMain.Left + sgMatrix.Left + sgMatrix.CellRect(c, r).Left + iHalfCell;
y := fmMain.Top + sgMatrix.Top + sgMatrix.CellRect(c, r).Top + iHalfCell + GetSystemMetrics(SM_CYCAPTION);
SetCursorPos(x, y);
sgMatrix.Repaint;
Sleep(30);
end;
inc(iWriteSymbols);
{ Если кол-во символов, которые нужно вписывать в одном
направлении, достигло предела - тогда нужно поворачивать }if iWriteSymbols = iStep thenbegin// Определим следующее направление
inc(iDirection);
if iDirection = 5 then
iDirection := 1;
iWriteSymbols := 0;
Inc(iIncStep);
if iIncStep = 2 thenbegin
inc(iStep);
iIncStep := 0;
end;
end;
// Определим следующую клетку для записиcase iDirection of
1: dec(r);
2: inc(c);
3: inc(r);
4: dec(c);
end;
end; // Вносим по спиралиendelse// Вносим по строкамbegin
i := 1;
for r := 0 to sgMatrix.RowCount - 1 dofor c := 0 to sgMatrix.ColCount - 1 dobegin
sgMatrix.Cells[c, r] := s[i];
inc(i);
// Визуализироватьif chAnimation.Checked thenbegin
Application.ProcessMessages;
x := fmMain.Left + sgMatrix.Left + sgMatrix.CellRect(c, r).Left + iHalfCell;
y := fmMain.Top + sgMatrix.Top + sgMatrix.CellRect(c, r).Top + iHalfCell + GetSystemMetrics(SM_CYCAPTION);
SetCursorPos(x, y);
sgMatrix.Repaint;
Sleep(30);
end;
end;
end;
SetCursorPos(pCursor.x, pCursor.y);
end;
procedure TfmMain.btEncodeClick(Sender: TObject);
const
sMsgLengthCheck = 'Длина текста должна быть равна 121';
var
s: string;
begin
s := Trim(edEncode.Text);
if Length(s) <> 121 thenbegin
MessageDlg(sMsgLengthCheck, mtInformation, [mbOk], 0);
Exit;
end;
edDecode.Text := '';
ClearMatrix;
WriteToMatrix(s, true);
edDecode.Text := ReadFromMatrix(false);
end;
procedure TfmMain.btDecodeClick(Sender: TObject);
const
sMsgLengthCheck = 'Длина текста должна быть равна 121';
var
s: string;
begin
s := Trim(edDecode.Text);
if Length(s) <> 121 thenbegin
MessageDlg(sMsgLengthCheck, mtInformation, [mbOk], 0);
Exit;
end;
edEncode.Text := '';
ClearMatrix;
WriteToMatrix(s, false);
edEncode.Text := ReadFromMatrix(true);
end;
// Очистит матрицуprocedure TfmMain.ClearMatrix;
var
r, c: integer;
beginfor r := 0 to sgMatrix.RowCount - 1 dofor c := 0 to sgMatrix.ColCount - 1 do
sgMatrix.Cells[c, r] := '';
end;
// Считываем из матрицыfunction TfmMain.ReadFromMatrix(bSpiralWriteMode: boolean): string;
var
c, r, i, iWriteSymbols, iStep, iDirection, iIncStep, x, y, iHalfCell: integer;
pCursor: TPoint;
sResult: string;
begin
sgMatrix.Selection := TGridRect(Rect(-1, -1, -1, -1));
GetCursorPos(pCursor);
sResult := '';
iHalfCell := sgMatrix.DefaultColWidth div 2; // Половина ширины ячейкиif bSpiralWriteMode thenbegin
c := 5; // Индекс колонки
r := 5; // Индекс строки
iWriteSymbols := 0; // Кол-во вписанных символов
iStep := 1; // Шаг - кол-во вписываемых символов в одном направлении
iDirection := 0; // Направление: 1 - вверх, 2 - вправо, 3 - вниз, 4 - влево
iIncStep := -1; // Дельта шага
sResult := '';
// Символы из матрицы считываем по спирали, начиная с центраfor i := 1 to 121 dobegin
sResult := sResult + sgMatrix.Cells[c, r];
sgMatrix.Cells[c, r] := '';
// Визуализироватьif chAnimation.Checked thenbegin
Application.ProcessMessages;
x := fmMain.Left + sgMatrix.Left + sgMatrix.CellRect(c, r).Left + iHalfCell;
y := fmMain.Top + sgMatrix.Top + sgMatrix.CellRect(c, r).Top + iHalfCell + GetSystemMetrics(SM_CYCAPTION);
SetCursorPos(x, y);
sgMatrix.Repaint;
Sleep(30);
end;
inc(iWriteSymbols);
{ Если кол-во символов, которые нужно считать в одном
направлении, достигло предела - тогда нужно поворачивать }if iWriteSymbols = iStep thenbegin// Определим следующее направление
inc(iDirection);
if iDirection = 5 then
iDirection := 1;
iWriteSymbols := 0;
Inc(iIncStep);
if iIncStep = 2 thenbegin
inc(iStep);
iIncStep := 0;
end;
end;
// Определим следующую клетку считыванияcase iDirection of
1: dec(r);
2: inc(c);
3: inc(r);
4: dec(c);
end;
end;
endelse// Считываем по строкамbeginfor r := 0 to sgMatrix.RowCount - 1 dofor c := 0 to sgMatrix.ColCount - 1 dobegin
sResult := sResult + sgMatrix.Cells[c, r];
sgMatrix.Cells[c, r] := '';
// Визуализироватьif chAnimation.Checked thenbegin
Application.ProcessMessages;
x := fmMain.Left + sgMatrix.Left + sgMatrix.CellRect(c, r).Left + iHalfCell;
y := fmMain.Top + sgMatrix.Top + sgMatrix.CellRect(c, r).Top + iHalfCell + GetSystemMetrics(SM_CYCAPTION);
SetCursorPos(x, y);
sgMatrix.Repaint;
Sleep(30);
end;
end;
end;
Result := sResult;
SetCursorPos(pCursor.x, pCursor.y);
end;
end.