给你做了一下,你看是否可意 unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AxCtrls, OleCtrls, VCF1, ComCtrls;type TForm1 = class(TForm) Button1: TButton; F1Book1: TF1Book; Button2: TButton; procedure Button1Click(Sender: TObject); procedure F1Book1SelChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; index:integer=1; col:integer=1; implementation{$R *.dfm} function RightPos(c:char;s:string):integer; var //返回从右第一个字符出现的位置 i:integer; begin result:=0; for i:=length(s) downto 1 do if c=s[i] then begin result:=i; break; end; end; function GetRightStr(s:string;c:char):string; //返回某字符右边的字符串 var i:integer; begin result:=''; for i:=length(s) downto 1 do begin if s[i]=c then exit; result:=s[i]+result; end; end;function GetIncStr(s:string):string;//返回递增后的字符串 var i:integer; s1,ss:string; begin ss:=GetRightStr(s,'.'); delete(s,RightPos('.',s),length(ss)+1); i:=strtoint(ss); inc(i); result:=s+'.'+inttostr(i); end;procedure TForm1.Button1Click(Sender: TObject); var str:string; begin str:=self.F1Book1.TextRC[index,col]; inc(index); self.F1Book1.TextRC[index,col]:=GetIncStr(str); end;procedure TForm1.F1Book1SelChange(Sender: TObject); begin if self.F1Book1.TextRC[self.F1Book1.SelStartRow,self.F1Book1.SelStartCol]<>'' then begin self.Button1.Enabled:=true; self.Button2.Enabled:=true; index:=self.F1Book1.SelStartRow; col:=self.F1Book1.SelStartCol; end else begin self.Button1.Enabled:=false; self.Button2.Enabled:=false; end; end;procedure TForm1.FormCreate(Sender: TObject); begin self.F1Book1.TextRC[1,1]:='1.1'; end;procedure TForm1.Button2Click(Sender: TObject); var str:string; begin str:=self.F1Book1.TextRC[index,col]; inc(index); self.F1Book1.TextRC[index,col]:=str+'.1'; end;end.
我对f1book不太熟悉,插入一行的语句应怎样写
增加列、行insertRange(最好先结束编辑EndEdit),这个不知道行不行???
'-------------------F1的基本操作-----------------
Public Sub F1_InRng(CurF1 As F1Book, ByVal CurtLine As Long, ByVal InCount As Long) With CurF1 .InsertRange CurtLine + 1, -1, CurtLine + InCount, .MaxCol, F1ShiftRows .MaxRow = .MaxRow + InCount End With End Sub
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, AxCtrls, OleCtrls, VCF1, ComCtrls;type TForm1 = class(TForm) Button1: TButton; F1Book1: TF1Book; Button2: TButton; procedure Button1Click(Sender: TObject); procedure F1Book1SelChange(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1; index:integer=1; col:integer=1; implementation{$R *.dfm}function RightPos(c:char;s:string):integer; var //返回从右第一个字符出现的位置 i:integer; begin result:=0; for i:=length(s) downto 1 do if c=s[i] then begin result:=i; break; end; end; function GetRightStr(s:string;c:char):string; //返回某字符右边的字符串 var i:integer; begin result:=''; for i:=length(s) downto 1 do begin if s[i]=c then exit; result:=s[i]+result; end; end;function GetIncStr(s:string):string;//返回递增后的字符串 var i:integer; s1,ss:string; begin ss:=GetRightStr(s,'.'); delete(s,RightPos('.',s),length(ss)+1); i:=strtoint(ss); inc(i); result:=s+'.'+inttostr(i); end;procedure TForm1.Button1Click(Sender: TObject); var str:string; begin str:=self.F1Book1.TextRC[index,col]; inc(index); F1Book1.InsertRange(index,1,index,1,2); self.F1Book1.TextRC[index,col]:=GetIncStr(str); end;procedure TForm1.F1Book1SelChange(Sender: TObject); begin if self.F1Book1.TextRC[self.F1Book1.SelStartRow,self.F1Book1.SelStartCol]<>'' then begin self.Button1.Enabled:=true; self.Button2.Enabled:=true; index:=self.F1Book1.SelStartRow; col:=self.F1Book1.SelStartCol; end else begin self.Button1.Enabled:=false; self.Button2.Enabled:=false; end; end;procedure TForm1.FormCreate(Sender: TObject); begin self.F1Book1.TextRC[1,1]:='1.1'; end;procedure TForm1.Button2Click(Sender: TObject); var str:string; begin str:=self.F1Book1.TextRC[index,col]; inc(index); F1Book1.InsertRange(index,1,index,1,2); self.F1Book1.TextRC[index,col]:=str+'.1'; end;end.现在做好了,应该没什么问题了吧
如:
procedure TForm1.Button2Click(Sender: TObject);
begin
self.F1Book1.TextRC[index,1]:='';
index:=index-1;
end;
在另一个贴子里我已经给你说的很清楚了
对了,如果已经在1.1下存在1.1.1,那么再选中1.1时,点击button,就应该是1.1.2,这个怎么弄啊?
这里,你看我注释掉的就是你想要的
procedure TForm1.F1Book1SelChange(Sender: TObject);
begin
index:=1;//self.F1Book1.SelStartRow;
end;
把1换成注释后面的就可以了
1. 运行时有个问题,比如说:运行开始直接点button,他不会直接在'1.1'下加'1.1.1',而是报错'invalid cell interfence',必须点到1.1下面的单元格,再点回1.1,再点击button,才会正常,你碰到过么???
2. 举例:比如说已经有了
1.1
1.1.1
1.1.2
1.1.3
1.2
1.2.1
这时候选中的单元框应该是'1.2',这时候我想在'1.1'下面加个'1.1.4',我必须点回'1.1'.再点button点3次,才能加上'1.1.4',这个没法判断已拥有的最大值吗?
3.还有就是你限制了最多两个点,而实际上是没有限制的,比如说我会需要在'1.1.1'下面加上'1.1.1.1',再在'1.1.1.1'下面加上'1.1.1.1.1',依次而行,能改进吗?
2、这个问题是你把
procedure TForm1.F1Book1SelChange(Sender: TObject);
begin
index:=1;//self.F1Book1.SelStartRow;
end;
改成
procedure TForm1.F1Book1SelChange(Sender: TObject);
begin
index:=self.F1Book1.SelStartRow;
end;
就可以了
3、可以改进,不过需要条件限制,即如果1.1.1的话,知道什么时候该1.1.2,还是该1.1.1.1,你的条件是什么
1.1 1.2 1.3
或者
1.1.1 1.1.2 1.1.3
或者
1.2.1 1.2.2 1.2.3
或者1.1.1.1 1.1.1.2 1.1.1.3
点button2变长
1.1变为1.2 1.2变为1.3
1.1.1变为1.1.2是这个意思吧,那么如果单元格内容为空呢
button1就是同级别的增加,如:
1.1 1.2 1.3
一但点击button2了,就是加长:
1.1 变成 1.1.1 再点击一下 变成 1.1.2
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AxCtrls, OleCtrls, VCF1, ComCtrls;type
TForm1 = class(TForm)
Button1: TButton;
F1Book1: TF1Book;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure F1Book1SelChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
index:integer=1;
col:integer=1;
implementation{$R *.dfm}
function RightPos(c:char;s:string):integer;
var //返回从右第一个字符出现的位置
i:integer;
begin
result:=0;
for i:=length(s) downto 1 do
if c=s[i] then
begin
result:=i;
break;
end;
end; function GetRightStr(s:string;c:char):string; //返回某字符右边的字符串
var i:integer;
begin
result:='';
for i:=length(s) downto 1 do
begin
if s[i]=c then
exit;
result:=s[i]+result;
end;
end;function GetIncStr(s:string):string;//返回递增后的字符串
var
i:integer;
s1,ss:string;
begin
ss:=GetRightStr(s,'.');
delete(s,RightPos('.',s),length(ss)+1);
i:=strtoint(ss);
inc(i);
result:=s+'.'+inttostr(i);
end;procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
begin
str:=self.F1Book1.TextRC[index,col];
inc(index);
self.F1Book1.TextRC[index,col]:=GetIncStr(str);
end;procedure TForm1.F1Book1SelChange(Sender: TObject);
begin
if self.F1Book1.TextRC[self.F1Book1.SelStartRow,self.F1Book1.SelStartCol]<>'' then
begin
self.Button1.Enabled:=true;
self.Button2.Enabled:=true;
index:=self.F1Book1.SelStartRow;
col:=self.F1Book1.SelStartCol;
end else begin
self.Button1.Enabled:=false;
self.Button2.Enabled:=false;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
self.F1Book1.TextRC[1,1]:='1.1';
end;procedure TForm1.Button2Click(Sender: TObject);
var
str:string;
begin
str:=self.F1Book1.TextRC[index,col];
inc(index);
self.F1Book1.TextRC[index,col]:=str+'.1';
end;end.
Public Sub F1_InRng(CurF1 As F1Book, ByVal CurtLine As Long, ByVal InCount As Long)
With CurF1
.InsertRange CurtLine + 1, -1, CurtLine + InCount, .MaxCol, F1ShiftRows
.MaxRow = .MaxRow + InCount
End With
End Sub
现在是
1.1
现在点击button插入的时候f1book焦点该移到1.2上面。我想然后再看看能不能向下插入行???
现在是
1.1
现在点击button插入的时候f1book焦点该移到1.2上面。我想然后再看看能不能向下插入行???
insertrange(1,-1,1,-1,...)那么插入的就是永远在第一行之前
insertrange(10,-1,10,-1,...)那么插入的就是永远在第10行之前
不知道这么说有用吗?能实现吗?
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, AxCtrls, OleCtrls, VCF1, ComCtrls;type
TForm1 = class(TForm)
Button1: TButton;
F1Book1: TF1Book;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure F1Book1SelChange(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
index:integer=1;
col:integer=1;
implementation{$R *.dfm}function RightPos(c:char;s:string):integer;
var //返回从右第一个字符出现的位置
i:integer;
begin
result:=0;
for i:=length(s) downto 1 do
if c=s[i] then
begin
result:=i;
break;
end;
end; function GetRightStr(s:string;c:char):string; //返回某字符右边的字符串
var i:integer;
begin
result:='';
for i:=length(s) downto 1 do
begin
if s[i]=c then
exit;
result:=s[i]+result;
end;
end;function GetIncStr(s:string):string;//返回递增后的字符串
var
i:integer;
s1,ss:string;
begin
ss:=GetRightStr(s,'.');
delete(s,RightPos('.',s),length(ss)+1);
i:=strtoint(ss);
inc(i);
result:=s+'.'+inttostr(i);
end;procedure TForm1.Button1Click(Sender: TObject);
var
str:string;
begin
str:=self.F1Book1.TextRC[index,col];
inc(index);
F1Book1.InsertRange(index,1,index,1,2);
self.F1Book1.TextRC[index,col]:=GetIncStr(str);
end;procedure TForm1.F1Book1SelChange(Sender: TObject);
begin
if self.F1Book1.TextRC[self.F1Book1.SelStartRow,self.F1Book1.SelStartCol]<>'' then
begin
self.Button1.Enabled:=true;
self.Button2.Enabled:=true;
index:=self.F1Book1.SelStartRow;
col:=self.F1Book1.SelStartCol;
end else begin
self.Button1.Enabled:=false;
self.Button2.Enabled:=false;
end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
self.F1Book1.TextRC[1,1]:='1.1';
end;procedure TForm1.Button2Click(Sender: TObject);
var
str:string;
begin
str:=self.F1Book1.TextRC[index,col];
inc(index);
F1Book1.InsertRange(index,1,index,1,2);
self.F1Book1.TextRC[index,col]:=str+'.1';
end;end.现在做好了,应该没什么问题了吧