
Модератор: Модераторы

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, MessagesLCLIntf, LCLType
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1