VCL TRichEdit exampleサンプルブログラム


2017.6.11更新

VCL TRichEdit
TRichEdit : エンバカデロのオンラインヘルプ
無料のC++ Builder 10.1 Berlin Starter Edition で動作確認しました。
VCLのみにあります。同等のものはFireMonkey(FMX)にはありません。
複数行のテキスト入力や、装飾文字の表示ができます。
RTFという形式に対応しているようですが、HTMLに対応していないのが残念です。
このサンプル同等のことをFireMonkeyでするには表示だけならTWebBrowserでHTMLを表示することでできます。
Starter EditionのVCLにはTWebBrwoserがありません。(他のエディションのVCLはあります。)
このサンプル文字に色を付けたりサイズを変えて表示しURLをアンダーライン付きでで表示しています。
URLにマウスカーソルを乗せるとマウスカーソルの形状を変え、URLをクリックするとウェブブラウザを開いてURLのホームページを表示する処理まで書いています。
ウィンドウの上側に表示している二つの数値は、マウスカーソルがある位置の行番号と桁数です。
Windows専用のプログラムです。
GNU/Linux + wine 2.0.1ではURLをクリックしても反応がなくウェブブラウザが開く処理が動きませんでしたがそれ以外は動きました。
VCL TRichEdit サンプルexample
//--------------------------------------------------------------------------- #include <vcl.h> #include <Registry.hpp>//自分で書く #pragma hdrstop #include "Unit1.h" #include "wchar.h"//自分で書く(書かなくても多分動くけど) //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; UnicodeString Hyperlink = u"";//URL。自分で書く //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { //デザイン画面のフォームをダブルクリックすると //自動的に中身が空のこのメソッドが作られる。 //ダブルクリック後は、ここに、フォームが作られて最初に実行する処理を書く float size; int len; UnicodeString url; RichEdit1->Text = u"ABCEEFHIJKLMNOPQR\nSTUVabcdefg "; len = RichEdit1->Text.Length(); url = u"http://www.nabeta.tk"; RichEdit1->Text = RichEdit1->Text + url + " 12345678\nhijk"; //選択文字列(文字背景が青)の先頭位置指定(入力カーソル位置指定にもなる) RichEdit1->SelStart = 3; RichEdit1->SelLength = 5;//選択部分(文字背景が青)の文字数指定 RichEdit1->SelAttributes->Color = clRed;//選択文字列の色を赤に指定 RichEdit1->SelStart = 11;//選択文字列の先頭位置 RichEdit1->SelLength = 4;//選択文字列数 RichEdit1->SelAttributes->Color = clGreen;//選択文字列の色を緑指定 //選択文字列のサイズを約1.8倍にする。 size = (float)RichEdit1->SelAttributes->Size; size *= 1.8; RichEdit1->SelAttributes->Size = (int)size; RichEdit1->SelLength = 0; //URLを青色にして下線を引く RichEdit1->SelStart = len - 1; RichEdit1->SelLength = url.Length(); RichEdit1->SelAttributes->Color = clBlue; RichEdit1->SelAttributes->Style = RichEdit1->SelAttributes->Style << fsUnderline; RichEdit1->SelLength = 0; RichEdit1->SelStart = 0; } //ウェブブラウザ起動 void webbrowser(UnicodeString url) { // レジストリからhttp関連付けソフトを調べる TRegistry* reg = new TRegistry(); reg->RootKey = HKEY_LOCAL_MACHINE; reg->OpenKeyReadOnly("SOFTWARE\\Classes\\http\\shell\\open\\command"); UnicodeString stdprog = reg->ReadString(""); delete reg; char* lpvEnvironment = NULL; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.lpReserved = NULL; si.lpReserved2 = NULL; si.cbReserved2 = 0; si.lpDesktop = NULL; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; si.lpTitle = NULL; wchar_t command[512]; command[0] = (wchar_t)0; wcscpy(command, stdprog.c_str()); wchar_t *pos = wcschr(&command[1], (wchar_t)'"'); if(pos == NULL){ return; } *(pos+1) = NULL; wcscat(command, url.c_str());//URL set CreateProcess(NULL,command,NULL,NULL,FALSE, NORMAL_PRIORITY_CLASS | CREATE_SEPARATE_WOW_VDM, lpvEnvironment,NULL,&si,&pi); } //--------------------------------------------------------------------------- void __fastcall TForm1::RichEdit1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { //デザイン画面のRichiEdit1をクリックし、 //オブジェクトインスペクタ(Object inspector)のタブをイベント(Events)にして、 //onMouseMove をダブルクリックすると自動的に空のこのメソッドが作られる。 //マウスカーソルがRichiEdit1の上で動いた時にここが呼ばれる。 TPoint pt; int charIndex,row,col; pt = Point(X, Y); charIndex = RichEdit1->Perform(EM_CHARFROMPOS, 0, Integer(&pt)); row = RichEdit1->Perform(EM_EXLINEFROMCHAR, 0, charIndex); col = charIndex - RichEdit1->Perform(EM_LINEINDEX, row, 0); if(row == 1 && col >= 12 && col <=31){ //マウスカーソルがURLの文字列の上だったらマウスカーソルを変える。 RichEdit1->Cursor = crHandPoint; Hyperlink = u"http://www.nabeta.tk"; } else{ //マウスカーソルがURLの上でないなら形状をデフォルトにする。 RichEdit1->Cursor = crDefault; Hyperlink = u""; } Label1->Caption = IntToStr(row); //マウスカーソル位置の文字の桁数 Label2->Caption = IntToStr(col); //マウスカーソル位置の行番号Line Number } //--------------------------------------------------------------------------- void __fastcall TForm1::RichEdit1Click(TObject *Sender) { //デザイン画面のRichiEdit1をクリックし、 //オブジェクトインスペクタ(Object inspector)のタブをイベント(Events)にして、 //onClick をダブルクリックすると自動的に空のこのメソッドが作られる。 //RichiEdit1の上でマウスを左クリック時にここが呼ばれる。 if(Hyperlink != u""){ webbrowser(Hyperlink); } } //---------------------------------------------------------------------------

ソースファイルも用意しています。
プロジェクトファイル、ヘッダファイル、画面設計ファイルを含むコンパイルするための全てのファイルがあります。
実行ファイルも入れています。
VCL TRichEdit ソースファイルダウンロードsource file download

C++ Builder 10.1 Berlin Starter Edition サンプルブログラム example

C言語の話


あーすブラウザ
オンライン鍋田辞書
鍋田辞書トップ