Выбрать главу

begin

 Resizing:= false;

end;

procedure TForm1.Panel2MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

 if Resizing then begin

  TreeView1.Width:=TreeView1.Width+X;

  // Предохранение от странных ошибок перерисовки при изменении размеров:

  Panel1.Invalidate;

 end;

end;

Код может быть модифицирован для получения горизонтального движка – идея, надеюсь, понятна…

StatusBar

Обработчик события OwnerDraw в компоненте StatusBar

Обработчик должен выглядеть примерно так:

procedure TForm1.StatusBar1DrawPanel(StatusBar: TStatusBar; Paneclass="underline" TStatusPanel; const Rect: TRect);

begin

 with statusbar1.Canvas do begin

  Brush.Color:= clRed;

  FillRect(Rect);

  TextOut(Rect.Left, Rect.Top, 'Панель '+IntToStr(Panel.Index));

 end;

end;

StringGrid

Установка атрибутов –=Только для чтения=– у столбцов компонента StringGrid

Манипулирование вышеуказанным атрибутом возможно в обработчике события OnSelectCelclass="underline"

if Col mod 2 = 0 then grd.Options:= grd.Options + [goEditing]

else grd.Options:= grd.Options – [goEditing];

Помещение изображения в ячейку StringGrid

Возможно ли поместить изображение в одну из ячеек компонента StringGrid?

Такое позволяет обработчик события OnDrawCell. Приводим скелет кода, демонстрирующий принцип вывода изображения в ячейке компонента:

with StringGrid1.Canvas do begin

 {…}

 Draw(Rect.Left, Rect.Top, Image1.Picture.Graphic);

 {…}

end;

Достичь цели позволяют методы Draw() и StretchDraw() объекта TCanvas. В приведенном примере переменная Image1 класса TImage содержит заранее загруженное изображение.

Сохранение и чтение Tstringgrid

Как мне сохранить целый Stringgrid со всеми ячейками в файле?

Procedure SaveGrid;

var f:textfile;

 x,y: integer;

begin

 assignfile(f,'Filename');

 rewrite(f);

 writeln(f,stringgrid.colcount);

 writeln(f,stringgrid.rowcount);

 For x:= 0 to stringgrid.colcount-1 do For y:= 0 to stringgrid.rowcount-1 do writeln(F, stringgrid.cells[x,y]);

 closefile(f);

end;

Procedure LoadGrid;

 var f:textfile;

 temp,x,y:integer;

 tempstr:string;

begin

 assignfile(f,'Filename');

 reset(f);

 readln(f,temp);

 stringgrid.colcount:= temp;

 readln(f,temp);

 stringgrid.rowcount:= temp;

 For x:=0 to stringgrid.colcount-1 do For y:=0 to stringgrid.rowcount-1 do begin

  readln(F, tempstr);

  stringgrid.cells[x,y]:= tempstr;

 end;

 closefile(f);

end;

TabbedNotebook

Добавление элементов управления в TTabbedNotebook и TNotebook

Я несколько раз видел в конференциях вопросы типа "как мне добавить элементы управления в TTabbedNotebook или TNotebook во время выполнения программы?". Теперь, когда у меня выдалось несколько свободных минут, я попытаюсь осветить этот вопрос как можно подробнее:

TTabbedNotebook

Добавление элементов управления в TTabbedNotebook во время проектирования – красивая и простая задача. Все, что Вам нужно – это установить свойство PageIndex или ActivePage на необходимую страницу и начать заполнять ее элементами управления.

Добавление элементов управление во время выполнения приложения также очень просто. Тем не менее, в прилагаемой документации по Delphi вы не найдете рецептов типа Что-и-Как. Видимо для того, чтобы окончательно запутать начинающих программистов, фирма-изготовитель даже не удосужилась включить исходный код TTabbedNotebook в VCL-библиотеку. Таким образом, TTabbedNotebook остается для некоторых тайной за семью печатями. К счастью, я имею некоторый опыт, коим и хочу поделиться.

Первым шагом к раскрытию тайны послужит просмотр файла \DELPHI\DOC\TABNOTBK.INT, интерфейсной секции модуля TABNOTBK.PAS, в котором определен класс TTabbedNotebook. Беглый просмотр позволяет обнаружить класс TTabPage, описанный как хранилище элементов управления отдельной страницы TTabbedNotebook.

Вторым шагом в исследовании TTabbedNotebook может стать факт наличия свойством Pages типа TStrings. В связи с этим отметим, что Delphi-классы TStrings и TStringList соорганизуются с двумя свойствами: Strings и Objects. Другими словами, для каждой строки в TStrings есть указатель на соответствующий Objects. Во многих случаях этот дополнительный указатель игнорируется, нам же он очень пригодится.

После небольшого эксперимента выясняем, что свойство Objects указывает на нашу копию TTabPage и ссылается на имя страницы в свойстве Strings. Блестяще! Всегда полезно знать что ищешь. Теперь посмотрим что мы можем сделать:

{ Данная процедура добавляет кнопку в случайной позиции на }

{ текущей странице данного TTabbedNotebook.                }

procedure AddButton(tabNotebook : TTabbedNotebook);

var

 tabpage: TTabPage;

 button: TButton;

begin

 with tabNotebook do tabpage:= TTabPage(Pages.Objects[PageIndex]);

 button:= TButton.Create(tabpage);

 try

  with button do begin

   Parent:= tabpage;

   Left:= Random(tabpage.ClientWidth – Width);

   Top:= Random(tabpage.ClientHeight – Height);

  end;

 except

  button.Free;

 end;

end;

TNotebook

Операция по заполнению элементами управления компонента TNotebook почти такая же, как и в TTabbedNotebook – разница лишь в типе класса – TPage вместо TTabPage. Тем не менее, если вы заглянете в DELPHI\DOC\EXTCTRLS.INT, декларацию класса TPage вы там не найдете. По неизвестной причине Borland не включил определение TPage и в DOC-файлы, поставляемые с Delphi. Декларация TPage в EXTCTRLS.PAS (можно найти в библиотеке VCL-исходников), правда, расположена в интерфейсной части модуля. Мы восполним пропущенную информацию о классе TPage:

TPage = class(TCustomControl)

private

 procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;

protected

 procedure ReadState(Reader: TReader); override;