动态创建 Delphi 按钮的完整指南:基于配置文件的 `TGridPanel` 实现

news2024/9/23 17:20:11

在 Delphi 开发中,我们经常需要根据不同的配置动态生成 UI 元素。本文将带你通过一个完整的示例,演示如何根据配置文件动态创建按钮,并将它们排列在一个 TGridPanel 中。每个按钮的标题、链接、颜色和大小都将从配置文件中读取。
“C:\myApp\delphi编写的shortcut工具\Project1.dproj”

项目背景

假设你正在开发一个应用程序,它需要根据用户指定的配置文件生成多个按钮。每个按钮不仅具有不同的标题,还会在点击时打开一个指定的链接。同时,按钮的颜色和大小也可以配置。我们将使用 TGridPanel 来自动排列这些按钮,使界面布局美观且具有响应性。

全部代码

unit Unit3;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls,
System.IniFiles, ShellAPI,Math;

type
  TForm3 = class(TForm)
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
    procedure CreateButtonsFromConfig;
    procedure ButtonClick(Sender: TObject);
  public

    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}
procedure TForm3.CreateButtonsFromConfig;
var
  Ini: TIniFile;
  SectionList: TStringList;
  GridPanel: TGridPanel;
  i, Rows, Cols: Integer;
  Button: TButton;
  Caption, Link: string;
  Color: TColor;
  Width, Height: Integer;
begin
  // 加载配置文件
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'buttons.ini');
  SectionList := TStringList.Create;
  try
    // 获取所有按钮的配置节
    Ini.ReadSections(SectionList);

    // 动态创建 GridPanel
    GridPanel := TGridPanel.Create(Self);
    GridPanel.Parent := Self;
    GridPanel.Align := alClient;
    GridPanel.RowCollection.Clear;
    GridPanel.ColumnCollection.Clear;

    // 计算行和列数
    Rows := Ceil(Sqrt(SectionList.Count));  // 根据按钮数量计算行列数
    Cols := Rows;

    // 创建 GridPanel 的行和列
    for i := 0 to Rows - 1 do
      GridPanel.RowCollection.Add;

    for i := 0 to Cols - 1 do
      GridPanel.ColumnCollection.Add;

    // 在每个单元格中添加按钮
    for i := 0 to SectionList.Count - 1 do
    begin
      // 读取按钮的属性
      Caption := Ini.ReadString(SectionList[i], 'Caption', 'Default');
      Link := Ini.ReadString(SectionList[i], 'Link', '');
      Color := StringToColor(Ini.ReadString(SectionList[i], 'Color', 'clBtnFace'));
      Width := Ini.ReadInteger(SectionList[i], 'Width', 100);
      Height := Ini.ReadInteger(SectionList[i], 'Height', 50);

      // 创建按钮
      Button := TButton.Create(Self);
      Button.Parent := GridPanel;
      Button.Caption := Caption;
//      Button.Width := Width;
//      Button.Height := Height;
      Button.Font.Color := Color;
      Button.Align:=alClient;
//      Button.fontColor := Color;
      Button.Tag := i;  // 用于区分不同的按钮
      Button.OnClick := ButtonClick;  // 分配点击事件

      // 将链接存储在按钮的 Hint 属性中,便于在事件中使用
      Button.Hint := Link;

      // 将按钮放置到 GridPanel 的单元格中
      GridPanel.ControlCollection.AddControl(Button, i mod Cols, i div Cols);
    end;
  finally
    Ini.Free;
    SectionList.Free;
  end;
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
CreateButtonsFromConfig;
end;

procedure TForm3.ButtonClick(Sender: TObject);
var
  Link: string;
begin
  Link := (Sender as TButton).Hint;
  if Link <> '' then
    ShellExecute(0, 'open', PChar(Link), nil, nil, SW_SHOWNORMAL);
end;
end.

准备工作

我们首先需要创建一个简单的 .ini 配置文件,其中包含每个按钮的配置信息:

配置文件示例 (buttons.ini)
[Button1]
Caption=Google
Link=https://www.google.com
Color=clRed
Width=100
Height=50

[Button2]
Caption=YouTube
Link=https://www.youtube.com
Color=clBlue
Width=120
Height=60

