memo有辦法設定長度和寬度嗎? |
答題得分者是:wkshei
|
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
|
lcsboy
版主 發表:87 回覆:622 積分:394 註冊:2002-06-18 發送簡訊給我 |
|
wkshei
一般會員 發表:3 回覆:9 積分:7 註冊:2002-04-11 發送簡訊給我 |
我有寫了一個類似功能正在測試中:
作法是利用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 發送簡訊給我 |
引言: 我有寫了一個類似功能正在測試中: 作法是利用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 發送簡訊給我 |
//================================================
// 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 發送簡訊給我 |
|
jck1
一般會員 發表:53 回覆:67 積分:24 註冊:2002-05-23 發送簡訊給我 |
|
wkshei
一般會員 發表:3 回覆:9 積分:7 註冊:2002-04-11 發送簡訊給我 |
我有再修正一段如下,但對於內容太長的問題,尚無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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |