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)

最新文章

  1. android 如何正确使用 泛型 和 多参数 “偷懒”
  2. New Training Table
  3. Hashslider – 带有 Hash 标签功能的 jQuery 内容滑块
  4. Git平台使用时的配置分析
  5. 为什么Linux的fdisk分区时第一块磁盘分区的First Sector是2048?
  6. spring读取加密配置信息
  7. 抽象工厂模式(python版)
  8. 分享最近和同事处理的 解析XML的相关问题
  9. ASP.NET中的SQL注入攻击与防护
  10. bui上手体验
  11. GUIForDebug
  12. MyEclipse优化全攻略
  13. (Python学习9)Python虚拟机中的一般表达式
  14. 转:HTML与URL两种录制模式分析
  15. 简易封装手机浏览器touch事件
  16. Linux入门之常用命令(14) kill
  17. TPYBoard开发板ADC数模转换一: 初识ADC使用
  18. 回滚 - 每天5分钟玩转 Docker 容器技术(141)
  19. NABCD原则
  20. 推荐系统评测指标—准确率(Precision)、召回率(Recall)、F值(F-Measure)

热门文章

  1. Linux安装python
  2. 根据wsdl文件生成WebService客户端代码
  3. lnmp centos7 memcache服务器端 和 memcache memcached扩展的安装
  4. bootstrap 设置表格固定宽度 内容换行
  5. TCP之一:传输控制协议(Transmission Control Protocol, TCP)
  6. python开发函数进阶:递归函数
  7. Python web框架 Tornado(二)异步非阻塞
  8. selenium 获取某元素的 某属性 的值
  9. Cygwin windows10上安装出现系列问题及解决方法
  10. 当我们谈 SQL 优化时在谈些什么?