问题一
  Delphi7中设定Richedit1属性如下:  RichEdit1.Width:=160;
  RichEdit1.WordWrap:=false;
  RichEdit1.ScrollBars:=ssHorizontal; 请问:如何控制RichEdit1中当水平方向输入内容像素点超过其宽度比如500时能自动回车换行?问题二
  Delphi7中设定Richedit1属性如下:  RichEdit1.Width:=160;
  RichEdit1.Height:=160;
  RichEdit1.WordWrap:=true;
  RichEdit1.ScrollBars:=ssVertical; 请问:如何控制RichEdit1中当垂直方向输入内容高度达到或超过一个固定值比如500时末行禁止回车换行,而
       第1行~倒数第2行还可回车换行,但此时超过500高度的行将自动被删除?即限制RichEdit1中输入文字的
       总高度。

解决方案 »

  1.   

    第一个procedure TForm1.RichEdit1Change(Sender: TObject);
    var
      s:string;
      w:Integer;
      dc:HDC;
      size:TSize;
    begin
      s := Self.RichEdit1.Lines.Strings[RichEdit1.Lines.Count-1];
      dc := GetDC(RichEdit1.Handle);
      GetTextExtentPoint(dc,PAnsiChar(s),Length(s),size);
      w := size.cx;
      if w > RichEdit1.Width then
      begin
        ShowMessage('ok');//这里回车
      end;
    end;第二个同理procedure TForm1.RichEdit1Change(Sender: TObject);
    var
      s:string;
      w:Integer;
      dc:HDC;
      size:TSize;
    begin
      s := Self.RichEdit1.Lines.Strings[RichEdit1.Lines.Count-1];
      dc := GetDC(RichEdit1.Handle);
      GetTextExtentPoint(dc,PAnsiChar(s),Length(s),size);
      w := size.cy*RichEdit1.Lines.Count;
      if w > 200 then
      begin
        ShowMessage('ok');//这里可以做个全局标记,那样在会车时,判断这个标记
      end;
    end;
      

  2.   

    RichEdit控件会自动换行,不需要人工控制,至于限制输入高度,可以在事件内做下判断,至于什么事件,就不用说了吧。
      

  3.   

    bdmh:你好!经测试,你的方法计算的数值不准确,而且当每行文字大小不等时就更不适用了。
    比如第一个答案中:  
       w := size.cx;
      if w > RichEdit1.Width then
    还没到RichEdit1.Width就ShowMessage('ok')了。我原来有个比较精确的方法,但苦于不知如何加入回车才能保持每行的文字像素总长不超过1个定值,请高手指点:
    (以第1个问题为例)  RichEdit1.Width:=160;
      RichEdit1.WordWrap:=false;
      RichEdit1.ScrollBars:=ssHorizontal;procedure TForm1.RichEdit1Change(Sender: TObject);
    var
        SI: TScrollInfo;
    begin
        SI.cbSize := SizeOf(TScrollInfo);
        SI.fMask := SIF_ALL;
        GetScrollInfo(RichEdit1.Handle, SB_HORZ, SI);
        if SI.nMax>=RichEdit1.Width then
         begin
          ShowMessage('已经到了右边!'); 
          exit; 
          //我的困惑之处:如何刚好删除每行超过的文字又能回车将超过的文字移入下一行?
         end;
    end;
      

  4.   

    1、TRichEdit可以自动换行。你只设置有关参数即可。
    2、它有点象Word,还可以设段的左间隔与右间隔。
      

  5.   

    各位说的设置边界的是如下方法:
    var
      R: TRect;
    begin
      RichEdit1.Width:=150;
      RichEdit1.Height:=100;
      with RichEdit1 do
       begin
        R:=Rect(10,10,100,80);
        SendMessage(Handle, EM_SETRECT, 0, Longint(@R));
        Refresh;
       end;
    end;
    但仅限于不超过RichEdit1大小的范围内有效,如果设 RichEdit1.WordWrap:=false;
      RichEdit1.ScrollBars:=ssHorizontal;
    则如想让输入文字的宽度超过RichEdit1.Width后在某点自动换行,则上述方法无效,比如:
      RichEdit1.Width:=150;  R:=Rect(10,10,200,80);
      SendMessage(Handle, EM_SETRECT, 0, Longint(@R)); 当输入文字长度超过200时,只要你不回车,它就永远不会自动换行。
    目前发现TScrollInfo还有点靠谱,但就是不知怎样才能在超过200后自动将多余的文字回车到下一行。