お久しぶりです、数年ぶりに書き込みます。
環境は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形式で文章を保存する機能を付けたいのですが、
何をどのように実装すれば良いでしょうか?
よろしくお願いします。
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
そのあたりを色々試してみた結果のページです。
これまた参考までに。
ありがとうございます、早速やってみました。
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;
DEKOさん作のユニットですが、どうでしょう?
MECSUtils
ttp://ht-deko.minim.ne.jp/tech021.html
>しかし、現在その読み込みで苦戦しています。
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
お久しぶりです、数年ぶりに書き込みます。
環境は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
ですが、どうでしょう?
thankyou !
荒らしは収まったようですね。
スレ投稿者です。
現状報告です。
UTFコンバータのアドレスありがとうございます。
元の制作ソフトは基礎設計でドン詰まってしまい、
新たに制作し直しています。
あとは技術向上のために自力で何とか頑張ってみます。
それではありがとうございました。
ツイート | ![]() |