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图表库. 官 ...
随机推荐
- spring的@Transactional注解详细用法(转)
概述 事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framework对事务管理提供了一致的抽象,其特点如下: 为不同的事务API提供一致的编程模型, ...
- SpringMvc入门一----介绍
Spring Mvc简介: Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求 ...
- FPGA学习中的代码阅读
不管是学FPGA还是C语言,任何一种代码的学习都离不开大量的代码阅读,也就是多看,多学习别人的代码.初学者在学习的过程中更为重要的是模仿,模仿别人的代码算法怎么去处理的,模仿多了,代码看的多了,能力自 ...
- awk常见基本使用
-F 指定分割符号 print 外层的引号必须是单引号 $n不能被解析 [root@bogon ~]# .txt a:b:c:d a1:b1:c1:d1 a2:b2:c2:d2 a_: :c:dddd ...
- 南阳OJ 1170 最大的数
最大的数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数 在这n个数 ...
- java练习篇 求输出最大值
总结:没有把数据输入.是数组-----把要输入的数据放在数组里.错在这里 import java.util.Scanner; public class shibai { public static v ...
- [置顶]
STM32 输入捕获的脉冲宽度及频率计算
输入捕获模式可以用来测量脉冲宽度或者测量频率.STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能.以下是对脉冲宽度及频率的计算. 1.脉冲宽度 如下图所示,采集该高电平脉冲 ...
- highcharts钻取例子
<!doctype html> <html lang="en"> <head> <script type="text/javas ...
- php代码执行漏洞
php代码执行的两个函数eval(),assert() <?php $i = $_GET['x']; eval($i); ?> eval()函数将以php类型执行传入的参数x的值 给x传入 ...
- Centos7 SSH公钥生成及配置
1.你可以按如下命令来生成 sshkey: ssh-keygen -t rsa -C "xxxxx@xxxxx.com" 2.按照提示完成三次回车,即可生成 ssh key.通过查 ...