[Button3]
Caption=OpenAI
Link=https://www.openai.com
Color=clGreen
Width=150
Height=70

这个配置文件定义了三个按钮,每个按钮的标题、链接、颜色、宽度和高度都可以在文件中轻松配置。

实现步骤
  1. 创建 Delphi 项目

    • 在 Delphi IDE 中创建一个新的 VCL Forms Application 项目。
    • FormCreate 事件与我们的核心函数 CreateButtonsFromConfig 关联。
  2. 动态创建 TGridPanel 和按钮

    • 通过 TGridPanel 控件将按钮自动排列在网格中。
    • 从配置文件中读取按钮的属性并动态创建按钮。
  3. 实现按钮点击事件

    • 在点击按钮时,通过调用 ShellExecute 函数打开与按钮相关联的链接。
代码实现

以下是完整的 Delphi 代码示例:

uses
  System.IniFiles, ShellAPI, Vcl.ExtCtrls, Vcl.StdCtrls, System.SysUtils, Vcl.Graphics, Math;

procedure TForm1.CreateButtonsFromConfig;
var
  Ini: TIniFile;
  SectionList: TStringList;
  GridPanel: TGridPanel;
  i, Rows, Cols: Integer;
  Button: TButton;
  Caption, Link: string;
  Color: TColor;
  Width, Height: Integer;
begin
  // 加载配置文件
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'buttons.ini');
  SectionList := TStringList.Create;
  try
    // 获取所有按钮的配置节
    Ini.ReadSections(SectionList);

    // 动态创建 GridPanel
    GridPanel := TGridPanel.Create(Self);
    GridPanel.Parent := Self;
    GridPanel.Align := alClient;
    GridPanel.RowCollection.Clear;
    GridPanel.ColumnCollection.Clear;

    // 计算行和列数
    Rows := Ceil(Sqrt(SectionList.Count));  // 根据按钮数量计算行列数
    Cols := Rows;

    // 创建 GridPanel 的行和列
    for i := 0 to Rows - 1 do
      GridPanel.RowCollection.Add;

    for i := 0 to Cols - 1 do
      GridPanel.ColumnCollection.Add;

    // 在每个单元格中添加按钮
    for i := 0 to SectionList.Count - 1 do
    begin
      // 读取按钮的属性
      Caption := Ini.ReadString(SectionList[i], 'Caption', 'Default');
      Link := Ini.ReadString(SectionList[i], 'Link', '');
      Color := StringToColor(Ini.ReadString(SectionList[i], 'Color', 'clBtnFace'));
      Width := Ini.ReadInteger(SectionList[i], 'Width', 100);
      Height := Ini.ReadInteger(SectionList[i], 'Height', 50);

      // 创建按钮
      Button := TButton.Create(Self);
      Button.Parent := GridPanel;
      Button.Caption := Caption;
      Button.Width := Width;
      Button.Height := Height;
      Button.Font.Color := clWhite;
      Button.Color := Color;
      Button.Tag := i;  // 用于区分不同的按钮
      Button.OnClick := ButtonClick;  // 分配点击事件

      // 将链接存储在按钮的 Hint 属性中,便于在事件中使用
      Button.Hint := Link;

      // 将按钮放置到 GridPanel 的单元格中
      GridPanel.ControlCollection.AddControl(Button, i mod Cols, i div Cols);
    end;
  finally
    Ini.Free;
    SectionList.Free;
  end;
end;

procedure TForm1.ButtonClick(Sender: TObject);
var
  Link: string;
