将memo中的内容导入stringgrid中?(100分)

  • 主题发起人 主题发起人 春风江南
  • 开始时间 开始时间

春风江南

Unregistered / Unconfirmed
GUEST, unregistred user!
memo中输入数字,空格和转行。导入到stringgrid中的格式是一致的,怎么写?
如:
12 13 5
6 5 3 2 3
6 8 9 1 0
 
算你问对了,我正好做过同样的工作,以下是原代码,希望对你有用
//---打开文件
procedure TForm1.Open_BtnClick(Sender: TObject);
var
h,j,k,Num,StrLen,SepCharPos:integer;
SepChar,aString,MyStr:String; //SepChar是Memo中数字与数字之间的分隔符,可以是逗号、分号、空格或任意字符
begin
if OpenDialog1.Execute then
Begin
OpenedFileName:=OpenDialog1.FileName ;
Memo1.Lines.LoadFromFile(OpenDialog1.FileName );
SepChar:=','; //我这里用逗号作分隔符,如*.csv文件就用此格式
StringGrid1.RowCount :=Memo1.Lines.Count;
StringGrid1.FixedRows :=1;
//StringGrid1.DefaultRowHeight :=StrToInt(Edit1.Text)*2;
//StringGrid1.DefaultColWidth :=StrToInt(Edit2.Text)*2;
//Memo1.Lines.Clear;
for h:=0 to Memo1.Lines.Count-1 do
begin
//ProgressBar1.Max :=RichEdit1.Lines.Count-1;
aString:=Memo1.Lines.Strings[h];
StrLen:=Length(aString);
Num:=0;
for j:=0 to StrLen do //计算字符串中有多少个分隔符
begin
if Copy(aString,j,1)=SepChar then
Num:=Num+1
end;
for k:=1 to Num+1 do //分别取出被分隔符分开的字符串
begin
SepCharPos:=Pos(SepChar,aString); //计算第一个分隔符在字符串中的位置
if SepCharPos=0 then //字符串中没有分隔符或分隔符以前的字符串已被处理
begin
MyStr:=aString;
StringGrid1.ColCount:=k;
StringGrid1.Cells[(k-1),h]:=MyStr;
end
else //字符串中有分隔符
begin
MyStr:=Copy(aString,1,SepCharPos-1); //取出第一个分隔符之前的字符串
StringGrid1.Cells[(k-1),h]:=MyStr;
Delete(aString,1,SepCharPos); //删除第一个分隔符和第一个分隔符之前的字符串
end
end;
//ProgressBar1.Position :=h; //显示进度
end;
i:= StringGrid1.RowCount;
RecNo.Caption :=IntToStr(i-1); //这是一个Label,显示总共打开了多少条记录
end;
end;
 
好像不对,运行的结果只能显示第一列,且比原来多了一个空行。
 
加一个label1.Caption:=inttostr(k+1);在最后,出来的数字确实不是1啊。为什么
会只有一列的数据呢?

 
StringGrid1应该为
IntToStr(i-1)行IntToStr(k-1)列
注意:这里IntToStr(k-1)列实际上是Memo中的最后一行的列数,
如果Memo中数据规整,即各行列数相同的话此数即为StringGrid的列数,
若Memo中数据不规整,即各行列数不相同的话,则还应在加入比较k大小的计数器
 
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,num:integer;
str:string;
begin
stringgrid1.RowCount:=memo1.lines.count+1;
for i:=0 to memo1.lines.count-1 do begin
str:=memo1.lines;
num:=pos(' ',str);
j:=1;
while num<>0 do begin
stringgrid1.cells[j,i+1]:=copy(str,1,num-1);
str:=copy(str,num+1,length(str)-num);
num:=pos(' ',str);
if j>=stringgrid1.colcount then stringgrid1.colcount:=j;
j:=j+1;
end;
end;
end;
 
