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

memo有辦法設定長度和寬度嗎?

答題得分者是:wkshei
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-09-05 10:21:25 IP:211.22.xxx.xxx 未訂閱
請問memo元件有無辦法設定長度和寬度 我指的寬度是每條line的 maxlength 長度指的是lines.count 我試了一下設定lines.count,但這是不合法的 而memo1.maxlength指的是text的maxlength 如要達到我說的功能 不知有無辦法做到
lcsboy
版主


發表:87
回覆:622
積分:394
註冊:2002-06-18

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-09-05 15:30:41 IP:211.23.xxx.xxx 未訂閱
你的問題 長度: 指每一個Line, Text的最大pixel嗎? <---- 只能讀, 好像不能設 寬度: 指每一個Line, 所以存放的字元數嗎?<---- 也沒有, 除非自己作
wkshei
一般會員


發表:3
回覆:9
積分:7
註冊:2002-04-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-09-08 23:58:52 IP:61.16.xxx.xxx 未訂閱
我有寫了一個類似功能正在測試中: 作法是利用Memo Onchange時啟動 執行結果好像還可以 //================================================ // 1. 每行長度限制在20 Byte (不含換行鍵2Byte) // aSplitLen=20 // 2. GetMemoPos 處理目前 TMemo 目前所在之游標位置及其最後一位之游標位置 // Input aInMemo // Output CurPos, LastPos // 3. SplitLine 處理字串分裂成2行時,字串1與字串2之長度計算處理 // Input aInstr // Input aSplitLen // Output S1Len,S2Len // 4. Application.ProcessMessages:可讓新注音法一次差入數個中文字 //================================================== Procedure UTL_CtlMemo(aMemo:TMemo; Const aSplitLen:Integer); var Prvstr,NewStr:String; i:integer; S1,S2:String; s1Len,s2Len:Integer; adjPos,CurPos,LastPos:Integer; isover:Boolean; Label NextTag; begin //Application.ProcessMessages; //Do'nt Remove or change this Line UTL_GetMemoPos(aMemo,aSplitLen,curpos,LastPos,AdjPos,isOver); //Save目前游標位置,及最後一字位置 // CurPos:=aMemo.selStart; //Save目前游標位置 // LastPos:=(Length(aMemo.Lines.Text)-2); //Save目前Memo目前最後後位置 PrvStr:=''; NewStr:=''; for i:=0 to aMemo.Lines.Count-1 do begin NewStr:=PrvStr aMemo.Lines[i]; UTL_SplitLine(NewStr,aSplitLen,S1Len,S2Len); S1:=Copy(NewStr,1,s1Len); S2:=Copy(NewStr,S1Len 1,s2Len); aMemo.Lines[i]:=S1; PrvStr:=S2; NextTag: end; //最後一行處理 if Length(PrvStr) > 0 then aMemo.Lines.Add(PrvStr); //游標位置指定處理 If Curpos < LastPos then begin aMemo.SelStart:=adjPos; end else aMemo.SelStart:= (Length(aMemo.Lines.Text)-2); end; //=========================================================================== // 2. GetMemoPos 處理目前 TMemo 目前所在之游標位置及其最後一位之游標位置 // CurPos : 目前所在之游標位置 // LastPos : Memo 最後一位之游標位置 // isOver : 目前游標座落於 aSplitLen 之外 //=========================================================================== Procedure UTL_GetMemoPos(Const aInMemo:TMemo; Const aSplitLen:Integer; var CurPos,LastPos,AdjPos:Integer; var isOver:Boolean); var i,L,T,n,y:Integer; begin CurPos:=aInMemo.selStart; //Save目前游標位置 LastPos:=(Length(aInMemo.Lines.Text)-2); //Save目前Memo目前最後後位置 T:=0; isOver:=false; AdjPos:=CurPos; for i:=0 to aInMemo.Lines.Count-1 do begin L:= Length(aInMemo.Lines[i]) 2; //該行總長度 T:=T L; if (Curpos > T-L) and(CurPos <= T) then //Curpos 在本行 begin if (CurPos > T-L aSplitLen) then //Curpos Over 該行之aSplitLen begin y:= ((L-aSplitLen) Mod aSplitLen); if y > 0 then n:= ((L-aSplitLen) div aSplitLen) 1 //Over之字串可折之行數 else n:= ((L-aSplitLen) div aSplitLen); AdjPos:=Curpos (2 * n); isOver:=True; Break; end; end; end; end; Hsieh
------
Hsieh
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-09-09 09:30:52 IP:211.22.xxx.xxx 未訂閱
引言: 我有寫了一個類似功能正在測試中: 作法是利用Memo Onchange時啟動 執行結果好像還可以 //================================================ // 1. 每行長度限制在20 Byte (不含換行鍵2Byte) // aSplitLen=20 // 2. GetMemoPos 處理目前 TMemo 目前所在之游標位置及其最後一位之游標位置 // Input aInMemo // Output CurPos, LastPos // 3. SplitLine 處理字串分裂成2行時,字串1與字串2之長度計算處理 // Input aInstr // Input aSplitLen // Output S1Len,S2Len // 4. Application.ProcessMessages:可讓新注音法一次差入數個中文字 //================================================== Procedure UTL_CtlMemo(aMemo:TMemo; Const aSplitLen:Integer); var Prvstr,NewStr:String; i:integer; S1,S2:String; s1Len,s2Len:Integer; adjPos,CurPos,LastPos:Integer; isover:Boolean; Label NextTag; begin //Application.ProcessMessages; //Do'nt Remove or change this Line UTL_GetMemoPos(aMemo,aSplitLen,curpos,LastPos,AdjPos,isOver); //Save目前游標位置,及最後一字位置 // CurPos:=aMemo.selStart; //Save目前游標位置 // LastPos:=(Length(aMemo.Lines.Text)-2); //Save目前Memo目前最後後位置 PrvStr:=''; NewStr:=''; for i:=0 to aMemo.Lines.Count-1 do begin NewStr:=PrvStr aMemo.Lines[i]; UTL_SplitLine(NewStr,aSplitLen,S1Len,S2Len); S1:=Copy(NewStr,1,s1Len); S2:=Copy(NewStr,S1Len 1,s2Len); aMemo.Lines[i]:=S1; PrvStr:=S2; NextTag: end; //最後一行處理 if Length(PrvStr) > 0 then aMemo.Lines.Add(PrvStr); //游標位置指定處理 If Curpos < LastPos then begin aMemo.SelStart:=adjPos; end else aMemo.SelStart:= (Length(aMemo.Lines.Text)-2); end; //=========================================================================== // 2. GetMemoPos 處理目前 TMemo 目前所在之游標位置及其最後一位之游標位置 // CurPos : 目前所在之游標位置 // LastPos : Memo 最後一位之游標位置 // isOver : 目前游標座落於 aSplitLen 之外 //=========================================================================== Procedure UTL_GetMemoPos(Const aInMemo:TMemo; Const aSplitLen:Integer; var CurPos,LastPos,AdjPos:Integer; var isOver:Boolean); var i,L,T,n,y:Integer; begin CurPos:=aInMemo.selStart; //Save目前游標位置 LastPos:=(Length(aInMemo.Lines.Text)-2); //Save目前Memo目前最後後位置 T:=0; isOver:=false; AdjPos:=CurPos; for i:=0 to aInMemo.Lines.Count-1 do begin L:= Length(aInMemo.Lines[i]) 2; //該行總長度 T:=T L; if (Curpos > T-L) and(CurPos <= T) then //Curpos 在本行 begin if (CurPos > T-L aSplitLen) then //Curpos Over 該行之aSplitLen begin y:= ((L-aSplitLen) Mod aSplitLen); if y > 0 then n:= ((L-aSplitLen) div aSplitLen) 1 //Over之字串可折之行數 else n:= ((L-aSplitLen) div aSplitLen); AdjPos:=Curpos (2 * n); isOver:=True; Break; end; end; end; end; Hsieh
我想測一下你的程式碼 但少了這個 UTL_SplitLine(NewStr,aSplitLen,S1Len,S2Len); procedure 謝謝你提供一下
天外來客
初階會員


