Здравствуйте, уважаемые подписчики! На этот раз я затрону сразу два небольших вопроса:
1. Панели управления, превращающиеся в окна при их перетаскивании.
2. Фон отдельных ячеек в StringGrid.
1. Во многих программах используют панели инструментов, которые можно перемещать друг относительно друга, а при попытке "перетащить" такую панель далеко, она превращается в отдельное окно. При перемещении этого окна на старое место, панель принимает стандартный вид.
К сожалению, так просто реализовать это можно только в Delphi5 и выше. Я прошу прощения у всех тех, кто пользуется более ранними версиями Delphi.
Для создания панелей в двумя полосами слева, которые можно двигать друг относительно друга, используют компонент ControlBar (вкладка Additional), на котором обычно размещают один или несколько ToolBar (вкладка Win32). Чтобы сделать возможным "вытаскивание" панели из ControlBar нужно написать следующий код:
procedure TForm1.FormCreate(Sender: TObject);
begin
ToolBar1.DockSite := true;
ToolBar1.DragKind := dkDock;
ToolBar1.DragMode := dmAutomatic;
end;
procedure TForm1.ControlBar1DockOver(Sender: TObject;
Source: TDragDockObject; X, Y: Integer; State: TDragState;
var Accept: Boolean);
begin
Accept := (Source.Control is TToolBar);
if Accept then with Source.DockRect do begin
TopLeft := ControlBar1.ClientToScreen(ControlBar1.ClientRect.TopLeft);
Right := Left + Source.Control.Width;
Bottom := Top + Source.Control.Height;
end;
end;
Вы можете убрать метод FormCreate, установив нужные свойства компонента ToolBar1 на стадии разработки при помощи Object Inspector.
2. Часто не хватает возможностей компонентов TStringGrid и TDrawGrid. В этом случае можно воспользоваться событием OnDrawCell для рисования произвольных изображений в ячейках таблицы. Каждый раз, когда нужно вывести на экран какую-то ячейку, вызывается событие OnDrawCell. В качестве параметров сообщаются строка и столбец, координаты и размеры ячейки, а также ее состояние (выделение, фокус, стационарность).
Здесь в методе FormCreate происходит заполнение таблицы случайными строками. Поэтому эту часть кода Вы можете убрать.
procedure TForm1.FormCreate(Sender: TObject);
var
x, y, i: integer;
s: string;
begin
randomize;
for y := 0 to StringGrid1.RowCount - 1 dofor x := 0 to StringGrid1.ColCount - 1 do begin
s := '';
for i := 0 to random(20) do
s := s + chr(ord('a') + random(26));
StringGrid1.Cells[x,y] := s;
end;
end;
const
colors: array [0..4] of TColor = (clLime, clAqua, clFuchsia, clSilver, clYellow);
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
beginif (ARow >= 1) and (ACol >= 1) then with StringGrid1.Canvas do begin
Brush.Color := colors[(ARow + ACol) mod 5];
FillRect(rect);
Font := StringGrid1.Font;
TextOut(rect.left + 2, rect.top + 2, StringGrid1.cells[ACol, ARow]);
end;
end;