一个可以使用checkbox,radiobutton的Listview的源码

控件库中的Checkbox复选框和RadioButton单选按钮控件简述 复选框:复选框用于勾选或者勾掉某一个选项,在后台代码中表现为一个布尔型值,使用ISChecked=”True”属性设置默认勾选,再没别的属性好用的了 阅读详情

该代码实现了基本的功能,

但是只能在一行上画一个button。但是可以通过修改代码来实现(drawcell)。

 

从component->install component编译该文件,会在控件面板中生成Mycontorls面板,因为代码:

RegisterComponents(´MyControls´, [TStringGridEx]);







unit StringGridEx;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Grids;

type TBtns = (CheckBoxes,RadioButtons);

type
  TStringGridEx = class(TStringGrid)
  private
    { Private declarations }
    FTickCol:Integer;
    FShowTick:Boolean;
    FSelArray:Array of Boolean;
    FSelRows:Array of TStrings;
    FRowHeight:integer;
    FDblClick:TNotifyEvent;
    FSelectCell:TSelectCellEvent;
    FBtns : TBtns;
    IsDblClicked:Boolean;
    FTitles:TStrings;

    procedure SetTickCol(Value : integer);
    procedure SetShowTick(Value : Boolean);
    procedure SetRowHeight(Value:Integer);
    procedure SetBtns(Value : TBtns);
    procedure SetRowSelected(RowIndex:integer;Value:Boolean);
    procedure DoSelectCell(Sender: TObject; ACol, ARow: Longint;
     var CanSelect: Boolean);
    procedure DoDblClick(Sender:TObject);

    function GetCurrentRow:integer;
    function GetRowSelected(RowIndex : Integer):Boolean;
    function GetSelCells(ColIndex,RowIndex:integer):String;
    function GetSelCnt:Integer;
    procedure SetTitles(Value : TStrings);
  protected
    { Protected declarations }
    procedure SizeChanged(OldColCount, OldRowCount: Longint);override;
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
      AState: TGridDrawState);override;
  public
    { Public declarations }
    constructor Create(AOwner:Tcomponent);override;
    destructor Destroy;override;
    property ColWidths;
    property RowHeights;

    procedure SelectAll;
    procedure UnSelectAll;

    property CurrentRow :Integer read GetCurrentRow;
    property SelectCount:Integer read GetSelCnt;
    property RowSelected[RowIndex:Integer]:Boolean read GetRowSelected write SetRowSelected;
    property CellsOfSelection[Col,Row:Integer]:String read GetSelCells;

  published
    { Published declarations }
    property ShowTick:Boolean read FShowTick write SetShowTick default false;
    property TickCol:integer read FTickCol write SetTickCol default -1;
    property TickButton : TBtns read FBtns write SetBtns default CheckBoxes;
    property Titles:TStrings read FTitles write SetTitles;
    property RowHeight:Integer read FRowHeight write SetRowHeight default 18;

    property OnCellDblClick:TNotifyEvent read FDblClick write FDblClick;
    property OnCellSelected:TSelectCellEvent read FSelectCell write FSelectCell;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(´MyControls´, [TStringGridEx]);
end;

constructor TStringGridEx.Create(AOwner:Tcomponent);
var i:integer;
begin
  inherited;
  FTitles := TStringList.Create;
  FTitles.Clear;
  SetLength(FSelArray,RowCount);
  SetLength(FSelRows,RowCount);
  for i:=0 to Rowcount-1 do
   FSelRows[i] := TStringList.Create;
  IsDblClicked := False;
  OnDblClick := DoDblClick;
  OnSelectCell := DoSelectCell;
  for i:=0 to RowCount -1 do
    if FRowHeight < RowHeights[i] then FRowHeight := RowHeights[i];
end;

destructor TStringGridEx.Destroy;
var i:integer;
begin
  for i:=0 to RowCount-1 do
   FSelRows[i].Free;
  FTitles.Free;
  inherited;
end;

procedure TStringGridEx.DrawCell(ACol, ARow: Longint; ARect: TRect;
  AState: TGridDrawState);
