線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1646
推到 Plurk!
推到 Facebook!

有關RichEdit上的文字問題

尚未結案
jason8668
一般會員


發表:17
回覆:31
積分:9
註冊:2003-11-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-22 02:00:57 IP:211.76.xxx.xxx 未訂閱
如果我在RichEdit上不使用它的捲軸,而是我自己再加入ScrollBar的物件,那要如果在移動捲軸上下時,RichEdit上的文字也會跟都移動呢?因為找過相關文章好像找不到ㄟ不知有人可否告訴我呢?謝謝喔~
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-23 10:24:31 IP:218.167.xxx.xxx 未訂閱
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
  SendMessage(RichEdit1.Handle, WM_HSCROLL, scrollPos, 0);
end;    procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
begin
  SendMessage(RichEdit1.Handle, WM_VSCROLL, scrollPos, 0);
end;    
jason8668
一般會員


發表:17
回覆:31
積分:9
註冊:2003-11-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-23 17:01:41 IP:211.23.xxx.xxx 未訂閱
chris_shieh,我想請問一下我在拉捲軸的時候雖然RichEdit裡的內容會移動,但是不夠順,感覺好像在亂跳,有時拉的時候還會顯示在第一筆的內容,不知道有什麼辦法避免呢?謝謝喔~
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-24 16:44:33 IP:218.167.xxx.xxx 未訂閱
//參考 http://delphi.ktop.com.tw/topic.php?topic_id=27548 改寫
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;    type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    ScrollBar1: TScrollBar;
    ScrollBar2: TScrollBar;
    Label1: TLabel;
    Label2: TLabel;
    procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure FormCreate(Sender: TObject);
  private
    procedure NewWinProc(var Message: TMessage);
    { Private declarations }
  public
    OldWinProc:TWndMethod;
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.FormCreate(Sender: TObject);
begin
  OldWinProc:=RichEdit1.WindowProc;
  RichEdit1.WindowProc:=NewWinProc;
  RichEdit1.ScrollBars:=ssBoth;//藉以顯示同步效果
end;    procedure TForm1.NewWinProc(var Message: TMessage);
var
  min, max:integer;
begin
  OldWinProc(Message);      case  (Message.Msg) of
    WM_VSCROLL:
      begin
        ScrollBar2.Position := GetScrollPos(RichEdit1.Handle, SB_VERT);
        GetScrollRange(RichEdit1.Handle, SB_VERT, min, max);
        ScrollBar2.Min := min;
        ScrollBar2.Max := max;
      end;
    WM_HSCROLL:
      begin
        ScrollBar1.Position := GetScrollPos(RichEdit1.Handle, SB_HORZ);
        GetScrollRange(RichEdit1.Handle, SB_HORZ, min, max);
        ScrollBar1.Min := min;
        ScrollBar1.Max := max;
      end;
  end;
end;    procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
var
  wParam:integer;
begin
  wParam := ScrollPos shl        16;
  wParam := wParam   LOWORD(ScrollCode);
  SendMessage(Richedit1.Handle, WM_HSCROLL, wParam, 0);
end;    procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
var
  wParam:integer;
begin
  wParam := ScrollPos shl        16;
  wParam := wParam   LOWORD(ScrollCode);
  SendMessage(Richedit1.Handle, WM_VSCROLL, wParam, 0);
end;    end.
發表人 - chris_shieh 於 2004/12/24 16:47:53
jason8668
一般會員


發表:17
回覆:31
積分:9
註冊:2003-11-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-28 01:23:47 IP:211.76.xxx.xxx 未訂閱
可否再請問一下,為何一定要加入『RichEdit1->ScrollBars=ssBoth』這行才能使捲軸完全正常,如果不加入這行的話,雖然是可以捲動但是捲動到最後不會顯示最後的東西。我是想不要加入這行,看可不可以正常動作。 以下是我的畫面,左邊的 RichEdit1 我設定的數最大是19,但是拉完捲軸後,內容只會停在13。
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-28 18:54:16 IP:218.167.xxx.xxx 未訂閱
我想應該是跟ssBoth 或 ssNone 無關 應該是跟ScrollRange 有關 我試結果OK    
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;    type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    ScrollBar1: TScrollBar;
    ScrollBar2: TScrollBar;
    Label1: TLabel;
    Label2: TLabel;
    procedure ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
      var ScrollPos: Integer);
    procedure FormCreate(Sender: TObject);
  private
    procedure NewWinProc(var Message: TMessage);
    procedure UpdateScrollRange;        { Private declarations }
  public
    ssStyle:TScrollStyle;
//    OldWinProc:TWndMethod;
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.FormCreate(Sender: TObject);
begin
//  OldWinProc:=RichEdit1.WindowProc;
//  RichEdit1.WindowProc:=NewWinProc;
  RichEdit1.ScrollBars:=ssNone;
  UpdateScrollRange;
end;    //每次RichEdit1 內容有更動時都要呼叫一次 以更新 ScrollBar1,2 的Range
procedure TForm1.UpdateScrollRange;
var
  min, max:integer;
  pt:TPoint;
begin
  ssStyle:=RichEdit1.ScrollBars;
  RichEdit1.ScrollBars:=ssBoth;//藉以取得Scroll Range效果
  GetScrollRange(RichEdit1.Handle, SB_VERT, min, max);
  ScrollBar2.Min := min;
  ScrollBar2.Max := max;
  GetScrollRange(RichEdit1.Handle, SB_HORZ, min, max);
  ScrollBar1.Min := min;
  ScrollBar1.Max := max;
  RichEdit1.ScrollBars:=ssStyle;//回復原來狀態
