在StringGrid中每行添加一个选择框(checkbox)

2023-10-22 15:18

本文主要是介绍在StringGrid中每行添加一个选择框(checkbox),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

StringGrid得实际使用中,经常会遇到这样的需求,用户想对每一行的记录作一个标记,想对做了标记的记录作特别的操作。例如想删除多条记录。

    在网页中经常有类似的应用,例如在电子邮箱里,显示邮件的每一行都有一个选择框,用户可以对多个邮件同时做删除,移动的操作。
    在delphi的StringGrid中虽然没有直接提供在每一行插入一个checkbox的功能,可是我们可以通过编写程序来给它加上一个checkbox,让用户对记录进行选择。

通过在网络上搜索一些相关资料 我写了一小程序,验证通过。
该程序就实现了在每一行都显示一个checkbox,然后可以对每一行的记录进行选择。

关键词:StringGrid,嵌入控件,canvas,Loadbitmap;

unit SRGrid;

interface

uses
   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
   Dialogs, Grids, StdCtrls, DBCtrls, DBGrids, DB, ADODB;

type
   TForm1 = class(TForm)
     conn: TADOConnection;
     qry: TADOQuery;
     strGrid: TStringGrid;
     ctnClear: TButton;
     btnSearch: TButton;
     edtDW: TEdit;
     btnBLItem: TButton;
     procedure FormCreate(Sender: TObject);
     procedure strGridDrawCell(Sender: TObject; ACol, ARow: Integer;
       Rect: TRect; State: TGridDrawState);
     procedure btnSearchClick(Sender: TObject);
     procedure strGridMouseDown(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure ctnClearClick(Sender: TObject);
     procedure btnBLItemClick(Sender: TObject);
     private
     { Private declarations }
   public
     { Public declarations }
   end;

var
   Form1: TForm1;
   FCheck,FNoCheck:TBitmap;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
   i:Smallint;
   bmp:TBitmap;
begin
   FCheck:=TBitmap.Create;
   FNoCheck:=TBitmap.Create;
   bmp:=TBitmap.Create;
   try
     bmp.Handle:=LoadBitmap(0,Pchar(OBM_CHECKBOXES));
     with FNoCheck do
     begin
       width:=bmp.Width div 4;
       height:=bmp.Height div 3;
       Canvas.CopyRect(canvas.cliprect,bmp.Canvas,canvas.ClipRect);
     end;
     with FCheck do
     begin
       width:=bmp.Width div 4;
       height:=bmp.Height div 3;
       canvas.CopyRect(canvas.ClipRect,bmp.Canvas,rect(width,0,2*width,height));
     end;
   finally
     DeleteObject(bmp.Handle);
     bmp.Free;
   end;
end;

procedure TForm1.strGridDrawCell(Sender: TObject; ACol, ARow: Integer;
   Rect: TRect; State: TGridDrawState);
begin
if Acol=0 then
begin
   if not(gdFixed in State) then
     with Tstringgrid(Sender).Canvas do
     begin
       brush.Color:=clWindow;
       FillRect(Rect);
       if strGrid.Cells[ACol,ARow]='yes' then
         Draw( (rect.right + rect.left - FCheck.width) div 2, (rect.bottom + rect.top - FCheck.height) div 2, FCheck );
       if strGrid.Cells[ACol,ARow]='no' then
         Draw( (rect.right + rect.left - FCheck.width) div 2, (rect.bottom + rect.top - FCheck.height) div 2, FNoCheck );
     end;
   end;
end;

procedure TForm1.btnSearchClick(Sender: TObject);
var
   i,j:integer;
   strsql:string;
   strwhere:string;
begin
   strwhere:='';
   if edtDW.Text<>'' then
     strwhere:=' where request_corp like ''%'+edtDW.Text+'%''';
   with qry do
   begin
     close;
     sql.Clear;
     strsql:='select ITEM_ID,STATUS,REQUEST_CORP,ADDR,REQUEST_TIME from xk_t_item ';
     strsql:=strsql+strwhere;
     sql.Add(strsql);
     open;
     strGrid.RowCount:=recordcount+1;
     strGrid.Update;
     i:=1;
     while not eof do
     begin
       for j:=1 to strGrid.ColCount-2 do
       begin
         if j=1 then strGrid.Cells[j-1,i]:='no';
         strGrid.Cells[j,i]:=Fields[j-1].AsString;
         //showmessage('cell['+inttostr(i)+','+inttostr(j)+']的值:'+fields[j].AsString);
       end;
       i:=i+1;
       next;
     end;
   end;
end;

procedure TForm1.strGridMouseDown(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
begin
   if not( strGrid.Col=0 )then exit;
   if strGrid.Cells[strGrid.Col,strGrid.Row]='yes' then
     strGrid.Cells[strGrid.col,strGrid.row]:='no'
   else
     strGrid.Cells[strGrid.col,strGrid.row]:='yes';
end;

procedure TForm1.ctnClearClick(Sender: TObject);
var
   strItemid:string;
   nRow:integer;// 当前所在行;
begin
   nRow:=strGrid.Row;
   strItemid:=strGrid.Cells[1,nRow];
   showmessage(strItemid);
end;

procedure TForm1.btnBLItemClick(Sender: TObject);
var
i:integer;
irows:integer;
strFlag:string;
itemList:array of string;
begin
i:=strGrid.RowCount-1;
for i:=1 to irows do
begin
    strFlag:=strGrid.Cells[0,i];
    if strFlag='yes' then

end;
end;


转子:http://hi.baidu.com/wangkuoguang/item/22da211412189b24f6625ca3

这篇关于在StringGrid中每行添加一个选择框(checkbox)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262250

相关文章

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

为什么现在很多人愿意选择做债务重组?债重组真的就这么好吗?

债务重组,起初作为面向优质企业客户的定制化大额融资策略,以其高效周期著称,一个月便显成效。然而,随着时代的车轮滚滚向前,它已悄然转变为负债累累、深陷网贷泥潭者的救赎之道。在此路径下,个人可先借助专业机构暂代月供,经一段时间养护征信之后,转向银行获取低成本贷款,用以替换高昂网贷,实现利息减负与成本优化的双重目标。 尽管债务重组的代价不菲,远超传统贷款成本,但其吸引力依旧强劲,背后逻辑深刻。其一

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)

一、Camera 简化思路 在 Camera 的开发中,其实我们通常只关注打开相机、图像预览和关闭相机,其他的步骤我们不应该花费太多的精力 为此,应该提供一个工具类,它有处理相机的一些基本工具方法,包括获取摄像头 ID、选择最优预览尺寸以及打印相机参数信息 二、Camera 工具类 CameraIdResult.java public class CameraIdResult {