CBuilder/Delphi的HTML编辑器

5

我需要一个基本的WYSIWYG HTML编辑器组件,用于C++ Builder 5,让用户创建一些简单的文本,然后我将把它们粘贴到现有的HTML页面模板中。只需要简单支持创建链接、添加图片以及使用标题/加粗/斜体等功能。

4个回答

8
您可以在窗体上放置一个TWebBrowser并启用其设计模式,方法如下:
// Delphi code..
(WebBrowser1.Document as IHTMLDocument2).designMode := 'on';

执行以上代码后,页面将变为可编辑状态。您可以输入额外的文本,删除等操作。如果您想要将选择加粗或插入图片,则需要添加一些按钮来编程实现。有趣的是,您可以从Delphi(或在您的情况下是C++ Builder)中完成这些操作,也可以在页面上添加javascript来进行自我编辑。
页面内容可以从以下位置检索:
(WebBrowser.Document as IHTMLDocument2).body.innerHTML;

请记住(WebBrowser.Document as IHTMLDocument2)可能为空。
无论如何,我可以想象周围有一些组件可以为您完成所有工作,这可能是一个比重新发明轮子更好的路线。

我希望有一个已经包含所有按钮的组件 - 就像一个简化版的Frontpage。 - Riho
2
如果您拥有RADPHP,请查看Embarcadero\RadPHP\3.0\plugins\文件夹。您会发现uHTMLEdit.pasuHTMLEdit.dfm。这是一个单窗体HTML编辑器,除了标准VCL之外没有其他依赖项。 - Wouter van Nifterick
@WoutervanNifterick -我尝试过这个单元,但它无法处理大多数HTML文件:http://www.stackoverflow.com/questions/39594393/twebbrowser-crashes-with-some-html-files - Gabriel
执行以上代码后,页面将变为可编辑状态。在此之前,我必须添加 webBrowser1.Navigate('about:blank') 以避免异常错误——可能是因为没有页面的缘故。 - Toby

4
我会推荐 TRichView,因为它具有世界级的支持和深度功能集。虽然它不是真正的“HTML”编辑器,但它支持导出为HTML,甚至在必要时生成适当的CSS样式。我用它来处理我们主要产品的电子邮件部分,效果非常好。内部存储可以是RTF(扩展以更好地支持图像)或专有格式。有很多简单的编辑器示例,可以轻松满足您的需求。

我已经使用TRichView将近10年了。它很好,但对于一个简单的编辑器来说可能有些过度。唯一的缺陷是它还不能处理图像的对齐。我们已经多年在向Sergey施压,试图让他添加这个功能。它总是被推迟到下一个版本。(也许这条评论会激励他)。 - lkessler

1

http://www.bsalsa.com/

提供一套免费的EmbeddedWebBrowser组件,其中包括一个编辑设计器组件,您可以将其链接到EmbeddedBrowser窗口以控制设计模式并进行编辑控制,保存文件、插入链接、图像等等...

看起来运行良好!


1
在C++ Builder中,它应该是这样的:
(wb是一个TCppWebBrowser)
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "mshtml.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnNavigateAndEditClick(TObject *Sender)
{
        wb->Navigate((WideString)"www.google.com");
        while (wb->Busy)
                Application->ProcessMessages();

        if (wb->Document)
        {
                IHTMLDocument2 *html;
                wb->Document->QueryInterface<IHTMLDocument2>(&html);
                html->put_designMode(L"On");
                html->Release();
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnInsertImageClick(TObject *Sender)
{
    if (wb->Document)
    {
          IHTMLDocument2 *html;
          wb->Document->QueryInterface<IHTMLDocument2>(&html);
          VARIANT var;
          VARIANT_BOOL receive;
          html->execCommand(L"InsertImage",true,var, &receive);
          html->Release();
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnGetHtmlClick(TObject *Sender)
{
        if (wb->Document)
        {
                IHTMLDocument2 *html;
                wb->Document->QueryInterface<IHTMLDocument2>(&html);
                IHTMLElement *pElement;
                html->get_body(&pElement);
                pElement->get_parentElement(&pElement);
                wchar_t *tmp;
                pElement->get_outerHTML(&tmp);
                Memo1->Lines->Text = tmp;
                pElement->Release();
                html->Release();
        }
}
//---------------------------------------------------------------------------

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接