var Checked:Boolean;
const
  CheckBox : array[Boolean] of Integer = (DFCS_BUTTONCHECK,
  DFCS_BUTTONCHECK or DFCS_CHECKED);
  RadioButton : array[Boolean] of Integer = (DFCS_BUTTONRADIO,
  DFCS_BUTTONRADIO or DFCS_CHECKED);
begin

  inherited DrawCell(ACol, ARow,ARect,AState);
  if FShowTick and (ACol = FTickCol) and (ARow >= FixedRows) then 
  begin
    Checked := FSelArray[ARow];
    Canvas.FillRect(ARect);
    if FBtns = CheckBoxes then
      DrawFrameControl(Canvas.Handle,ARect,DFC_BUTTON,
          CheckBox[Checked])
    else
    DrawFrameControl(Canvas.Handle,ARect,DFC_BUTTON,
        RadioButton[Checked]);
  end;

end;

procedure TStringGridEx.SetTickCol(Value : Integer);
begin
  FTickCol := Value;
end;

procedure TStringGridEx.SetShowTick(Value : Boolean);
begin
  FShowTick := Value;
end;

function TStringGridEx.GetRowSelected(RowIndex : Integer):Boolean;
begin
  Result := FSelArray[RowIndex];
end;

procedure TStringGridEx.SetRowSelected(RowIndex:integer;Value:Boolean);
var i:integer;
begin
  Row := RowIndex;
  if Value then begin
    FSelRows[RowIndex].Clear;
    for i:=0 to ColCount-1 do
     FSelRows[RowIndex].Add(Cells[i,RowIndex]);
  end;
  FSelArray[RowIndex] := Value;
end;

function TStringGridEx.GetCurrentRow : Integer;
begin
  Result := Row;
end;

procedure TStringGridEx.DoDblClick(Sender : TObject);
begin
  if FShowTick and (Col = FTickCol) then
    FSelArray[Row] := not FSelArray[Row];
  If FSelArray[Row] then
    SetRowSelected(Row,FSelArray[Row]);
  if Assigned(FDblClick) then FDblClick(Sender);
  IsDblClicked := True;
end;

procedure TStringGridEx.DoSelectCell(Sender: TObject; ACol, ARow: Longint;
    var CanSelect: Boolean);
var i:integer;
begin
  if IsDblClicked then
  begin
   if FShowTick and (ACol = FTickCol) then
    FSelArray[ARow] := not FSelArray[ARow];
  end;
  If FSelArray[ARow] then begin
    FSelRows[ARow].Clear;
    for i:=0 to ColCount-1 do
     FSelRows[ARow].Add(Cells[i,ARow]);
  end;
  if Assigned(FSelectCell) then FSelectCell(Sender,ACol,ARow,CanSelect);
end;

procedure TStringGridEx.SetRowHeight(Value : Integer);
var i:integer;
begin
  for i:=0 to RowCount -1 do
    RowHeights[i] := Value;
  FRowHeight := Value;
  Invalidate;
end;

procedure TStringGridEx.SetBtns(Value : TBtns);
begin
  FBtns := value;
  Invalidate;
end;

procedure TStringGridEx.SizeChanged(OldColCount, OldRowCount: Longint);
var i:integer;
begin
  inherited SizeChanged(OldColCount,oldRowCount);
  SetLength(FSelArray,RowCount);
  if RowCount<>OldrowCount then
   for i:=0 to OldRowCount-1 do
     FSelRows[i].Free;
  SetLength(FSelRows,RowCount);
  for i:=0 to Rowcount-1 do
   FSelRows[i] := TStringList.Create;
  IsDblClicked := False;
end;

procedure TStringGridEx.SelectAll;
var i:integer;
begin
  for i:=1 to RowCount-1 do
  begin
    SetRowSelected(i,True);
  end;

  IsDblClicked := False;
  Row := 0;
  invalidate;
end;

procedure TStringGridEx.UnSelectAll;
var i:integer;
begin
  for i:=1 to RowCount-1 do
  begin
    SetRowSelected(i,False);
    FSelRows[i].Clear;
  end;

  Row :=0;
  IsDblClicked := False;
  invalidate;
end;

procedure TStringGridEx.SetTitles(Value : TStrings);
begin
  if FTitles<>Value then FTitles.Assign(Value);
  Rows[0].Assign(Ftitles);
  Invalidate;
end;