begin
  Link := (Sender as TButton).Hint;
  if Link <> '' then
    ShellExecute(0, 'open', PChar(Link), nil, nil, SW_SHOWNORMAL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CreateButtonsFromConfig;
end;
代码解析
  1. 读取配置文件

    • 使用 TIniFile 类读取 buttons.ini 配置文件。
    • SectionList 用于存储配置文件中的节名(即按钮的配置部分)。
  2. 动态创建 TGridPanel

    • 创建 TGridPanel,并根据按钮数量动态设置网格的行和列。
    • Ceil(Sqrt(SectionList.Count)) 用于计算合适的行列数,以确保按钮均匀分布。
  3. 生成按钮

    • 遍历每个配置节,为每个按钮设置标题、颜色、大小等属性,并将它们添加到 TGridPanel 的指定单元格中。
  4. 按钮点击事件

    • ButtonClick 方法使用 ShellExecute 打开与按钮关联的链接。
运行效果

当程序运行时,按钮会根据配置文件中的信息动态生成,并在 TGridPanel 中自动排列。每个按钮的外观和功能都可以通过简单地修改配置文件来调整,非常适合需要灵活配置 UI 元素的场景。

结果如下

在这里插入图片描述

结论

通过本文的示例,你应该能够掌握如何在 Delphi 中根据配置文件动态生成按钮,并将它们排列在 TGridPanel 中。这种方法不仅增强了程序的可配置性,还使得 UI 的调整变得更加简单和直观。希望本文对你的 Delphi 开发之旅有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2046724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于YOLOv8-pose的手部关键点检测(1)- 手部关键点数据集获取(数据集下载、数据清洗、处理与增强)

前言 手部姿态估计、手势识别和手部动作识别等任务时&#xff0c;可以转化为对手部关键点的分布状态和运动状态的估计问题。本文主要给出手部关键点数据集获取的方式。 总共获取三个数据集&#xff1a; handpose_v2&#xff1a;训练集35W张&#xff0c;验证集2.85W张&#xff1…

vim - vim模式及部分操作

文章目录 一、vim 基本介绍二、vim 的简单使用三、几种常用模式切换四、命令模式和底行模式的操作汇总 一、vim 基本介绍 vim 是一款多模式的编辑器。vim 中有很多子命令来进行代码的编写操作。 同时&#xff0c;vim 提供了不同的模式供我们选择。 在vim下的底行模式下通过:he…

如何查询婚姻状况信息?

1.使用在线查询工具&#xff1a;‌ 现在&#xff0c;‌也有一些在线查询工具&#xff0c;‌如“天远查”“全能查”等微信小程序&#xff0c;‌提供了婚姻状态查询服务。‌这些工具通常需要你提供一些基本信息&#xff0c;‌并可能收取一定的费用。‌在使用这些工具时&#xff…

WebRTC为何成为视频开发领域的首选技术? EasyCVR视频转码助力无缝视频通信

随着互联网的飞速发展&#xff0c;视频通信已成为日常生活和工作中不可或缺的一部分。从在线教育、视频会议到远程医疗、在线直播&#xff0c;视频开发的需求日益增长。在这些应用场景中&#xff0c;选择何种技术来构建视频系统至关重要。 目前&#xff0c;在很多视频业务的开…

文本纠错实现定位与标记

一、基于讯飞文本纠错实现前端标记定位&#xff0c;点击可以联动&#xff01;

VM下kali设置桥接网络

一、查看主机ip 1.winr输入cmd 2.进入终端输入ipconfig 3.查看ip 二、虚拟机网络设置 1.进入vm的虚拟网络编辑器 2.桥接网卡自己选&#xff0c;1是有线网卡2是无线网卡&#xff0c;选择记得点应用 3.虚拟机的网络适配器也要选择桥接模式 三、kali网络配置 1.打开kali终端编辑文…

基于Spring Boot的库存管理系统

TOC springboot265基于Spring Boot的库存管理系统 绪论 1.1 选题动因 在现在社会&#xff0c;对于信息处理方面&#xff0c;是有很高的要求的&#xff0c;因为信息的产生是无时无刻的&#xff0c;并且信息产生的数量是呈几何形式的增加&#xff0c;而增加的信息如何存储以及…

linux下QOS:理论篇

关于qos &#xff0c;也是linux下面必备功能之一&#xff0c;一般只需要结合iptables/etables/iproute2 和tc配合即可实现大部分功能. 网上讲这么方面的资料很多&#xff0c;大部分都讲tc命令的应用.这里就先从理论入手. QoS&#xff08;Quality of Service&#xff09;服务质…

WSL2 使用usbipd工具 连接USB设备

Connect USB devices | Microsoft Learn 使用开源工具usbipd&#xff0c;可以让usb设备连接WSL https://github.com/dorssel/usbipd-win usbipd list 可以查看连接到win上的设备。 把USB设备从win转移到WSL需要执行下面两个指令。 usbipd bind --busid <BUSID> usb…

Shiro-721 分析

前言 shiro-550漏洞的产生源自硬编码问题&#xff0c;在 1.2.4之前&#xff0c;密钥在代码中是固定的 而在1.2.5 < Apache Shiro < 1.4.1&#xff0c;我们再看AbstractRememberMeManager类&#xff0c;已经修改为生成随机的密钥 在本篇文章中&#xff0c;分析着重于代…

电子电气架构---EEA的发展趋势

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

RPA自动化流程机器人在财税管理中的作用

随着科技的飞速发展&#xff0c;人工智能和自动化技术正在改变市场竞争的格局&#xff0c;企业对于提高工作效率和准确性的要求日益提高。财税管理作为企业运营管理的核心环节之一&#xff0c;其数字化程度决定了企业发展的速度、广度和深度。因此&#xff0c;财税数字化成为各…

transformer-explainer

安装和启动 找到这个项目&#xff0c;然后装好了。 这个项目的目的如名字。 https://github.com/poloclub/transformer-explainerTransformer Explained: Learn How LLM Transformer Models Work with Interactive Visualization - poloclub/transformer-explainerhttps:/…

【算法】蚁群算法

一、引言 蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟蚂蚁觅食行为的启发式搜索算法。它由Marco Dorigo于1992年提出&#xff0c;适用于解决组合优化问题&#xff0c;如旅行商问题&#xff08;TSP&#xff09;、车辆路径问题&#xff08;VRP&…

STM32初识

这边软件使用的是Keil5&#xff0c;主要介绍一下使用的一些注意事项。 创建工程部分&#xff1a; 创建工程方式有两种&#xff1a;使用Keil创建工程模板、 使用STM32CubeMX 新建一个工程 1.新建一个文件&#xff0c;添加文件&#xff1a; DOC工程说明 doc说明文档 Librarie…

联想集团2025届校招网申认知能力SHL测评深度解析

引言 随着联想集团校招季的到来&#xff0c;众多求职者正摩拳擦掌&#xff0c;准备在这场竞争激烈的选拔中脱颖而出。认知能力测评作为选拔过程中的重要环节&#xff0c;其重要性不言而喻。本文将对联想集团校招中使用的认知能力测评进行深度解析&#xff0c;为求职者提供全面而…

K8S - ConfigMap的简介和使用

什么是configMap Kubernetes中的ConfigMap 是用于存储非敏感数据的API对象&#xff0c;用于将配置数据与应用程序的镜像分离。ConfigMap可以包含键值对、文件或者环境变量等配置信息&#xff0c;应用程序可以通过挂载ConfigMap来访问其中的数据&#xff0c;从而实现应用配置的…

知识图谱构建实战:GraphRAG与Neo4j的结合之道

前言 我们在前面讲解 GraphRag 从原始文本中提取知识图谱和构建图结构的时候,最后存储的文件是parquet 格式,文件存储在下面文件夹: 这节我们就探索一下怎么将我们生成好的图谱文件导入到我们的 Neo4j 图数据库,最后进行可视化分析,也能和我们之前的项目混合检索结合起来…

Java Web|day7. Web会话跟踪(cookie与session)

Web会话跟踪(cookie与session) 会话&#xff08;Session&#xff09;跟踪是Web程序中常用的技术&#xff0c;用来跟踪用户的整个会话。 cookie 定义 cookie是某些网站为了辨别用户身份&#xff0c;进行Session跟踪而储存在用户本地终端上的数据&#xff08;通常经过加密&am…

虹科应用|增强型以太网交换机:如何实现同IP控制的高效网络管理?

导读&#xff1a;车载以太网交换机的配置和管理是确保数据流高效、安全传输的关键。虹科增强型以太网交换机&#xff08;EES&#xff09;通过其先进的功能&#xff0c;为用户提供了一种灵活且高效的解决方案。 随着车载网络对带宽需求的不断提高&#xff0c;虹科Technica推出一…