![Very Happy :D](./images/smilies/icon_biggrin.gif)
Модератор: Модераторы
v-t-l писал(а):http://mirrors.iwi.me/lazarus/ в архиве с исходниками в папке components
Используйте редактор привязок (правая кл. мышки - локальное меню - редактор привязок).
qivi писал(а):Используйте редактор привязок (правая кл. мышки - локальное меню - редактор привязок).
Да я его и использую, о чём и написано выше, в дизайнтайме всё работает, но когда запускаю программу этот компонент игнорирует привязки.
unit uToolButtonShowForm;
{
Класс отображает на ToolBar кнопку, управляющую заданной формой.
Когда форма создана, кнопка появляется на панели. Форма активна - кнопка нажата
Down = true. Форма не активна - кнопка отжата Down = false.
С помощью этого модуля реализуется интерфейс аля IBExpert SDI.
Как это работает:
Положите на главную форму ToolBar и задайте свойство ShowCaptions = true.
Авто создание форм отключите. Вызывайте вторичные формы созданием
что-то вроде
---
if fSecondaryForm = nil then //(1)
fSecondaryForm := TfSecondaryForm.Create(Application);
fSecondaryForm.Show;
---
В событии вторичной формы OnClose пропишите
---
procedure TfSecondaryForm.Close(Sender: TObject; CloseAction: TCloseAction);
begin
//...
CloseAction := caFree;
end;
---
для того, чтобы при закрытии форма разрушалась. В методе Destroy пропишите
---
procedure TfSecondaryForm.Destroy(Sender: TObject);
begin
//...
fSecondaryForm := nil;
end;
---
для того, чтобы при последующем вызове этой формы сработало условие (1)
в раздел uses модуля вторичной формы добавьте модуль uToolButtonShowWindow
к описанию класа формы добавьте поле например ToolButton: TswToolButton;
для создания кнопки используйте конструктор
CreateSWToolButton(Sender: TComponent; const AForm: TForm;
AParrent: TWinControl);
в Sender передайте какой-нибудь компотент на форме, например панель или еще
что-то, не важно, главное, чтобы будущяя кнопка была привязана к чему-то на
форме, чтобы при разрушении формы, а значит и разрушении этого компонента,
кнопка тоже разрушилась.
в AForm передайте TForm(Self), будущая кнопка подхватит Caption формы, сохранит
методы формы OnDeactivate и OnActivate, если они назначены, и назначит форме
свои методы OnDeactivate и OnActivate в которых перед собственными действиями
вызовет методы формы.
При разрушении кнопка вернет методы формы на место.
В AParrent передайте ToolBar на главной форме, на котором и будет отображаться
эта кнопка.
Создавайте кнопку на ToolBar при создании формы
---
procedure TfSecondaryForm.Create(Sender: TObject);
begin
ToolButton := TswToolButton.CreateSFToolButton(Panel {Edit, Grid не фажно},
TForm(Self), FirstForm.ToolBar);
//...
end;
---
Если открыто несколько форм с такими кнопками, то на панели ToolBar будет этих
кнопок несколько. Нажата будет та, форма которой активна, или если не активна ни
одна из форм, то не будет нажата ни одна кнопка. При нажатии на любую из них
будет активирована форма, которой кнопка принадлежит.
}
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, ComCtrls, Forms, Controls //,Dialogs
;
type
TOnProcedure = procedure (Sender: TObject) of object;
type
TsfToolButton = class (TToolButton)
private
FForm: TForm; //Знает какой формой управлять
FDeactivate: TOnProcedure; //Сохраняет метод формы OnDeactivate
FActivate: TOnProcedure; //Сохраняет метод формы Activate
procedure swToolButtonClick(Sender: TObject); //Активирует форму
procedure ReturnForm; //Возвращает форме методы
procedure FormOnDeactivate(Sender: TObject); //Назначается методу формы
procedure FormOnActivate(Sender: TObject); //Назначается методу формы
public
constructor Create(Sender: TComponent); override;
constructor CreateSfToolButton(Sender: TComponent; const AForm: TForm;
AParrent: TWinControl);
destructor Destroy; override;
procedure SetForm(const AForm: TForm);
published
property Form: TForm read FForm write SetForm default nil;
end;
implementation
constructor TsfToolButton.Create(Sender: TComponent);
begin
inherited;
Style := tbsCheck;
Down := true;
OnClick := @swToolButtonClick;
end;
constructor TsfToolButton.CreateSfToolButton(Sender: TComponent;
const AForm: TForm; AParrent: TWinControl);
begin
Create(Sender);
Parent := AParrent;
SetForm(AForm);
end;
destructor TsfToolButton.Destroy;
begin
ReturnForm;
// ShowMessage('ToolButton: ' + #10 + ' - Я Умер');
inherited;
end;
procedure TsfToolButton.swToolButtonClick(Sender: TObject);
begin
if FForm <> nil then
FForm.SetFocus;
end;
procedure TsfToolButton.FormOnDeactivate(Sender: TObject);
begin
if FDeactivate <> nil then
FDeactivate(Sender);
Down := false;
end;
procedure TsfToolButton.FormOnActivate(Sender: TObject);
begin
if FActivate <> nil then
FActivate(Sender);
Down := true;
end;
procedure TsfToolButton.ReturnForm;
begin
FForm.OnDeactivate := FDeactivate;
FForm.OnActivate := FActivate;
FForm := nil;
end;
procedure TsfToolButton.SetForm(const AForm: TForm);
var
s: String;
begin
if FForm <> nil then
ReturnForm;
if AForm <> nil then begin
FForm := AForm;
s := FForm.Caption;
Caption := s;
FDeactivate := FForm.OnDeactivate;
FForm.OnDeactivate := @FormOnDeactivate;
FActivate := FForm.OnActivate;
FForm.OnActivate := @FormOnActivate;
end;
end;
end.
Windows, Messages
LCLIntf, LCLType
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 102