function TStringGridEx.GetSelCells(ColIndex,RowIndex:integer):String;
var i,SelRow:integer;
begin
  SelRow := 0;
  for i:=1 to RowCount-1 do
  begin
   if RowSelected[I] then inc(SelRow);
   if SelRow = RowIndex then Break;
  end;
  Result := FSelRows[i].Strings[ColIndex];
end;

function TStringGridEx.GetSelCnt:Integer;
var i,R:integer;
begin
  R:=0;
  for i:=0 to Rowcount-1 do
   if RowSelected[i] then Inc(R);
  Result := R;
end;

end.

Toggle和ToggleGroup Toggle它是 UI 逻辑的“微控制器”:不绘制任何界面,纯粹管理一组Toggle控件的行为(互斥选中)。它是属性框架的“展示橱窗”:将所有底层抽象(可观察列表、属性包装器、双向绑定、否决列表、扩展属性)融合为一个完整、可用的业务组件。它是控件库的“基石”和的属性正是通过这个类来协作的。它是 MVC 模式的典型 Model/ViewModel:封装了状态(toggles)和业务逻辑(、互斥规则),并暴露可观察属性供 View 层绑定。维度结论作用本质。 阅读详情

相关推荐

C# Winform控件递归遍历与参数读取:从原理到实战的完整指南

在C# Winform开发中,递归遍历是处理复杂控件层次结构的基础技术,它通过深度优先搜索(DFS)算法系统地访问窗体中的每个控件,包括嵌套在Panel、GroupBox等容器内的子控件。这项技术的核心价值在于实现对UI元素的全面“透视”与“掌控”,为自动化测试、界面配置管理、动态UI分析等高级功能提供数据基础。结合反射机制,开发者可以精准读取控件的关键属性参数,如状态、布局和业务数据。在实际工程实践中,需特别注意处理TabControl、MenuStrip、DataGridView等特殊控件,并权衡反射操

weixin_30954265的博客 365

一個可以顯示CheckBox或RadioButtons的StringGrid類.