發表:22
回覆:199
積分:44
註冊:2001-11-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-09-09 18:13:40 IP:61.16.xxx.xxx 未訂閱
//================================================ // 1. 每行長度限制在20 Byte (不含換行鍵2Byte) // aSplitLen=20 // 2. GetMemoPos 處理目前 TMemo 目前所在之游標位置及其最後一位之游標位置 // Input aInMemo // Output CurPos, LastPos // 3. SplitLine 處理字串分裂成2行時,字串1與字串2之長度計算處理 // Input aInstr // Input aSplitLen // Output S1Len,S2Len //================================================== procedure TFrmMain.Memo1Change(Sender: TObject); var i,k:integer; temp:Tstrings; begin Application.ProcessMessages; //Do'nt Remove or change this Line Memo1.OnChange:=Nil; // temp := TstringList.Create; k:=memo1.SelStart; for i := 0 to Memo1.Lines.Count-1 do begin temp.Add(Memo1.Lines[i]); end; Memo1.Lines:=temp; memo1.selstart:=k; // UTL_CtlMemo(Memo1,20); Memo1.OnChange:=self.Memo1Change; end; //考慮中文字 Function UTL_SplitLine(Const aInStr:String;aSplitLen:Integer;var S1Len,S2Len:Integer):Integer; var i,aLen,aOrd:Integer; BlockNo:Integer; IsDBCS:Boolean; begin Result:=0; S1Len:=0; S2Len:=0; aLen:=Length(aInStr); isDBCS:=False; BlockNo:=0; i:=1; while i <= aLen do begin aOrd:=ord(aInStr[i]); if (aOrd < 127) then IsDBCS:=False; if (aOrd>=127) then //中文碼第一Byte begin if isDBCS = False then BlockNo := BlockNo 1; i:=i 1; isDBCS:=True; end; if i <= aSplitLen then begin S1Len:=i; S2Len:=aLen-i; end; i:=i 1; end; // Result:=BlockNo; end;
wkshei
一般會員