end;    procedure TForm1.NewWinProc(var Message: TMessage);
var
  min, max:integer;
  APoint:TPoint;
begin
  OldWinProc(Message);      case  (Message.Msg) of        //這些內容如果沒有Scrollbar存在就抓不到了  //必須另外處理移動游標,(經由Keyboard或Mouse) 所產生的訊息, 才能讓ScrollBar跟RichEdit同步       
    WM_VSCROLL:   
      begin
        ScrollBar2.Position := GetScrollPos(RichEdit1.Handle, SB_VERT); 
        GetScrollRange(RichEdit1.Handle, SB_VERT, min, max);
        ScrollBar2.Min := min;
        ScrollBar2.Max := max;
      end;
      
    //這些內容如果沒有Scrollbar存在就抓不到了  //必須另外處理移動游標,(經由Keyboard或Mouse) 所產生的訊息, 才能讓ScrollBar跟RichEdit同步      
    WM_HSCROLL:   //這些內容如果沒有Scrollbar存在就抓不到了
      begin
        ScrollBar1.Position := GetScrollPos(RichEdit1.Handle, SB_HORZ);
        GetScrollRange(RichEdit1.Handle, SB_HORZ, min, max);
        ScrollBar1.Min := min;
        ScrollBar1.Max := max;
      end;
  end;
end;    procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
var
  wParam:integer;
begin
  wParam := ScrollPos shl        16;
  wParam := wParam   LOWORD(ScrollCode);
  SendMessage(Richedit1.Handle, WM_HSCROLL, wParam, 0); //這樣就可以讓RichEdit跟ScrollBar 同步
end;    procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode;
  var ScrollPos: Integer);
var
  wParam:integer;
begin
  wParam := ScrollPos shl        16;
  wParam := wParam   LOWORD(ScrollCode);
  SendMessage(Richedit1.Handle, WM_VSCROLL, wParam, 0);  //這樣就可以讓RichEdit跟ScrollBar 同步
end;        end.        
jason8668
一般會員


發表:17
回覆:31
積分:9
註冊:2003-11-01

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-30 02:12:28 IP:211.76.xxx.xxx 未訂閱
我用了您的方法,但是現在捲軸不會跟著一起動了,一定要按最上面跟最下面的箭頭內容才會跟著動?
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-30 10:01:35 IP:219.68.xxx.xxx 未訂閱
你所謂的捲軸不會跟著一起動是指? RichEdit 捲軸不會跟著一起動? 我已經把RichEdit 捲軸拿掉了喔 還是? 要不要把程式碼貼上來看看 目前程式碼做到的動作就是 "由外部捲軸控制RichEdit 內容的捲動" 我試過了是正常的
jason8668
一般會員


發表:17
回覆:31
積分:9
註冊:2003-11-01

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-31 12:05:31 IP:211.76.xxx.xxx 未訂閱
//---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; TScrollStyle ssStyle; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::NewWinProc(TMessage & Message) { int min, max; TPoint APoint; switch(Message.Msg) { case WM_VSCROLL: ScrollBar1->Position = GetScrollPos(RichEdit1->Handle, SB_VERT); GetScrollRange(RichEdit1->Handle, SB_VERT, &min, &max); ScrollBar1->Min = min; ScrollBar1->Max = max; break; case WM_HSCROLL: ScrollBar2->Position = GetScrollPos(RichEdit1->Handle, SB_HORZ); GetScrollRange(RichEdit1->Handle, SB_HORZ, &min, &max); ScrollBar2->Min = min; ScrollBar2->Max = max; break; } } void __fastcall TForm1::FormCreate(TObject *Sender) { UpdateScrollRange(); } //--------------------------------------------------------------------------- void __fastcall TForm1::UpdateScrollRange() { int min, max; TPoint pt; ssStyle=RichEdit1->ScrollBars; RichEdit1->ScrollBars=ssBoth; GetScrollRange(RichEdit1->Handle, SB_VERT, &min, &max); ScrollBar1->Min = min; ScrollBar1->Max = max; GetScrollRange(RichEdit1->Handle, SB_HORZ, &min, &max); ScrollBar1->Min = min; ScrollBar1->Max = max; RichEdit1->ScrollBars=ssStyle; } void __fastcall TForm1::Button1Click(TObject *Sender) { for(int i=0;i<20;i ) { RichEdit1->Lines->Add(IntToStr(i)); } } //--------------------------------------------------------------------------- void __fastcall TForm1::ScrollBar1Scroll(TObject *Sender, TScrollCode ScrollCode, int &ScrollPos) { int wParam; wParam = ScrollPos << 16; wParam = wParam LOWORD(ScrollCode); SendMessage(RichEdit1->Handle, WM_VSCROLL, wParam, 0); } //--------------------------------------------------------------------------- 以上是我的程式,我的意思是說沒辦法拖曳ScrollBar來讓內容移動,必須用ScrollBar的上下箭頭才能讓內容移動,不知我的程式是不是有問題呢?
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-01-04 10:52:20 IP:218.167.xxx.xxx 未訂閱
奇怪 我是可以的啊 我是比較好奇 為什麼你會變成 ScrollBar 的 OnChange Event 來帶動 RichEdit 您應該有把 ScrollBar1 的 OnScroll Event 指定到 ScrollBar1Scroll吧
系統時間:2024-05-04 14:10:47
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!