unit StringGridEx;interfaceuses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  Grids;type TBtns = (CheckBoxes,RadioButtons);type  TStringGridEx = class(TStringGrid

Maskman的专栏 1068

深入理解Android基本视图组件:CheckBox及其实战应用

CheckBox在Android用户界面设计中扮演着重要的角色,它允许用户在两个状态之间切换,通常用于表单数据的收集。一个CheckBox可以被选中或未选中,多用于实现多选功能。在许多应用场景中,例如设置选项的选择、偏好配置等,开发者都需要使用到CheckBox来收集用户的明确选择。通过对Java代码中CheckBox的事件处理方法进行深入学习,开发者可以更好地理解如何构建交互性更强的Android应用程序。

weixin_35835030的博客 908

C#窗体应用程序之单选RadioButton按钮控件与复选CheckBox框控件

1RadioButton 单选按钮控件 多个 RadioButton 控件可以为一组,这一组内的 RadioButton 控件只能有一个被选中。 同样我们新建一个界面, 单击确定按钮,进入button的功能函数,代码区写入以下代码, private void Button1_Click(object sender, EventArgs e) { string msg = ""; if (radioButton1.Checked)

weixin_46096032的博客 7466

C#_winform_动态生成RadioButton和CheckBox并获取选中值

C#的winform是没有webform的RadioButtonList和CheckBoxList这两个控件的。要实现从数据库取出数据后动态生成N个RadioButton和CheckBox并获取选中项目的值,请看本例。思路很简单,有问题请指出,相互学习共同进步,谢谢。

Switch、CheckBox和RadioButton组件

作者Mixiaoxiao,源码SmoothCompoundButton,SmoothCompoundButton 是全套 Material 风格的 Switch、CheckBox 和 RadioButton 组件,纯 Java 代码(非贴图)像素级复刻了 Material 动画与阴影效果,支持 Android 4.0+。基本实现了在不同 Android 版本上与 Material 风格一致的效果,体验优于官方 AppCompat,可能是目前最好的 Material 风格 CompoundButton 组件之一。

Android实现多个CheckBox的单选(附带源码)

Android实现多个CheckBox的单选(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1173

S32K3基于EB配置GPT触发WDG的实战解析

本文详细解析了S32K3 MCU基于EB tresos工具配置GPT定时器触发看门狗(WDG)的实战方法。通过分析协同工作机制、MCAL配置步骤及代码实现,帮助开发者构建可靠的硬件监控系统,提升汽车电子系统的安全性与实时性。

f9g0h的博客 205

AABrowser快速上手:车机浏览器新手入门,从首页设置到标签页的完整使用教程

AABrowser 是一款专为 Android Auto 车机打造的 WebView 浏览器应用,让你在停车等候时刷网页、看视频、管理多标签页。本教程面向新手,用最短的步骤带你完成车机浏览器安装、首页(Start Page)设置、主页配置到标签页管理的全流程,看完即可上手使用。 ## 一、AABrowser 是什么?适合谁用 AABrowser(即 AA Browser)运行在 Android

gitblog_01177的博客 372

[小技巧] 如何复制知乎电子书中的文字和图片

文章目录一、背景二、复制文字1.最简单的方法(适合短小文字)2. 进阶方法(适合大段文字)三、复制图片四、注意事项 一、背景 有时候希望从书中摘录一部分文字作为笔记,但是知乎电子书阅读时候是禁止copy的,要么手打,要么OCR,给学习带来了一些不便。 审查元素后发现,知乎电子书是把文字分成一段一段的,试图F12直接copy不太方便。 本问将以谷歌Chrome浏览器为例,给出复制小技巧。 二、复制文字 1.最简单的方法(适合短小文字) 选中你需要的文字,左键单击不放,直接拖到地址栏。 然后可以从地址栏中

江南蜡笔小新 9247

基于多智能体深度强化学习的空地协同通信系统轨迹设计与访问控制

所属子方向: UAV assisted communication 名词注释 coordinated:协调、协同 base stations 基站,公用移动通信基站,是移动设备接入互联网的接口设备,是指在一定的无线电覆盖区中,通过移动通信交换中心,与移动电话终端之间进行信息传递的无线电收发信电台。 UAV-BS:无人机基站 cooperative-competitive game:合作竞争博弈 throughput :吞吐量,每秒比特数 bps,bits per second Determinis

skysys的研究小屋 4969

Android 编写一个若干学生信息录入页面 /学生信息显示与添加,使用Listview输出学生信息。

本人刚学android,如果里面有哪些垃圾写法请担待。 标红的是我认为比较有难点的。 要求: 创建两个活动 1、ActivityMain有一个Button和一个ListView控件,其中ListView控件来输出学生信息,Button控件是点击添加可以跳转到录入页面来继续录入别的学生信息。 2、ActivityStudent实现学生信息的录入。 姓名、学号(编辑框); 性别(两个RadioButton); 学院(下拉框,可选,例如:计算机学院、电气学院),专业(下拉框,与学院实现二级联动,计

m0_46038404的博客 1万+

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 247

ListView 单选、多选、模式

ListView 与 Checkable

qq_15736263的博客 728

易语言游戏Call调用避坑指南:主线程绑定与反检测实战

本文详细解析了易语言游戏Call调用中的主线程绑定与反检测技术,帮助开发者避免游戏崩溃和断线问题。通过分析线程检测原理、提供易语言实现方案及高级反检测技巧,如动态线程绑定和上下文伪装,确保Call调用的稳定性和安全性。文章还包含常见问题排查和性能优化建议,适用于游戏辅助开发领域。

weixin_29323365的博客 459

DEM高程数据的获取、合并与坐标转换

DEM高程数据的获取、合并与坐标转换一、DEM数据的获取二、数据合并三、投影转换方法一四、投影转换方法二 今天用DEM数据做了一个坡度分析,数据使用过程中涉及到投影坐标转换,由于不是很熟悉所以费了一番功夫。经过一番折腾总结出两个方法,方法一自认为比较便捷的方法,即通过BIGMAP软件中工具列表中的投影转换功能进行。方法二为传统方法,即在Arcgis中用投影栅格工具进行转换。 一、DEM数据的获取 在地理空间数据云网站下载DEM数据(精度包括30米和90米),数据格式为tif格式或img格式,坐标为WGS_1

weixin_48625651的博客 1万+

Android编程 移动应用开发 经典习题案例 (附案例 注意点)

Android编程 期末复习与总结(案例+易错点) 11月25日起.正式开始复习(预习)Android编程,小小的记录一下 B站练习 Chapter01 - Option Menu And Button 记录1: 配置文件注册Activity 意图过滤器,Main和LAUNCHER表示该activity会被先启用 <intent-filter> <action android:name="android.intent.

Weary_PJ的博客 5882

Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。 StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

私房菜 2630

如何高效使用现代C++ GUI库:TGUI跨平台界面开发实战指南

TGUI(Texus' Graphical User Interface)是一款功能强大的跨平台现代C++图形用户界面库,专为游戏开发者和桌面应用开发者设计。这款C++ GUI库最初作为SFML的扩展而创建,现已发展为支持多种后端的完整解决方案,包括SDL、GLFW和Raylib等主流图形库。无论你是需要为游戏创建复杂的UI系统,还是为桌面应用构建现代化界面,TGUI都能提供高效且灵活的解决方案。

gitblog_00521的博客 344

专为AI打造的浏览器:内存占用仅为Chrome的1/9、比Chrome快11倍(Docker部署教程,支持飞牛nas等服务器部署)

🚀 专为AI打造的无头浏览器来了! 用Zig从零构建,内存仅Chrome的1/9,速度快11倍,原生CDP协议支持Docker部署,适合爬虫、自动化测试和AI代理应用。✨

XiaoqiangClub的博客 733

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

3 行代码换肤:免费 WinForms 控件库 ReaLTaiizor 完整指南

ReaLTaiizor 是一个免费的 .NET WinForms 控件库,内置 50 多个现成的 UI 组件和 4 套主题,适合 C# / WinForms 开发者做 .NET 桌面界面美化:把系统默认控件换成风格统一的界面,不用自己写绘制代码。 ## 一条命令安装 WinForms UI 组件 在 Visual Studio 的 NuGet 程序包管理器里搜索 **ReaLTaiizor**

gitblog_00776的博客 923

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android studio入门知识点

一、Android studio使用入门 1.1 Android项目结构解析 ① .gradle、.idea文件夹为系统自动生成的,不需要关心里面的内容,也不要手动编辑。 ② grale文件夹包含Grale wrapper配置文件,默认目录:C:\Users\用户名.gradle\wrapper\dists ③ .gitignore用于存放目录和不受版本控制的文件 ④ build.gradle为全...

A_modanyi的博客 4160

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Android 控件系列篇

文章目录1、 1、 1.1、普通按钮 Android 长按Button出现一个菜单 Android 去掉Button自带边框 1.2、单选按钮 Android RadioButton选中时颜色更改 1.3、多选按钮 1.4、悬浮按钮 Android 悬浮按钮 两种实现方法 1.5、开关按钮 Android ToggleButton(状态切换按钮) 1.6、图片按钮 Android ImageButton(图片按钮) 1.7、圆形按钮 Android FloatingActionButton(圆形按钮) 2、

qq_27494201的博客 1825

MaterialUI完全指南:如何在Unity中快速构建Material Design风格界面

MaterialUI是一款专为Unity开发的UI工具包,遵循Google官方的Material Design设计规范,帮助开发者快速构建美观、一致的用户界面。无论是移动应用、游戏界面还是VR/AR项目,MaterialUI都能提供完整的解决方案,让你的界面设计既专业又高效。 ## 为什么选择MaterialUI? Material Design已成为现代UI设计的行业标准,其清晰的视觉层次、

gitblog_01155的博客 470

如何快速上手TGUI:跨平台C++ GUI开发终极指南

TGUI是一个现代、跨平台的C++图形用户界面库,支持SFML、SDL、GLFW和raylib等多种后端渲染引擎。在前100字内,TGUI提供了丰富的UI组件和灵活的布局系统,让你能够轻松创建专业的桌面应用界面。无论是游戏开发、工具软件还是嵌入式系统,TGUI都能提供高效、可定制的GUI解决方案。 ## 🚀 项目概览与核心价值 TGUI(Texus' Graphical User Inter

gitblog_00282的博客 452
上一篇: 一些老控件的集合下载包
下一篇: 对dbgrid的改造
yethyeth
博客等级 码龄21年 140粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值