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)的更多相关文章

  1. vue data对象添加新属性触发视图

    <template> <div class="wrap open"> <a>{{test01.name}}</a> <a> ...

  2. vue.set动态新增对象属性,触发dom渲染

    当我们给一个props或者data中被观测的对象添加一个新的属性的时候,不能直接添加,必须使用Vue.set方法 /** * ==== 选择产品 ==== * 因为vue实现双向数据绑定的机制是数据劫 ...

  3. (转载)StringGrid常用属性和常用操作

    Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...

  4. (转载)Delphi StringGrid常用属性和常用操作

    Delphi StringGrid常用属性和常用操作 StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控 ...

  5. Delphi StringGrid常用属性和常用操作

    StringGrid组件用于建立显示字符串的网格,与电子表格相似.它可使表格中的字符串和相关对象操作简单化.StringGrid组件提供了许多可控制网格外观念的属性,以及利用表格的结构响应用户操作的事 ...

  6. WPF教程(四)RelativeSource属性

    我们进行Bingding时,如果明确知道数据源的Name,就能用Source或者ElementName进行绑定,但是有时候我们需要绑定的数据源可能没有明确的Name,此时我们就需要利用Bingding ...

  7. dispay属性的block,inline,inline-block

    转自下面的几位大神: http://www.cnblogs.com/KeithWang/p/3139517.html 总体概念 block和inline这两个概念是简略的说法,完整确切的说应该是 bl ...

  8. display属性及inline-block值(可用来布局)

    display:block就是将元素显示为块级元素. block元素的特点是: 总是在新行上开始: 高度,行高以及顶和底边距都可控制: 宽度缺省是它的容器的100%,除非设定一个宽度 <div& ...

  9. 蚂蚁金服新一代数据可视化引擎 G2

    新公司已经呆了一个多月,目前着手一个数据可视化的项目,数据可视化肯定要用到图形库如D3.Highcharts.ECharts.Chart等,经决定我的这个项目用阿里旗下蚂蚁金服所开发的G2图表库. 官 ...

随机推荐

  1. 南阳OJ 61 传纸条(一)

    传纸条(一) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行 ...

  2. jetty中war包解压路径

    这是个很奇怪的问题,如果下载好了jetty直接放入war包运行,项目会被解压到C盘的临时文件夹中.但是如果你在${JETTY_HOME}文件夹,也就是jetty解压后的根目录中新建,注意是新建一个wo ...

  3. 【转】Jmeter压力测试模拟并发

    jmeter下载地址:http://jmeter.apache.org/download_jmeter.cgi JMeterPlugins(jmeter插件):http://jmeter-plugin ...

  4. UE4事件相关总结

    转自:http://blog.ch-wind.com/ue4-event-overview/ 事件机制是实现游戏内逻辑的重要部分,在开始进行游戏逻辑的设计和实现之前,对UE4的事件机制进行理解是非常必 ...

  5. usb设备驱动程序

    韦老师写的,供参考 /*  * drivers\hid\usbhid\usbmouse.c  */ #include <linux/kernel.h> #include <linux ...

  6. 【phonegap】下载文件

    <!-- 打包的时候phonegap自己会添加这个文件--> <script type="text/javascript" charset="utf-8 ...

  7. java成神之——集合框架之ArrayList,Lists,Sets

    集合 集合种类 ArrayList 声明 增删改查元素 遍历几种方式 空集合 子集合 不可变集合 LinkedList Lists 排序 类型转换 取交集 移动元素 删除交集元素 Sets 集合特点 ...

  8. DataTable改变column类型

    1.必须先克隆DataTable 2.列换类型 3.逐行往新DataTable赋值,并转换某列类型 如: DataTable dt = diorg.Clone(); //必须先克隆,此时并不包含数据 ...

  9. C# web程序,winform程序,控制台程序配置log4net,使用log4net

    第一添加log4net.config,这里配置包括信息提示写入,错误信息写入,控制台消息展示 <?xml version="1.0" encoding="utf-8 ...

  10. 进程间通信___命名管道(FIFO)

    命名管道(FIFO) 基本概念 命名管道和一般的管道基本相同,但也有一些显著的不同: 命名管道是在文件系统中作为一个特殊的设备文件而存在的. 不同祖先的进程之间可以通过管道共享数据. 当共享管道的进程 ...