Forum > Portuguese

Atribuir evento no onClick em tempo de execução

(1/1)

Alessandro Busanello:
Saudações developers!!!

Esta é a minha primeira postagem aqui no fórum.

A minha questão é a seguinte: estou desenvolvendo um sistema com modelagem TDI utilizando PageControl e para facilitar a reutilização de código desenvolvi uma procedure que fica em uma unit exclusiva para esta finalidade. Nesta unit eu criei uma classe para as TabSheets onde eu chamarei os forms. Até aí está funcionando bem, porém esbarrei em um problema, o botão fechar na aba. Como o Lazarus não permite utilizar o OwnerDraw no PageControl eu não consegui desenhar o botão fechar na aba, mas para contornar isso coloquei um Panel que fica na parte superior e da TabSheet e nele eu criei o botão fechar. Novamente, até aí funcionando bem.
O meu problema está na hora de atribuir a procedure para fechar a TabSheet no evento onClick do botão. Li algumas referências sobre o assunto, entretanto ainda não consegui uma forma de fazer funcionar.

Para facilitar estou postando o código


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---unit ExpertTabSheet; interface uses  Windows, Classes, ExtCtrls, Dialogs, ComCtrls, Forms, Buttons,  Controls, SysUtils, Themes, UxTheme, Graphics; type ETabSheet = Class (TTabSheet)  private   protected   public    constructor Create(AOwner: TComponent); override;    destructor Destroy; override;end;   procedure OpenWindowTab(PageControl: TPageControl; FormClass: TFormClass; MultiTab: Boolean);  procedure ClickEvent(Sender: TObject); implementation constructor ETabSheet.Create(AOwner:TComponent);begin  inherited Create(AOwner);end; destructor ETabSheet.Destroy;begin  inherited Destroy;end; procedure OpenWindowTab(PageControl: TPageControl; FormClass: TFormClass; MultiTab: Boolean);var  i: Integer;  Form: TForm;  TabSheet: ETabSheet;  ShiftOn: TShiftState;  PPointer: TPoint;  btnClose: TSpeedButton;  TitleBar, ButtonsSet: TPanel;begin  try    //Cria a TabSheet    TabSheet := ETabSheet.Create(PageControl);     //Verifica se o form já foi criado    Form := FormClass.Create(TabSheet);    for i := 0 to PageControl.ControlCount -1 do    if (PageControl.Pages[i].Caption = Form.Caption) and (MultiTab = False) then      begin        PageControl.ActivePageIndex := i;        exit;      end;     //Cria o Form    TabSheet.PageControl := PageControl;    Form := FormClass.Create(TabSheet);    Form.Parent := TabSheet;     //Cria uma barra de títulos para a TabSheet    TitleBar := TPanel.Create(TabSheet);    TitleBar.Parent := TabSheet;    TitleBar.Align := alTop;    TitleBar.Height := 22;    TitleBar.Caption := Form.Caption;    TitleBar.Color := clWindow;    TitleBar.Visible := True;     //Propriedade do Form    Form.Align := alClient;    Form.BorderStyle := bsNone;    Form.Visible := True;    TabSheet.Caption := Form.Caption;     //Cria um container para os botões    ButtonsSet := TPanel.Create(TitleBar);    ButtonsSet.Parent := TitleBar;    ButtonsSet.Align := alRight;    ButtonsSet.Caption := '';    ButtonsSet.Width := 80;    ButtonsSet.BorderSpacing.Right := 1;    ButtonsSet.BiDiMode := bdRightToLeft;    ButtonsSet.BorderStyle := bsNone;    ButtonsSet.BevelInner := bvNone;    ButtonsSet.BevelOuter := bvNone;    ButtonsSet.Anchors := [akTop,akRight];    ButtonsSet.Color := clNone;    ButtonsSet.Visible := True;     //Cria o botão para fechar a TabSheet    btnClose := TSpeedButton.Create(ButtonsSet);    btnClose.Parent := ButtonsSet;    btnClose.Width := 19;    btnClose.Height := 19;    btnClose.Left := 60;    btnClose.BorderSpacing.Around := 1;    btnClose.BorderSpacing.InnerBorder := 0;    btnClose.BorderSpacing.CellAlignHorizontal := ccaCenter;    btnClose.BorderSpacing.CellAlignVertical := ccaCenter;    btnClose.Align := alNone;    btnClose.Anchors := [akTop,akRight];    btnClose.Caption := 'X';    btnClose.Hint := 'Fechar aba';    btnClose.Transparent := True;    btnClose.ShowHint := True;    btnClose.Visible := True;    btnClose.OnClick := @ClickEvent;     //Coloca o foco na TabSheet aberta    PageControl.ActivePage := TabSheet;    Form.SetFocus;  except    Form.Free;  end;end; procedure ClickEvent(Sender: TObject);begin  ShowMessage('Aqui fica a rotina para destruir a TabSheet e o Form');end;  initialization  ETabSheet.ClassName; end. 

lucamar:
Excluir uma TTabSheet é tão simples quanto isto:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure CloseTab(const ATab: TTabSheet);begin  if Assigned(ATab) then begin    {Se houver controles cujo proprietário (Owner)     não seja o TabSheet, faça Free aqui}    ATab.Free;  end;end;
Traduzido pelo Google ;)

Alessandro Busanello:
Ótimo lucamar, obrigado pela contribuição.
Mais uma questão: para eu atribuir essa procedure no evento onclick do botão fechar, basta eu atribui-la, tipo

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---...BotaoFechar.onClick := @CloseTab(minhaTabSheet);...
Seria somente isso ou há mais algum cuidado que devo tomar para poder chamar essa procedure no botão fechar?




--- Quote from: lucamar on July 22, 2021, 02:03:45 am ---Excluir uma TTabSheet é tão simples quanto isto:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure CloseTab(const ATab: TTabSheet);begin  if Assigned(ATab) then begin    {Se houver controles cujo proprietário (Owner)     não seja o TabSheet, faça Free aqui}    ATab.Free;  end;end;
Traduzido pelo Google ;)

--- End quote ---

pauloh0:
Olá se entendi bem é um clique em Runtime que voce precisa:

BitBtn2Click(self);
ou
BitBtn2Click(nil);

Navigation

[0] Message Index

Go to full version