delphi richedit
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delphi richedit相关的知识,希望对你有一定的参考价值。
我用opendialog打开一个文本文件,并导入到richedit中,可是有些时候,导入的时候,滚动条都跑到了最下面,而有时候滚动条却在最上面。
我需要的是,不管什么时候,打开文本文件都上滚动条保持在最上面,该怎么写?或者是修改哪个属性?
SendMessage(RichEdit1.Handle,WM_VSCROLL,SB_TOP,0);
delphi 7 richedit和罗马尼亚语
我正在尝试将一些罗马尼亚文本写入RichEdit组件(Delphi 7),甚至我将字体属性 - Charset设置为“EASTEUROPE_CHARSET”它不起作用。
我想要完成的是在RichEdit中粘贴一些文本(罗马尼亚语),加载到StringList中,将属性顺序设置为true并将其分配给另一个RichEdit组件(按字母顺序对列表进行排序)。
我知道这不应该是Delphi2009及以后的问题,但此时我只能使用Delphi 7。
单词例子:反对,计算机化。
有任何想法吗?
最好的祝福,
尝试此代码,它将RichEdit1中的文本作为UNICODE文本读取,手动将S和T +逗号转换为S和T + Cedilla,然后使用WideCharToMultiByte将文本转换为代码页1250.代码点转换需要完成,因为代码第1250页只对基于cedilla的Ş和versions版本进行编码,而Vista和Windows 7下的新罗马尼亚键盘生成了(正确的)以逗号为基础的Ş和versions版本!
procedure TForm1.Button1Click(Sender: TObject);
var GetTextStruct:GETTEXTEX;
GetLenStruct:GETTEXTLENGTHEX;
RequiredBytes:Integer;
NumberOfWideChars:Integer;
WideBuff:PWideChar;
AnsiBuff:PChar;
i:Integer;
begin
;
// Get length of text
GetLenStruct.flags := GTL_NUMBYTES or GTL_USECRLF or GTL_PRECISE;
GetLenStruct.codepage := 1200; // request unicode
RequiredBytes := SendMessage(RichEdit1.Handle, EM_GETTEXTLENGTHEX, Integer(@GetLenStruct), 0);
// Prepare structure to get all text
FillMemory(@GetTextStruct, SizeOf(GetTextStruct), 0);
GetTextStruct.cb := SizeOf(GetTextStruct);
GetTextStruct.flags := GT_USECRLF;
GetTextStruct.codepage := 1200; // request unicode
WideBuff := GetMemory(RequiredBytes);
try
// Do the actual request
SendMessage(RichEdit1.Handle, EM_GETTEXTEX, Integer(@GetTextStruct), Integer(WideBuff));
// Replace the "new" diactrics with the old (make Romanian text compatible with code page 1250)
NumberOfWideChars := RequiredBytes div 2;
for i:=0 to NumberOfWideChars-1 do
case Ord(WideBuff[i]) of
$0218: WideBuff[i] := WideChar($015E);
$0219: WideBuff[i] := WideChar($015F);
$021A: WideBuff[i] := WideChar($0162);
$021B: WideBuff[i] := WideChar($0163);
end;
// Convert to code-page 1250
RequiredBytes := WideCharToMultiByte(1250, 0, WideBuff, -1, nil, 0, nil, nil);
AnsiBuff := GetMemory(RequiredBytes);
try
WideCharToMultiByte(1250, 0, WideBuff, -1, AnsiBuff, RequiredBytes, nil, nil);
Memo1.Lines.Text := AnsiBuff; // AnsiBuff now contains the CRLF-terminated version of the
// text in RichEdi1, corectly translated to code page 1250
finally FreeMemory(AnsiBuff);
end;
finally FreeMemory(WideBuff);
end;
end;
然后使用类似的东西将AnsiString转换为UNICODE并推入RichEdit。当然,唯一真正的解决方案是切换到Delphi 2009或Delphi 2010并全部使用Unicode。
我已经用Jedi的JvWideEditor解决了这个问题。代码如下
procedure TForm2.SortUnicode;
var asrt:TWStringList;
i:Integer;
begin
JvWideEditor1.Lines.Clear;
JvWideEditor2.Lines.Clear;
asrt:=TWStringList.Create;
if OpenDialog1.Execute then
begin
wPath:=OpenDialog1.FileName;
JvWideEditor1.Lines.LoadFromFile(wPath,[foUnicodeLB]);
try
asrt.AddStrings(JvWideEditor1.Lines);
for i:=asrt.Count-1 downto 0 do
begin
if Trim(asrt.Strings[i])='' then
asrt.Delete(i);
end;
asrt.Duplicates:=dupAccept;
asrt.CaseSensitive:=true;
asrt.Sorted:=True;
JvWideEditor2.Lines.AddStrings(asrt);
JvWideEditor2.Lines.SaveToFile(GetCurrentDir+'
es.txt',[foUnicodeLB]);
finally
FreeAndNil(asrt);
end;
end;
end;
检查Windows中的语言设置。如果您正在运行英语窗口,请尝试将“将非unicode程序视为...”设置为罗马尼亚语。或者,在罗马尼亚语原生Windows上运行。要在混合环境中运行(需要同时显示不同的字符集),您可能需要Unicode。
以上是关于delphi richedit的主要内容,如果未能解决你的问题,请参考以下文章