procedure TForm1.PanelArrayMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
GetCursorPos(pos);
if ((pos.X>PanelArray.Left) and (pos.Y>PanelArray.Top)) then
PanelArray.Color:=clRed;
end;
Выделение панелей
PanelArray:=TPanel.Create(Self);
Нужно, чтобы при наведении курсора мыши на любую из панелей, она изменяла свои свойства, например меняла цвет.
Что-то типа:
Код:
Только это не работает. Если обработчик сделать для формы, то тоже не работает, потому что когда курсор на панели, то форма его не видит. Как вариант придумал выделять панель, когда курсор попадает в некую область вокруг панели, но это работает плохо, потому что панели могут соприкасаться и тогда выделяются сразу 2 панели.
Как еще можно решить эту проблему?
Код:
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure OC(Sender:TObject);
public
PanelArray: array [1..50] of TPanel;
pos:TPoint;
var
Form1: TForm1;
procedure TForm1.OC(Sender:TObject);
var
i:integer;
begin
GetCursorPos(pos);
if (Sender is TPanel) then for i:=1 to 20 do
begin
if (((pos.X-Form1.Left)>PanelArray.Left) and ((pos.Y-Form1.Top)>PanelArray.Top)) then
PanelArray.Color:= clBlue
else PanelArray.Color:= clYellow;
end;
end;
procedure FormShow(Sender: TObject);
var
i,a,b:integer;
begin
a:=20;
b:=20;
for i:=1 to 20 do
begin
PanelArray:= TPanel.Create(Self);
PanelArray.Width:=25;
PanelArray.Height:=25;
PanelArray.Left:=a;
PanelArray.Top:=b;
a:=a+PanelArray.Width+2;
PanelArray.Parent:=Form1;
PanelArray.OnMouseEnter:=OC;
PanelArray.Caption:=IntToStr(i);
if a+PanelArray.Width>(Form1.Width) then
begin
a:=20;
b:=b+PanelArray.Height+2;
end;
end;
end;
end.
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure OC(Sender:TObject);
public
PanelArray: array [1..50] of TPanel;
pos:TPoint;
var
Form1: TForm1;
procedure TForm1.OC(Sender:TObject);
var
i:integer;
begin
GetCursorPos(pos);
if (Sender is TPanel) then for i:=1 to 20 do
begin
if (((pos.X-Form1.Left)>PanelArray.Left) and ((pos.Y-Form1.Top)>PanelArray.Top)) then
PanelArray.Color:= clBlue
else PanelArray.Color:= clYellow;
end;
end;
procedure FormShow(Sender: TObject);
var
i,a,b:integer;
begin
a:=20;
b:=20;
for i:=1 to 20 do
begin
PanelArray:= TPanel.Create(Self);
PanelArray.Width:=25;
PanelArray.Height:=25;
PanelArray.Left:=a;
PanelArray.Top:=b;
a:=a+PanelArray.Width+2;
PanelArray.Parent:=Form1;
PanelArray.OnMouseEnter:=OC;
PanelArray.Caption:=IntToStr(i);
if a+PanelArray.Width>(Form1.Width) then
begin
a:=20;
b:=b+PanelArray.Height+2;
end;
end;
end;
end.
Кое-что тут нужно еще подправить, но в целом работает. Проблема решена.
Спасибо всем, кто прочитал.