1.实现字符串 导入(str 是那个字符串) arr_i:=1;
substr:='';
for i=1 to length(str) do
begin
if (copy(str,i,1)='@' ) or (i=length(str)) then
begin
stringarray[arr_i]:=substr;
substr:='';
arr_i:=arr_i+1;
end
else
substr:=substr + copy(str,i,1)
end;
substr:='';
for i=1 to length(str) do
begin
if (copy(str,i,1)='@' ) or (i=length(str)) then
begin
stringarray[arr_i]:=substr;
substr:='';
arr_i:=arr_i+1;
end
else
substr:=substr + copy(str,i,1)
end;
function sp(s,c) 用c截断s
r:array of string
i:=pos(c,s)
j:=0
while i>0 begin
r[j]:=copy(s,1,i-1)
s:=copy(s,i+1,200000)
j:=j+1
i:=pos(c,s)
end
r[j]:=s
result:=r
只是算法示意,不是程序哦
to IUPRG,scripting(排名不分先后!):
俺起先也是用此法,当字符串很长的时候速度不理想,
所以来问问有没别的更好的方法。第2个问题呢?
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
stringarr:Array[1..50] of string;
flagarr:Array[1..50] of integer;//用来存@在s中的位置
i,j,number:integer;//number用来标志@的个数
begin
j:=0;number:=0;
s:=inputbox('输入串','请输入一个串','');
for i:=1 to length(s) do
if copy(s,i,1)='@' then
begin
j:=j+1;number:=number+1;//j用来控制数组flagarr单元位置
flagarr[j]:=i;//存入@在串中所在的位置
end;
j:=1;
for i:=1 to number do
begin
stringarr[i]:=copy(s,j,flagarr[i]-j);
showmessage(stringarr[i]);
j:=flagarr[i]+1;
end;
stringarr[i+1]:=copy(s,j,length(s)-j+1);
showmessage(stringarr[i+1]);
end;
2)我并不觉这个很重要
var substr:ansistring;
...
begin
...
arr_i:=1;
setlength(substr,100); //100是你中间的字符串的最大估计
substr:='';
for i=1 to length(str) do
begin
if (str[i]='@' ) or (i=length(str)) then
begin
Delete(substr,100-j,j+1);
stringarray[arr_i]:=substr;
j:=1;
inc(arr_i);
end
else
begin
substr[j]:=str[i];
inc(j);
end;
end;
它自动适应。不知你是如何打算的?
第一个问题速度上是没问题了呵~~~~至于第二个问题,俺是希望memo控件能完全显示其内容(不大不小刚好)
MEMO是放在普通FORM上的,比如有个MEMO的高和宽都为10,且内容为空,
然后再将一长串字符赋给MEMO,这时MEMO出现了滚动栏(高和宽还是没变的)
而我要的功能是,MEMO能根据内容自动调整大小(高和宽),以便用户可以看见所有的内容。比如MEMO的ENABLED的属性为FALSE时,赋一长串TEXT后用户就点不了滚动栏了。
memo.width:=(max length of memo.lines[])X 字符宽的系数
memo.height:=(memo.lines.count) X 行高系数
就是宽和高
其次用 memo.lines.count 乘以 字符高度(行高)来指定memo.height