發表:3
回覆:9
積分:7
註冊:2002-04-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-09-09 18:16:07 IP:61.16.xxx.xxx 未訂閱
Sorry 未登入即發出,上封未具名訪客,即本人所發. Hsieh
------
Hsieh
jck1
一般會員


發表:53
回覆:67
積分:24
註冊:2002-05-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-09-17 16:01:17 IP:211.22.xxx.xxx 未訂閱
引言: Sorry 未登入即發出,上封未具名訪客,即本人所發. Hsieh
謝謝 你的程式碼可以用 :) 但內容如果太長的話 會閃的很厲害 不知有無解決的方法
wkshei
一般會員


發表:3
回覆:9
積分:7
註冊:2002-04-11

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-09-23 02:17:26 IP:61.16.xxx.xxx 未訂閱
我有再修正一段如下,但對於內容太長的問題,尚無Idea?? 可能要勞駕高手指點了 Procedure UTL_GetMemoPos(Const aInMemo:TMemo; Const aSplitLen:Integer; var CurPos,LastPos,AdjPos:Integer; var isOver:Boolean); var i,L,T,n,y:Integer; P:TPoint; begin P:=aInMemo.CaretPos; //Save目前游標位置(第y行,第x位置 CurPos:=aInMemo.selStart; //Save目前游標位置 LastPos:=(Length(aInMemo.Lines.Text)-2); //Save目前Memo目前最後後位置 T:=0; isOver:=false; AdjPos:=CurPos; // if P.x > aSplitLen then begin n:=((P.x - aSplitLen) div aSplitLen) 1; AdjPos:=Curpos (2 * n); end; // { for i:=0 to aInMemo.Lines.Count-1 do begin L:= Length(aInMemo.Lines[i]) 2; //該行總長度 T:=T L; if (Curpos > T-L) and(CurPos <= T) then //Curpos 在本行 begin if (CurPos > T-L aSplitLen) then //Curpos Over 該行之aSplitLen begin y:= ((L-aSplitLen) Mod aSplitLen); if y > 0 then n:= ((L-aSplitLen) div aSplitLen) 1 //Over之字串可折之行數 else n:= ((L-aSplitLen) div aSplitLen); AdjPos:=Curpos (2 * n); isOver:=True; Break; end; end; end; } end; Hsieh
------
Hsieh
系統時間:2024-04-24 7:12:25
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!