UTF-8対応のEditコンポーネントを作りたい

解決


Delphi大好き改めRAD命  2011-11-07 22:09:39  No: 41185

お久しぶりです、数年ぶりに書き込みます。
環境はXP  SP3  Delphi7Pro  です。

UTF-8に対応するEditコンポーネントを作成しています。
以下のページで形だけは作ることができました。
https://www.petitmonte.com/bbs/answers?question_id=2639

以下が、自分が変更したコードです。

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Unicode対応エディットコントロール
  richEditx := CreateWindowW(
    'edit',
    nil,
    WS_CHILD
    or ES_MULTILINE
    or WS_VISIBLE,
    8,       //Left
    8,       //Top
    200,     //Width
    200,      //Height
    Handle,  //親ウィンドウ
    0,
    0,
    nil
  );

  //フォントのセット
  if (richEditx <> 0) then begin
    SendMessageW(richEditx, WM_SETFONT, WPARAM(GetStockObject(DEFAULT_GUI_FONT)), 0);
  end;
end;

これに、UTF-8形式で文章を保存する機能を付けたいのですが、
何をどのように実装すれば良いでしょうか?

よろしくお願いします。


D  2011-11-08 06:10:02  No: 41186

function GetText(hHandle: HWND): WideString;
var
  li_Len  : Integer;
  lp_Buff : PWideChar;
begin
  Result := '';
  li_Len := GetWindowTextLengthW(hHandle) +1;
  if (li_Len > 0) then
  begin
    lp_Buff := AllocMem(li_Len * 2);
    try
      GetWindowTextW(hHandle, lp_Buff, li_Len);
      Result := WideString(lp_Buff);
    finally
      FreeMem(lp_Buff);
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  l_List : TStrings;
begin
  l_List := TStringList.Create;
  try
    l_List.Text := Utf8Encode(GetText(richEditx));
    l_List.SaveToFile('save_utf8.txt');
  finally
    l_List.Free;
  end;
end;

CreateWindowW APIでUnicode対応のEditコントロールを作成した場合の注意点として。

・タブの入力ができません。
タブの入力が必要な場合はTMenuItemやTActionのShortCutプロパティに「Tab」をセットして

procedure TForm1.Action1Execute(Sender: TObject);
var
  ls_Tab: WideString;
begin
  ls_Tab := #9;
  SendMessageW(richEditx, EM_REPLACESEL, WPARAM(1), LPARAM(PWideChar(ls_Tab)));
end;

というようにしてタブコードを挿入してあげないとなりません。

・TButtonやTCheckBox、TListBox、TStringGridなどなどキー入力のあるコントロールのあるフォームだと方向キーをそれらのコントロールに奪われてしまうのでカーソルの移動ができなくなります。

そのあたりの問題を色々取り扱ったページです。
参考までにどうぞ。

http://drang.s4.xrea.com/program/tips/unicode/edit_memo.html

またわざわざCreateWindowW APIで作成しなくともD7のVCLのTRichEditはそのままでUnicode対応になっていると思います。
Unicodeな文字の表示、UTF-8のBOM付で保存してあるファイルの読み込み、クリップボードへのUnicodeな文字のコピー、IMEでのUnicodeな文字の入力などはできると思います。
ただクリップボードからの貼り付けやファイルへの書き出しでUnicodeな文字が化けてしまうのでちょっと力技な一工夫が必要で使い勝手はあまり良くないのですが手軽さはあります。

http://drang.s4.xrea.com/program/tips/unicode/vcl_richedit.html

そのあたりを色々試してみた結果のページです。
これまた参考までに。


Delphi大好き改めRAD命  2011-11-11 16:36:39  No: 41187

ありがとうございます、早速やってみました。
gettextとUTF-8で、コンポーネントを作らずとも出来ました!
また、自作コンポーネントを作る際の貴重なアドバイスありがとうございましたm(__)m。

