首页 > 其他分享 >lazarus多窗口(delphi的MDI)的demo

lazarus多窗口(delphi的MDI)的demo

时间:2024-09-05 09:48:34浏览次数:8  
标签:begin MDI end Sender delphi 多窗口 Form1 ATTabs1 procedure

lazarus不支持delphi的mdi模式,经测试可以用ATTabs控件来实现这个功能比较简单。
1、安装ATTabs控件(https://github.com/Alexey-T/ATFlatControls/)
2、mainform FormCreate的代码:

procedure TMainForm.FormCreate(Sender: TObject);
begin
  //默认的是深色,如果需要,可按以下方法设置ATTabs的颜色
  ATTabs1.ColorBg:=clWhite;
  ATTabs1.ColorTabActive:=clMoneyGreen;
  ATTabs1.ColorTabPassive:=clWhite;
  ATTabs1.ColorFont:=clBlack;
  ATTabs1.ColorFontActive:=clBlack;
  ATTabs1.ColorTabOver:=clred;
  ATTabs1.ColorFontHot:=clwhite;

MainForm生成及调用tab

procedure TMainForm.N142Click(Sender: TObject);
var
  NIndex: integer;
  d: TATTabData;
begin
    if ATTabs1.FindTabByObject(Form1)=-1 Then
    begin
      Form1 := TForm1.Create(self);
      NIndex := ATTabs1.TabIndex;
      Dec(NIndex);
      ATTabs1.AddTab(NIndex,
        N142.Caption,//在Tab显示的文字
        Form1,
        False
        );
      Form1.Parent := Panel1;
      Form1.Align := alClient;
      Form1.Show;
      ATTabs1.TabIndex:=ATTabs1.FindTabByObject(Form1);
    end
    else
    begin
      ATTabs1.TabIndex:=ATTabs1.FindTabByObject(Form1);
      d := ATTabs1.GetTabData(ATTabs1.TabIndex);
      (d.TabObject as TForm).show;
    end;
end;

main close时的处理:

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
  i:Integer;
begin
  if ATTabs1.TabCount>0 Then
  begin
    if application.messagebox(
      '有项目已打开!是否退出?',
      '讯息', MB_YESNO) = idNo then canclose := False
    else
    Begin
      if ATTabs1.TabCount>-1 then
      begin
        for  i:=ATTabs1.TabCount-1 downto 0 do
        begin
          tform(ATTabs1.GetTabData(i).TabObject).close;
        end;
      end;
    end;
  end;
end;

在unit1 close时要注意mainform.ATTabs1.DeleteTab(mainform.ATTabs1.TabIndex,False,false)的用法。 

unit Unit1;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private

  public
    ButtonClose:Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}
uses main;
{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  ButtonClose:=False;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  if ButtonClose then//注意:只有按Button1按键时才执行以下代码
    mainform.ATTabs1.DeleteTab(mainform.ATTabs1.TabIndex,False,false);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ButtonClose:=true;
  Close;
end;

end.

demo完整代码及控件下载:
https://www.123pan.com/s/6OFxjv-LWdu3?提取码:oxrN

标签:begin,MDI,end,Sender,delphi,多窗口,Form1,ATTabs1,procedure
From: https://www.cnblogs.com/qiufeng2014/p/18397769

相关文章

  • delphi开发Excel用户定义函数
    在Delphi中开发Excel用户定义函数(User-DefinedFunction,UDF)通常涉及到以下几个关键步骤:1.**创建DLL文件**-使用Delphi编写一个动态链接库(DLL),其中包含要作为ExcelUDF的函数。函数必须遵循特定的签名规范,以便Excel能够识别和调用。示例UDF函数:```delphilibr......
  • 众程序员-针对Delphi学习的讨论
    A君:我是delphi程序员,学delphi一直使我心不安!虽然delphi让我很快的进入编程的天堂!但是太多的原因让我转想C++,delphi在编程界里面永远只能做低层人员不被重视!工资也越来越少!B君:要知道高手,即使是木棒在他手里也会变成剑的道理。Delphi学精了,学BCB很容易。C君:C++是面......
  • delphi操作excell文件实现学生均衡分班
    unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,System.Win.ComObj;typeTForm1=class(TForm)Button1:TButton;......
  • 达梦数据库在Delphi10.3上的安装与连接
          ......
  • delphi初级教程之delphi断点调试一
    所谓断点,就是在程序代码的某一行上设置一个标记,程序执行到这里将暂停,由调试器接管对程序的控制。使用断点与使用【RuntoCursor】命令有些相似,都是执行到某一行后暂停。不同的是,程序中可以设置多个断点并且能够给断点设置条件。断点通常设置在有疑点的区域。在遇到断点之前,程序......
  • delphi debug 输出
    在Delphi中,你可以使用OutputDebugString函数将调试信息发送到调试器。这个函数是WindowsAPI的一部分,可以在任何使用WindowsAPI的Delphi应用程序中使用。以下是一个简单的例子,展示如何使用OutputDebugString来输出调试信息:usesWindows;procedureTForm1.Button1Click(Se......
  • 在Delphi中:如何在调试时跳过部分代码?
    在Delphi中调试时,我经常无意地进入我不感兴趣的代码。让我们首先说,我知道您可以使用F8,并且可以使用f4运行到特定的行。示例:functionTMyClass.DoStuff():Integer;begin//dosomestuffbla();end;procedureTMyClass.Foo()beginifDoStuff()=0then//pressF7......
  • delphi dxCameraControl控件(拍照)
    拍照演示DevExpressVCL组件之一 TdxCameraControlObjectHierarchy  Properties  Methods  Events 一个摄像头控件Unit dxCameraControl Syntax TdxCameraControl= class(TdxCustomCameraControl) Descrition 该控件允许您捕捉视频或图像从内......
  • delphi 里的 in 集合 语法
    在Delphi中,In关键字用于检查一个元素是否存在于一个集合中。这在处理枚举类型或集合类型时非常有用。下面是一个使用In关键字的基本示例,演示如何检查某个值是否属于一个枚举或集合。首先,假设我们有一个枚举类型:typeTDays=(Monday,Tuesday,Wednesday,Thursday,Frid......
  • 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
    非科班出身,现在才接触汇编,惭愧呀,好好学!主选课本是清华大学王爽老师的《汇编语言》.推荐 王爽老师的汇编网汇编语言之前是机器语言.机器语言是机器指令的集合,机器指令是一系列二进制数字,计算机将之转换为一系列高低电平,而实现运算.在PC机上运行机器指令的是CPU;......