+ -
当前位置:首页 → 问答吧 → memo读取分隔符一侧的字符串并存成数组

memo读取分隔符一侧的字符串并存成数组

时间:2011-09-20

来源:互联网

例如memo中有这么一行: ad=a×b
 现在想提取“=”号左侧包括“=”在内的字符串,即提取这段“ad=”字符串,当我按下键盘回车键时,memo下一行即自动生成“ad=”的样式。效果要的是这样:
 
 ad=a×b //第一行
 ad= //键盘回车,产生第二行
 ad= //键盘回车,产生第三行
 ad= //键盘回车,产生第四行
 请问该如何做呢?请高手解答,谢谢!因为右侧的字符串要进行数学计算,所以存为数组。

作者: lcop2011   发布时间: 2011-09-20

处理memo的按键消息如果是回车,则提取第一行的字符串例如
index:=pos(memo1.lines[0],'=');memo1.lines.add(leftstr(memo1.lines[0],index));

作者: m617105   发布时间: 2011-09-20

就是个简单的字符串截取,pos,copy

作者: bdmh   发布时间: 2011-09-20

新建一个工程、双击窗体、用下列代码覆盖你的unit1所有内容:
Delphi(Pascal) code
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure MemoKeyPress(Sender: TObject; var Key: Char);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var v1,v2:array of integer;
    arrayindex:integer;
    StatusBar:TStatusBar;
    Memo:TMemo;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  Form1.Height:=240;
  Form1.Width:=260;
  Form1.Position:=poScreenCenter;
  Form1.Caption:='分解memo中的字符';
  Memo:=TMemo.Create(self);
  Memo.Parent:=form1;
  Memo.OnKeyPress:=MemoKeyPress;
  Memo.Align:=alClient;
  StatusBar:=TStatusBar.Create(self);
  StatusBar.Parent:=form1;
  for i:=0 to 4 do
  begin
    StatusBar.Panels.Add;
    StatusBar.Panels[i].Width:=66;
  end;
  StatusBar.Panels[2].Width:=12;
end;

procedure TForm1.MemoKeyPress(Sender: TObject; var Key: Char);
var i,j,y,len,tmp1,tmp2:integer;
    s,ls,ms,rs:string;
begin
  if key=#13 then
  begin
    key:=#0;   //不让转行
    y:=Memo.CaretPos.Y;//当前行索引
    s:=memo.Lines.Strings[y];//当前行的字符串
    len:=length(s);//当前行的长度
    i:=pos('=',s); //等号在当前行的位置
    j:=pos('x',s); //乘号在当前行的位置
    if (i=0)or(j=0)or(i>j)or(j<i+2)or(len<j+1) then //如果当前行式子不符合格式
      showmessage('式子未完整或不符合格式,回车无效。')
    else
    begin
      ls:=copy(s,1,i);
      ms:=copy(s,i+1,j-i-1);
      rs:=copy(s,j+1,len-j);
      try
        tmp1:=strtoint(ms);
        tmp2:=strtoint(rs);
      except
        showmessage('乘号两则不是整数,请更正。');
        exit;
      end;
      memo.Lines.Add(ls);
      inc(arrayindex);
      setlength(v1,arrayindex);
      setlength(v2,arrayindex);
      v1[arrayindex-1]:=tmp1; //存入数组
      v2[arrayindex-1]:=tmp2; //存入数组
      StatusBar.Panels[0].Text:=StringOfChar(' ',10-length(ls))+ls;
      StatusBar.Panels[1].Text:=StringOfChar(' ',10-length(ms))+ms;
      StatusBar.Panels[2].Text:='x';
      StatusBar.Panels[3].Text:=StringOfChar(' ',10-length(rs))+rs;
    end;
  end;
end;

end.

作者: gzzai   发布时间: 2011-09-20

除了1楼的方法外还可以利用TString的特性来做
在memo的按键消息中处理:
if key=#13 then
  if memo.lines.count>0 then
  if pos('=',memo.lines[0] > 0)
  memo.lines.add(memo.lines.name[0]+'='); 


作者: xiaxia421   发布时间: 2011-09-20

好的,多谢指点,我马上研究下看看,

作者: lcop2011   发布时间: 2011-09-20

你们楼上的代码谁的都试过了,不行,代码给完整点啊。小弟初学delphi,有的概念都还没搞明白。

作者: lcop2011   发布时间: 2011-09-20

开玩笑!我的代码是经过校验才放上来的,足够完整的了,除非你对自己的要求表述出了问题,我的代码是根据你的要求弄的。

你新开一个工程、双击工程中的窗体、复制我在三楼的代码,粘贴并覆盖你的unit1中所有内容,然后编译和运行,试着输入 12=3x4 回车,看看效果。

作者: gzzai   发布时间: 2011-09-20

输入: 发财=256x1024 回车,这样亦可

作者: gzzai   发布时间: 2011-09-20