しかし、現在その読み込みで苦戦しています。
オーバーロードの使い方が解らず、
Utf8ToUnicodeが実装出来ずにいます。
オーバーロードで調べても、いまいちよく分かりませんでした…。
複数の同名の変数又は関数を重ねると言う意味までは認識しているのですが、
使い方が全く解りません。

以下が、呼び出し時での部分です。

procedure TForm1.ComboBox1Click(Sender: TObject);
var
  l_List : TStrings;
begin
  l_List := TStringList.Create;

  if richedit1.Text <> '' then begin//richedit1.Lines.SaveToFile(ExtractFilePath( Paramstr(0) ) + '\' + tabset1.Tabs[tabset1.tabindex]);
    if editedfile = combobox1.Text then
      try
        l_List.Text := Utf8Encode(GetText(richedit1.Handle));
        l_List.SaveToFile(combobox1.Text);
      finally
        l_List.Free;
      end;
  end; begin
    //ここがわからないです↓      
    Utf8ToUnicode(GetText(richedit1.Handle));

//  combobox1.Text := changefileext(combobox1.Text, '');
  {Richedit1.Lines.LoadFromFile
    (ExtractFilePath( Paramstr(0) ) + combobox1.Text);}
    tabset1.Tabs[tabset1.tabindex] := combobox1.Text;
    editedfile := combobox1.Text;
  Button2Click(Sender);
  end;
end;


これなんてどうでしょ  2011-11-11 22:12:56  No: 41188

DEKOさん作のユニットですが、どうでしょう?
MECSUtils
ttp://ht-deko.minim.ne.jp/tech021.html


D  2011-11-12 11:43:14  No: 41189

>しかし、現在その読み込みで苦戦しています。

  UTF-8ファイル限定で良ければ以下で。
ただしUTF-8以外のUTF-16やShift-JISのファイルもこのままでは文字化けします。

procedure TForm1.Button2Click(Sender: TObject);
var
  l_List : TStrings;
begin
  if (OpenDialog1.Execute) then
  begin
    l_List := TStringList.Create;
    try
      l_List.LoadFromFile(OpenDialog1.FileName);
      //UTF-8ファイル以外は文字化けする
      SetWindowTextW(richEditx, PWideChar(Utf8Decode(l_List.Text)));
    finally
      l_List.Free;
    end;
  end;
end;

読み込みたいファイルの文字コードの自動判定が必要なら以下を参考にどうぞ。
http://drang.s4.xrea.com/program/tips/string/auto.html

Unicode対応のRichEditのクラス化には以下を参考にどうぞ。
http://drang.s4.xrea.com/program/tips/unicode/richedit/richedit_1.html


Unicode  URL  2011-11-13 00:27:42  No: 41190

お久しぶりです、数年ぶりに書き込みます。
環境はXP  SP3  Delphi7Pro  です。

UTF-8に対応するEditコンポーネントを作成しています。
以下のページで形だけは作ることができました。
https://www.petitmonte.com/bbs/answers?question_id=2639

以下が、自分が変更したコードです。

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Unicode対応エディットコントロール
  richEditx := CreateWindowW(
    'edit',
    nil,
    WS_CHILD
    or ES_MULTILINE
    or WS_VISIBLE,
    8,       //Left
    8,       //Top
    200,     //Width
    200,      //Height
    Handle,  //親ウィンドウ
    0,
    0,
    nil
  );

  //フォントのセット
  if (richEditx <> 0) then begin


ですが  2011-11-13 00:28:38  No: 41191

ですが、どうでしょう?
thankyou !


Delphi大好き改めRAD命  2011-12-04 21:40:17  No: 41192

荒らしは収まったようですね。
スレ投稿者です。

現状報告です。
UTFコンバータのアドレスありがとうございます。
元の制作ソフトは基礎設計でドン詰まってしまい、
新たに制作し直しています。

あとは技術向上のために自力で何とか頑張ってみます。

それではありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加