XE StringGrid应用(G1属性触发G2)
unit UnitMain; interface uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Rtti,
FMX.StdCtrls, FMX.Grid, FMX.Layouts, FMX.Controls.Presentation, FMX.Edit; type
TForm8 = class(TForm)
Edit1: TEdit;
G1: TStringGrid;
G2: TStringGrid;
StringColumn1: TStringColumn;
StringColumn2: TStringColumn;
Button1: TButton;
Button2: TButton;
procedure FormActivate(Sender: TObject);
procedure G1SelectCell(Sender: TObject; const ACol, ARow: Integer;
var CanSelect: Boolean);
procedure G2SelectCell(Sender: TObject; const ACol, ARow: Integer;
var CanSelect: Boolean);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
FRow2: Integer;
FRow1: Integer;
{ Private declarations }
procedure ShowG1(); // 显示表1
procedure ShowG2(); // 显示表2数据
procedure Item(); // 显示Edit等数据
procedure Save(); // 保存数据
procedure SetRow1(const Value: Integer);
procedure SetRow2(const Value: Integer);
public
{ Public declarations }
property Row1 : Integer read FRow1 write SetRow1; // 表1属性,OnSelectCell属性触发,改变时do something
property Row2 : Integer read FRow2 write SetRow2; // 表1属性,OnSelectCell属性触发,改变时do something
end; var
Form8: TForm8; implementation {$R *.fmx} procedure TForm8.Button1Click(Sender: TObject);
begin
G2.RowCount:=G2.RowCount+1; // 动态改变G2的Row
G2.Cells[0,G2.RowCount-1]:='aa';
end; procedure TForm8.Button2Click(Sender: TObject);
begin
Edit1.Text := FROW2.ToString ;
end; procedure TForm8.FormActivate(Sender: TObject);
begin
if(Tag=0) then begin
Tag:=1; FRow1:=-1;
FRow2:=-1; ShowG1();
if(g1.RowCount>0) then G1.SelectCell(0,0); // 初始化时,选中G1的第一行
end;
end; procedure TForm8.ShowG1;
var
ss: TStringList;
i: Integer;
begin
ss:=TStringList.Create;
ss.LoadFromFile('c:/g1.txt');
G1.RowCount:=ss.Count;
for i:=0 to ss.Count-1 do G1.Cells[0,i]:=ss[i];
ss.Free;
end; procedure TForm8.ShowG2;
var
ss: TStringList;
i: Integer;
begin
ss:=TStringList.Create;
ss.LoadFromFile('c:/g2'+FRow1.ToString+'.txt');
G2.RowCount:=ss.Count;
for i:=0 to ss.Count-1 do G2.Cells[0,i]:=ss[i];
ss.Free; FRow2:=-1;
if(G2.RowCount>0) then begin
Row2:=0;
G2.SelectCell(0,0);
end;
end; procedure TForm8.Item;
begin
Edit1.Text:=G2.Cells[0,Row2];
end; procedure TForm8.Save;
var
ss:TStringList;
i:Integer;
begin
if(FRow2>=0) and (FRow2<=G2.RowCount-1) then begin
if(Edit1.Text<>G2.Cells[0,FRow2]) then begin
G2.Cells[0,FRow2]:=Edit1.Text; ss:=TStringList.Create;
for i:=0 to G2.RowCount-1 do ss.Add(G2.Cells[0,i]);
ss.SaveToFile('c:/g2'+FRow1.ToString+'.txt'); ss.Clear();
for i:=0 to G1.RowCount-1 do ss.Add(G1.Cells[0,i]);
ss.SaveToFile('c:/g1.txt');
ss.Free;
end;
end;
end; procedure TForm8.SetRow1(const Value: Integer);
begin
if(Value<>FRow1) then begin
Save();
FRow1 := Value;
G1.SelectCell(0,Value);
ShowG2();
end;
end; procedure TForm8.SetRow2(const Value: Integer);
begin
if(Value<>FRow2) then begin
Save();
FRow2 := Value;
Item();
end;
end; procedure TForm8.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Save();
CanClose:=True;
end; procedure TForm8.G1SelectCell(Sender: TObject; const ACol, ARow: Integer;
var CanSelect: Boolean);
begin
// 鼠标点击空白地方的时候,会触发该事件,而ARow的值超出范围
CanSelect:=False;
if(ARow>=0) and (ARow<=G1.RowCount-1) then begin
if(Row1<>ARow) then Row1:=ARow;
CanSelect:=True;
end;
end; procedure TForm8.G2SelectCell(Sender: TObject; const ACol, ARow: Integer;
var CanSelect: Boolean);
begin
CanSelect:=False;
if(ARow>=0) and (ARow<=G2.RowCount-1) then begin
if(Row2<>ARow) then Row2:=ARow;
CanSelect:=True;
end;
end; end.
XE中StringGrid控件还是有很多bug的,在OnSelectCell事件里,鼠标滑过也会触发,若要用ShowMessage或弹出模态窗体,Grid重新聚焦时,会频繁的触发。
在鼠标滑过没有行的Index位置时,也会触发OnSelectCell事件,会出现Index超界,报错。
所以每次都必须保证Grid里有数据,(ARow>=0) and (ARow<=G2.RowCount-1)
XE StringGrid应用(G1属性触发G2)的更多相关文章
- vue data对象添加新属性触发视图
<template> <div class="wrap open"> <a>{{test01.name}}</a> <a> ...
- vue.set动态新增对象属性,触发dom渲染
当我们给一个props或者data中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用Vue.set方法 /** * ==== 选择产品 ==== * 因为vue实现双向数据绑定的机制是数据劫 ...
- (转载)StringGrid常用属性和常用操作
Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...
- (转载)Delphi StringGrid常用属性和常用操作
Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...
- Delphi StringGrid常用属性和常用操作
StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控制网格外观念的属性,以及利用表格的结构响应用户操作的事 ...
- WPF教程(四)RelativeSource属性
我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding ...
- dispay属性的block,inline,inline-block
转自下面的几位大神: http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 bl ...
- display属性及inline-block值(可用来布局)
display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...
- 蚂蚁金服新一代数据可视化引擎 G2
新公司已经呆了一个多月,目前着手一个数据可视化的项目,数据可视化肯定要用到图形库如D3.Highcharts.ECharts.Chart等,经决定我的这个项目用阿里旗下蚂蚁金服所开发的G2图表库. 官 ...
随机推荐
- composer 详解
composer 详解 http://blog.csdn.net/panpan639944806/article/details/16808261 https://www.phpcomposer.co ...
- java代码确认出ip和主机名
总结::不懂... package com.aa; import java.net.*; public class InetAddresTest { public static void main(S ...
- 测试php中的curl是否可使用
<?php $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com"); curl_seto ...
- 为何指针初始化为NULL
指针初始化为NULL,指向NULL指针区(大小64K),如果读取或写入这个地址,会引发内存写保护异常 版权声明:本文为博主原创文章,未经博主允许不得转载.
- VMware虚拟机上网络连接模式bridged(桥接模式)
VMware虚拟机上网络连接模式bridged(桥接模式)的实质就是虚拟机本身利用主机的网卡对外直接作为一个真实的物理主机存在. 也就是理论上此时的虚拟机和主机没什么关系,只是和主机公用了一块网卡,其 ...
- thingsboard在windows下安装和使用
在官网下载thingsboard和tb-gateway 需要安装java8 thingsboard服务安装 https://thingsboard.io/docs/user-guide/install ...
- 使用K2时提示未能加载文件或程序集Microsoft.IdentityModel等
转:http://www.cnblogs.com/dannyli/archive/2012/10/15/2724931.html K2安装成功后,打开workspace管理流程时报错如下图: 未能加载 ...
- 一卡通大冒险(hdu 2512)
因为长期钻研算法, 无暇顾及个人问题,BUAA ACM/ICPC 训练小组的帅哥们大部分都是单身.某天,他们在机房商量一个绝妙的计划"一卡通大冒险".这个计划是由wf最先提出来的, ...
- C. Ray Tracing——披着搜索外衣的扩展欧几里得
[题目大意] 给你一个n*m的矩形,光线从(0,0)出发,沿右上方向以每秒根号2米的速度运动,碰到矩形边界就会反弹(符合物理规律的反弹),询问k个点,这些点都在矩形内部且不在矩形边界上,求光经过这些点 ...
- 分布式基础学习【二】 —— 分布式计算系统(Map/Reduce)
二. 分布式计算(Map/Reduce) 分布式式计算,同样是一个宽泛的概念,在这里,它狭义的指代,按Google Map/Reduce框架所设计的分布式框架.在Hadoop中,分布式文件系统,很大程 ...