to Linsb:
你的代码更简单,应该推荐,不过上述代码还有三个主要问题:
1、若在Memo每行数据最后不加一个空格,则始终无法读出最后一列;
2、若Memo中数据每行列数不等,则最终StringGrid的列数只等于Memo最后一行的列数;
3、上述代码列数总是少一列。
我替你完善如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,num:integer;
str:string;
MaxCol:Integer; //记录最大列数
begin
MaxCol:=0;
stringgrid1.RowCount:=memo1.lines.count+1;
for i:=0 to memo1.lines.count-1 do begin
str:=memo1.lines;
num:=pos(' ',str);
j:=1;
while num<>0 do begin
stringgrid1.cells[j,i+1]:=copy(str,1,num-1);
str:=copy(str,num+1,length(str)-num);
num:=pos(' ',str);
//if j>=stringgrid1.colcount then stringgrid1.colcount:=j;
j:=j+1;
if j>MaxCol-1 then
MaxCol:=j+1;
stringgrid1.colcount:=MaxCol;
end;
if Num=0 then
stringgrid1.cells[j,i+1]:=str;
end;
end;
 
to Teny
谢谢,但要判断:if j >= stringgrid1.colcount-1 then stringgrid1.colcount := j+1;
 
谢谢Teny and linsb,我看有一句还应该改一下
stringgrid1.colcount:=MaxCol-1;

 
请测试:
procedure TForm1.Button1Click(Sender: TObject);
var
i, j, num: integer;
str: string;
begin
//初始化
for i:=1 to stringgrid1.RowCount do
for j:=1 to stringgrid1.colCount do
stringgrid1.cells[j,i]:='';
stringgrid1.RowCount := memo1.lines.count + 1;
stringgrid1.colCount := 2;
for i := 0 to memo1.lines.count - 1 do begin
str := memo1.lines;
num := pos(' ', str);
j := 1;
while num <> 0 do begin
stringgrid1.cells[j, i + 1] := copy(str, 1, num - 1);
str := copy(str, num + 1, length(str) - num);
num := pos(' ', str);
j := j + 1;
if (j >=stringgrid1.colcount-1) and (num>0) then stringgrid1.colcount := j+1;
end;
if Num=0 then
stringgrid1.cells[j,i+1]:=str;
end;
for i:=1 to stringgrid1.colCount-1 do
stringgrid1.cells[i,0]:=IntToStr(i);//
for i:=1 to stringgrid1.RowCount-1 do
stringgrid1.cells[0,i]:=IntToStr(i);//
end;
 
不对

3 5 4
2 3 0 1
0 2 5 1
3 2 4 1
结果是
1 2 3 4 5
1 3 5 4
2 2 3 0 1
3 0 2 5 1
4 3 2 4 1
 
Teny完善的程序对于数据规整时可以。
当数据不规整时,多出的列数是每行的最大列数与每行的最小列数的差。
 
改:
if (j >=stringgrid1.colcount-1) and (num>0) then stringgrid1.colcount := j+1;
 
当数据不规整时,仍然会多出空列
 
分隔符用逗号,不用空格就可以了。
 
更简单的代码,空格,逗号都可以:
在Form中放在StringGrid,Memo1,Button
连接Button的Click事件:

procedure TForm1.Button1Click(Sender: TObject);
var
i,j,cf,rf:integer;
s:TStrings;
begin
cf:=StringGrid1.FixedCols;
rf:=StringGrid1.FixedRows;
s:=TStringList.Create ;
StringGrid1.ColCount:=cf+1;
StringGrid1.RowCount :=rf+memo1.Lines.Count;
for i:=0 to memo1.Lines.Count-1 do
begin
s.commaText:=Memo1.Lines;
if s.Count>StringGrid1.ColCount - cf
then StringGrid1.ColCount:=s.Count + cf;
for j:=0 to s.Count-1
do StringGrid1.cells[cf+j,rf+i]:=s[j];
end;
s.free;
end;

而且,已经考虑固定行和固定列的情况!
 
多人接受答案了。
 
jsxjd:
我想把第一行(fixrow=1的那一行)也作为导入数据的一行,怎么改你的那段代码?
 
后退
顶部