我想知道在Android中实现富文本编辑器是否有任何好的选择.请注意我在谈论可以在Android应用程序中使用的富文本编辑器,而不是使用HTML和Javascript嵌入在网页中的编辑器.
我的要求是:
正如您所看到的,这几乎与Windows上的典型RichEdit控件非常相似.
以下是我迄今为止所做的一些努力(调查和原型设计):
我已经尝试使用WebView控件加载一个HTML片段.内容变得可编辑,因为它是HTML,我想它可以满足我的大多数要求.但它有几个问题:
我尝试过使用EditText控件.它似乎支持某种程度的富文本编辑(颜色,字体,粗体,斜体,下划线,内嵌图像,项目符号列表).但我仍然无法弄清楚如何实现以下要求:
顺便说一下,我已经看到有几个*Span类,但我不确定它们是否可以提供任何帮助......而http://developer.android.com并没有提供有关它们的有用信息.
那么,我怎么能在Android上实现富文本编辑器呢?我可以扩展EditText并添加我的新功能吗?或者我应该从头做什么 - 扩展视图并自己实现所有内容?对于后来的选项(扩展视图),我实际上甚至不知道如何显示文本插入符并使其闪烁,而不是提及用户键入移动插入符号.
我现在很绝望......有什么提示吗?
谢谢!
托尼
经过一番进一步调查后,看起来扩展EditText将是我最好的选择.我以某种方式弄清楚如何使用这些Span类并猜测我应该能够通过使用(扩展)它们来完成大部分技巧.
例如,扩展BulletSpan并覆盖drawLeadingMargin可以让我控制子弹的外观.扩展LeadingMarginSpan应该在编号列表上帮助我.
至于表格,我的初步计划是扩展LineBackgroundSpan并在drawBackground覆盖中绘制所有表格边框.但是,我仍然需要弄清楚如何布置表格单元格中的所有文本并正确处理插入符号移动和选择.建议?
当从Delphi 2006转换到Delphi XE2时,我们学到的一件事是RichEdit 2.0用CRLF
单个CR
字符替换内部对.这会导致基于VCL端的实际文本字符串丢弃所有字符索引计算的不幸影响.
通过跟踪VCL代码我可以看到的行为如下:
WM_GETTEXT
消息(完成TControl.GetTextBuf
)将返回包含CRLF
对的文本缓冲区.WM_GETTEXTLENGTH
消息(完成TControl.GetTextLen
)将返回一个值,就像文本仍包含CRLF
字符一样.EM_SETSELEX
消息(即设置SelStart
)会将输入值视为文本仅 包含CR
字符.这会导致我们的应用程序中的各种事情失败(例如语法突出显示).正如你所知道的那样,到目前为止,每一条新线都只有一个字符.
显然,由于这是不一致的行为,我们必须遗漏某些东西或做一些非常错误的事情.
有没有其他人有从RichEdit 1.0到RichEdit 2.0控件的过渡经验,你是如何解决这个问题的?最后,有没有办法强制RichEdit 2.0 CRLF
像RichEdit 1.0一样使用对?
是的,我知道我落后于时代,但我在这里得到的是一个古老的VB6编辑器应用程序,我相信没有人会很快升级到.NET.它使用了几个第三方DLL工具,因为它仍然使用旧的RichEdit控件,我基本上可以仅用这个工具来提升我自己的Bug场.
足够了,我正在试图看看我是否可以使用TDD,所以我可以开始为我需要修复的每个行为/功能编写单元测试,所以迟早我可以为这个工具提供一个完整的回归测试套件.即使在未来,如果我们升级到.NET,我认为我编写的大多数测试应该有助于验证正确的行为,并且应该可以升级到.NET版本,我想.
一些基本的谷歌搜索发送给我这个工具调用simplyVBunit,但我找不到足够的指南等让我开始,是的我不是那么精通VB6 :(
谢谢 :)
我已经尝试搞乱了vbunit,但我发现没有简单的方法将它添加到现有的应用程序或至少不知道如何.因此我发现这也与vb-lite-unit以及这个comunit一起玩.还有一些说法我们可以将NUnit与vb6一起使用,但是资源更少.
是否有更简单的方法来显示控件中的struct
字段及其对应的值RichEdit
?
这就是我现在正在做的事情:
AnsiString s;
s = IntToStr(wfc.fontColor);
RichEdit1->Lines->Append(s);
Run Code Online (Sandbox Code Playgroud)
等等...
有没有比单独呼叫每个人更简单的方法?我想读取一个二进制文件,然后在RichEdit
我正在构建的小实用程序的控件中显示相应的结构,并且没有找到其他方法.我知道如何读取二进制文件并将值读入struct
已经存在的文件中.
如何在同一行中写入文字但颜色不同?(我使用richedit).
procedure TForm1.btnEClick(sender: TObject);
begin
m0.SelAttributes.Color := clBlue;
m0.SelAttributes.Style := [fsBold];
m0.lines.add('This is blue and it is bold');
m0.SelAttributes.Color := clGreen;
m0.SelAttributes.Style := [fsBold];
m0.lines.add ('This is Green and it is bold');
m0.lines.add('');
m0.lines.add('But how to write text in the same line with different color?');
// i want to have both blue and green in the same line
end;
Run Code Online (Sandbox Code Playgroud)
最好的祝福,蜜蜂
在TRichEdit
控件的每一行的左侧,有一个不可见的空间,光标变为右上箭头,当您单击那里时,整个行被选中.当TRichEdit的文本对齐方式为中心或右侧时,很容易看到它.我相信这个空间被称为选择栏.
TMemo
控件中不存在这样的条.
我的问题:
如何删除此选择栏,以便光标行为与中的相同TMemo
?
我正在使用Delphi 7,没有TRichEdit
属性来控制这种行为.
ECO_SELECTIONBAR
您可以对EM_SETOPTIONS
消息使用一个值,但它只添加或删除选择栏的一小部分(仅当您要将选择栏添加到TRichEdit
具有左对齐的选区时才有用).
我试图在Delphi XE2 Starter Edition中的TRichEdit控件中使用Tables.(换句话说,我没有XE2的源代码 - 但我确实有TurboDelphi的源代码).我知道默认的RichEdit控件不使用支持表的MS RichEdit版本,因此我将其子类化为使用MS RichEdit v4.1,如此处1和此处所述6,并且还模拟了JEDI TjvRichEdit中的代码.(为简便起见,我没有包括代码段,用于确定DLL的其他比4.1版的RichEdit版本号,即我从JEDI借来的.的简化版本在此示出).
MSDN博客2指出,支持RTF表的Windows消息是MS RichEdit 4.1版的未记录功能,并且自Windows XP SP2起EM_INSERTTABLE消息可用.有关可用版本的更多信息,请参见此处3.
注释下面这个博客2,发布者:大卫金德于2008年09月26日,国家他能得到EM_INSERTTABLE消息的RichEdit 4.1版配合使用,这是我下面所示相同的代码(除了他没有用Delphi ).
有关EM_INSERTTABLE消息的详细信息,并支持它的结构,请参阅MSDN文档4(哪个国家,他们与Windows 8进行了介绍,但它清楚地预先日,通过至少两个主要的OS版本).还要注意的是结构的定义(一个或多个)已经有所改变,因为穆雷说他的博客2在2008年我已搜索到互联网的两端,并不能找到一个MS richedit.h版本与RichEdit中4.1去,并包含"没有文档的"结构TABLEROWPARMS和TABLECELLPARMS,因为它们当时存在,因此我仅限于MSDN文档,因为它们存在于Win8 4和Murray的博客2中,因为它们据称存在于Win XP和Win7中.
这是我的自定义RichEdit:
unit MyRichEdit;
//Customized RichEdit to use MS RichEdit v4.1
// Some stuff borrowed from Michael Lam's REdit (ca. 1998), found on the Torry page.
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
StdCtrls, ComCtrls, Printers, RichEdit;
type
{TableRowParms}
PTableRowParms …
Run Code Online (Sandbox Code Playgroud) 我在获取RichEdit控件以显示unicode RTF文本时遇到问题.我的应用程序是Unicode,因此所有字符串都是wchar_t字符串.
如果我将控件创建为"RichEdit20A",我可以使用例如SetWindowText,并以正确的格式显示文本.如果我将控件创建为"RichEdit20W",则使用SetWindowText逐字显示文本,即显示所有RTF代码.如果我使用EM_SETTEXTEX参数,指定MSDN告诉我的代码页1200用于指示unicode,则会发生同样的情况.
我已经尝试过使用StreamIn函数,但是如果我在ASCII文本中流式传输,这似乎只能起作用.如果我在widechars中流,那么我在控件中得到空文本.我使用SF_RTF | SF_UNICODE标志,MSDN暗示可能不允许这种组合.
那么该怎么办?有没有办法让宽带进入RichEdit而不会丢失RTF解释,或者我需要对其进行编码吗?我曾考虑尝试使用UTF-8,或者使用RTF中的编码工具,但我不确定最佳选择是什么.
我以前从不需要使用TRichEdit,总是使用TMemo.
当我添加像TMemo这样的文本时,我希望RichEdit自动滚动到最后.了解添加一些数据后的样子:
如您所见,滚动条保持在顶部,但我希望它在我添加文本时保持在底部.
我已经谷歌搜索了解决方案,但我找不到一个好的和可靠的.
我目前正在将我们的软件解决方案从Delphi 7迁移到2010年.大多数情况下,这些变化很简单,只剩下少量的障碍.
在表单上我们使用TRichEdit,它显示从MSSQL数据库中的blob字段中获取的rtf文本.这是它在Delphi 7中的工作方式:
//Get RTF text from Blob field using TADOQuery
rtfStream := sql.CreateBlobStream(sql.FieldByName('rtftext'), BmRead) as TMemoryStream;
//Load into TRichEdit
RichEdit.PlainText := False;
RichEdit.Lines.LoadFromStream(rtfStream);
Run Code Online (Sandbox Code Playgroud)
这将在TRichEdit组件中按预期显示RTF,但Delphi 2010中的相同代码将RTF显示为纯文本,每个字符之间带有选项卡.我认为这与从Ansi到Unicode的变化有很大关系,但我没有任何运气来纠正这个问题.
任何有助于此工作的帮助将非常感激.谢谢
richedit ×10
delphi ×6
unicode ×2
.net ×1
android ×1
ansi ×1
autoscroll ×1
c++ ×1
c++builder-5 ×1
delphi-2010 ×1
delphi-xe2 ×1
fonts ×1
mfc ×1
newline ×1
rtf ×1
scroll ×1
struct ×1
tdd ×1
unit-testing ×1
vb6 ×1