procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Подскажите пожалуйста как можно эту процедуру вызвать из какого-либо участка кода?
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
For i := 1 to 5 do begin
XR := Random (9);
YR := Random (9);
BallR := Random (7);
While Field [XR, YR] = 1 do begin
XR := Random (9);
YR := Random (9);
end;
Field [XR, YR] := 1;
Rect := Form1.StringGrid1.CellRect(XR, YR);
Case BallR of
0 : Form1.StringGrid1.Canvas.Brush.Bitmap := Pink;
1 : Form1.StringGrid1.Canvas.Brush.Bitmap := Green;
2 : Form1.StringGrid1.Canvas.Brush.Bitmap := Yellow;
3 : Form1.StringGrid1.Canvas.Brush.Bitmap := Red;
4 : Form1.StringGrid1.Canvas.Brush.Bitmap := Blue;
5 : Form1.StringGrid1.Canvas.Brush.Bitmap := LightBlue;
6 : Form1.StringGrid1.Canvas.Brush.Bitmap := Brown;
end;
form1.StringGrid1DrawCell(Sender: TObject; XR, YR: Integer; Rect: TRect; State: TGridDrawState);
end;
img := (ArrPanels[2, 2].Components[0] as TImage);
if img <> nil then img.Picture := nil;
Читай комментарии внимательно. Там есть два вопроса для тебя Я очень хотел бы, чтобы ты на них ответил. Это важно.
// В классе формы:
private
{ Private declarations }
function GetIndexes(AImage: TImage; var ALine, ACol: Integer): Boolean;
// ...
// Реализация: пробегаем по всей матрице Panel-ей, и проверяем
// хранящееся в каждой из них изображение (выше мы уже выяснили,
// что Image хранится в списке дочерних компонентов под нулевым номером)
// на равенство тому изображению, по которому щелкнули мышью.
// Если такое изображение найдено - немедленно возвращаем
// его координаты (Line/Col) и выходим. Если ни одно изображение
// не соответствует - функция вернет False, как признак неудачи.
function TForm1.GetIndexes(AImage: TImage;
var ALine, ACol: Integer): Boolean;
var i, j: integer;
begin
result := True;
for i := 0 to Length(arrPanels) - 1 do
for j := 0 to Length(arrPanels[0]) - 1 do
if (arrPanels[i, j].Components[0] as TImage) = AImage then
begin
ALine := i; ACol := j;
Exit;
end;
result := False;
end;
// Вызывать - вот так:
procedure TForm1.myImageClick(Sender: TObject);
var
myParent: TPanel;
Line, Col: integer;
begin
myParent := (Sender as TImage).Parent as TPanel;
// Вызываем функцию с учетом того, что может быть неудача - это нужно делать
// всегда, даже если тебе это кажется невероятным. Мало ли что может произойти,
// лучше добавить if ... then, чем потом сидеть и думать, где ошибка.
// Теперь о том, что передается первым параметром. Как известно, в обработчик
// OnClick передается указатель на тот объект, на котором произошел щелчок мышью.
// Соответственно, и в myImageClick тоже будет передан адрес того объекта (а точнее -
// того изображения), на котором пользователь щелкнул мышью. Вот именно потому, что
// я уверен: "Объект - это именно изображение, и ничего кроме него" (почему я уверен
// в этом - попробуй догадаться и рассказать мне), я и передаю в GetIndexes адрес
// объекта, приведенный к типу TImage... Что произойдет, если вдруг Sender будет
// другого типа - это тоже ты мне расскажешь, договорились?
if GetIndexes(Sender as TImage, Line, Col) then
Memo1.Lines.Add(Format('i = %d, j = %d', [Line, Col])); // Для теста - вывожу в мемо
myParent.OnClick(myParent);
end;
b1 := arrPanels[x,y].Components[0] as TImage;
arrPanels[x,y].Components[0] as TImage := arrPanels[i, j].Components[0] as TImage;
arrPanels[i, j].Components[0] as TImage := b1;
procedure TForm1.Button3Click(Sender: TObject);
// Чтоб не таскать за собой все время эту длинную строку - сокращаем:
function GetPic(i, j: integer): TPicture;
begin
result := (ArrPanels[i, j].Components[0] as TImage).Picture;
end;
// Это процедура копирования изображения из CopyFrom в CopyTo.
// При этом CopyFrom затирается...
procedure CopyPic(CopyTo: TPicture; CopyFrom: TPicture);
begin
CopyTo.Assign(CopyFrom);
CopyFrom := nil;
end;
var
Pic: TPicture;
begin
// А вот теперь - сам обмен, как и с целыми. Только сначала
// надо создать класс нужного типа, а потом его удалить. А так - все как и обычно...
Pic := TPicture.Create;
CopyPic(Pic, GetPic(4, 4));
CopyPic(GetPic(4, 4), GetPic(2, 2));
CopyPic(GetPic(2, 2), Pic);
Pic.Free;
end;