2019年11月26日

2019-11-26 Delphi のメモコンポーネント(TMemo)の拡張

2019-11-26 Delphi のメモコンポーネント(TMemo)の拡張

Delphi XE2 で開発を行っていますがテキストを表示する「TMemo」のコンポーネントがあります。
「TMemo」は絵文字の表示も可能ですが、一般的なエディタでは可能な「改行」「タブ表示」「終端記号」「全角空白」の表示には対応していません。
Web を検索して、「WMPaint」のイベントでデフォルトの表示を行った後に、上書きでキャンバスに書き込む事で可能という事が判りました。
ただ参考にしたコンポーネントは「TMemo」でなく「TRichEdit」でしたので、「TMemo」用にあらたに作成しなおしました。

今回拡張した「TMemoEx」には「EditMrks」のプロパティが追加されます。
その配下に「CrlfMark」「EpofMark」「S@paceMark」「TabMark」が追加されます。
それぞれに「Color」「Enabled」「Mark」が追加されます。

全ての「Enabled」を「FALSE」にすれば、通常の「TMemo」と同じになります。

各記号を変更したい場合は、「MemoEx.pas」の
FEofMark.Mark := '←';
FCrlfMark.Mark := '↓';
FTabMark.Mark := '・';
FSpaceMark.Mark := '□';
を変更して下さい。

ソースは以下からダウンロードして下さい。
http://bonworld-annsfm.sblo.jp/article/185739733.html


TMemoEx.jpg
追加されたプロパティ

posted by bonworld at 09:07| Comment(0) | TrackBack(0) | Delphi

2019年11月25日

2019-11-25 Delphi のメモコンポーネント(TMemo)の高速表示

2019-11-25 Delphi のメモコンポーネント(TMemo)の高速表示

Delphi XE2 で開発を行っていますがテキストを表示する「TMemo」のコンポーネントがあります。

テキストを設定するには以下の1,2,3の方法があります。行数が多い場合は、ファイルから直接読み込んで表示がする方法が、追加して表示するより圧倒的に早い、という結果になります。

単純に読み込んで表示する場合は、ファイルから直接読み込んで下さい。

ただ、ファイルから読み込んで処理を行った結果を反映させる場合には、処理を行った結果のファイルリストを作成して、このファイルリストをストリームに保存してか、このストリームを一括して読み込むと、ファイルから直接読み込んだのと同じ効果が得られます。

1:文字列を追加して表示(遅い)

StrList1.LoadFromFile('C:\test\123.txt');
Memo1.Lines.BeginUpdate;
for iRow1 := to StrList1.Count-1 do
begin
Memo1.Lines.Add(StrList1.Strings[iRow1]);
end;
Memo1.Lines.EndUpdate;

2:ファイルから直接読み込んで表示(早い)

Memo1.Lines.LoadFromFile('C:\test\123.txt');

3:ストリームから読み込んで表示(処理を行った後にストリームから読み込みで早い)
ただし、絵文字を含んだ場合は、絵文字が正常に表示されません。

var
StrStream1: TMemoryStream;
StrList1: TStringList;
StrList2: TStringList;
begin
StrList1 := TStringList.Create;;
StrList2 := TStringList.Create;;

StrList1.LoadFromFile('C:\test\123.txt');
for iRow1 := 0 to trList1.Count-1 do
begin
StrList2.Lines.Add(...StrList1.Strings[iRow1]を処理した結果... );
end;

StrStream1 := TStringStream.Create(StrList2.Text);
Memo1.Lines.LoadFromStream(StrStream1);
StrStream1.Free;

StrList1.Free;
StrList2.Free;
end;


4:Delphi XE2 のファイル読み込み
文字コードを指定して、ファイルから直接読み込みます。絵文字の表示は可能です。

procedure TFormMain.LoadFile(Sender: TObject);
var
Enc1: TEncoding;
begin
//SJIS
if IntReadEncode1 = ENCODE_SJIS then
begin
Enc1 := TEncoding.GetEncoding(932);
try
Memo1.Lines.LoadFromFile(StrLoadFileName, Enc1);
finally
Enc1.Free;
end;
end
//JIS
else if IntReadEncode1 = ENCODE_JIS then
begin
Enc1 := TEncoding.GetEncoding(50220);
try
Memo1.Lines.LoadFromFile(StrLoadFileName, Enc1);
finally
Enc1.Free;
end;
end
//EUC
else if IntReadEncode1 = ENCODE_EUCJP then
begin
Enc1 := TEncoding.GetEncoding(20932);
try
Memo1.Lines.LoadFromFile(StrLoadFileName, Enc1);
finally
Enc1.Free;
end;
end
//UTF7
else if IntReadEncode1 = ENCODE_UTF7 then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.UTF7);
end
//UTF8 BOM
else if IntReadEncode1 = ENCODE_UTF8_BOM_ON then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName);
end
//UTF8
else if IntReadEncode1 = ENCODE_UTF8_BOM_OFF then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.UTF8);
end
//UTF16 BOM BE
else if IntReadEncode1 = ENCODE_UTF16_BOM_ON_BE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName);
end
//UTF16 BE
else if IntReadEncode1 = ENCODE_UTF16_BOM_OFF_BE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.BigEndianUnicode);
end
//UTF16 BOM LE
else if IntReadEncode1 = ENCODE_UTF16_BOM_ON_LE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName);
end
//UTF16 LE
else if IntReadEncode1 = ENCODE_UTF16_BOM_OFF_LE then
begin
Memo1.Lines.LoadFromFile(StrLoadFileName, TEncoding.Unicode);
end
//ここはない
else
begin
end;
end;

posted by bonworld at 09:38| Comment(0) | TrackBack(0) | Delphi

2019年11月24日

2019-11-24 Delphi のメモコンポーネント(TMemo)の同期

2019-11-24 Delphi のメモコンポーネント(TMemo)の同期

Delphi XE2 で開発を行っていますがテキストを表示する「TMemo」のコンポーネントがあります。
テキストの表示は簡単ですが、残念ながら行番号を表示する機能はありません。
テキストを表示する「Memo1」と行番号を表示する「Memo2」を作成し、両者のスクロールを同期して対応します。

「TMemo」にスクロールイベントを追加しましたが、垂直のスクロールバーの四角のツマミでスクロールさせた時はイベントは発生しませんでした。

最終的にタイマーを追加してタイマーイベント(200ms)で両者の最上行を監視して、今回最上行が前回最上行と異なったら、反対側をスクロールする処理で対応しました。


private
IntTopLineMemo: Integer;
IntTopLineNumber: Integer;

procedure TFormMain.Timer6Timer(Sender: TObject);
var
iLine5: Integer;
iLine6: Integer;
iLine7: Integer;
iLine8: Integer;
begin
if Memo1.Lines.Count > 0 then
begin
//画面の最上行
iLine5 := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
//前回と違う
iLine5 <> IntTopLineMemo then
begin
//画面の最上行
iLine6 := Memo2.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
//移動
Memo2.Perform(EM_LINESCROLL, 0, iLine5 - iLine6);
end;
IntTopLineMemo := iLine5;
end;

if Memo2.Lines.Count > 0 then
begin
//画面の最上行
iLine7 := Memo2.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
前回と違う
if iLine7 <> IntTopLineNumber then
begin
//画面の最上行
iLine8 := Memo1.Perform(EM_GETFIRSTVISIBLELINE, 0, 0);
//移動
Memo1.Perform(EM_LINESCROLL, 0, iLine7 - iLine8);
//フォーカス設定
Memo1.SetFocus;
end;
IntTopLineNumber := iLine7;
end;
end;


posted by bonworld at 11:06| Comment(0) | TrackBack(0) | Delphi

2019年02月03日

2019-02-03 Mery のプラグインの開発

2019-02-03 Mery のプラグインの開発

エディタの「Mery」のプラグインを開発していますが、通常の開発とは異なっている箇所を説明します。

MeryPlugIn.jpg

1:プロジェクトに「mPlugIn.pas」「mPlugIn.rc」を追加します。
「mPlugIn.rc」を追加すると、プロジェクトのビルド時に「mPlugIn.res」を自動的に作成してくれます。

2:「mPlugIn.rc」には、必要な項目を設定します。
===========================================================
#define IDS_MENU_TEXT 1
#define IDS_STATUS_MESSAGE 2
#define IDI_ICON 101

IDI_ICON ICON "MeryCsvList.ico"

STRINGTABLE
LANGUAGE LANG_JAPANESE, 0x1
{
IDS_MENU_TEXT, "MeryCsvList"
IDS_STATUS_MESSAGE, "MeryCsvList|MeryCsvListです"
}
===========================================================

3:「.dpr」のプロジェクトファイルには、以下を追加します。

===========================================================
resourcestring
SName = 'MeryCsvList';
SVersion = '1.05';

const
IDS_MENU_TEXT = 1;
IDS_STATUS_MESSAGE = 2;
IDI_ICON = 101;
===========================================================
posted by bonworld at 10:45| Comment(0) | TrackBack(0) | Delphi

2017年11月15日

2017-11-15 Delphi でクリックしたフォームの表示の挙動

2017-11-15 Delphi でクリックしたフォームの表示の挙動

Delphi XE2 とDelphi 7 で開発を行っていますが、別のフォームを show で表示した時の挙動が異なります。

■Delphi 7
Form1 から Form2.show で別のフォームを表示した後に、Form2 を Form1 の上に移動して、半分位を重ね合わせます。
Form1 をクリックするとフォーカスが移動して、Form1 の全体が表示されます。

■Delphi XE2
Form1 から Form2.show で別のフォームを表示した後に、Form2 を Form1 の上に移動して、半分位を重ね合わせます。
Form1 をクリックするとフォーカスが移動しますが、Form1 のうち、Form2 が重なっている部分は Form2 が表示されます。
本当は、クリックしてので、全体が表示して欲しいと思います。


XE2 で全体を表示するには、以下の対策があります。

■プロジェクトファイルを変更する

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2},

{$R *.res}

begin
Application.Initialize;
Application.MainFormOnTaskbar := False; //Falseにする
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.


■全てのフォームに記述する

type
TForm1 = class(TForm)

procedure CreateParams(var Params: TCreateParams); override;

{$R *.dfm}

//クリックした時にフォームをアクティブにするために必要
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := Application.Handle;
end;


type
TForm2 = class(TForm)

procedure CreateParams(var Params: TCreateParams); override;

{$R *.dfm}

//クリックした時にフォームをアクティブにするために必要
procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := Application.Handle;
end;


以下を参考にしました。有益な情報の提供をしていただき、ありがとうございました。

http://mrxray.on.coocan.jp/Delphi/plSamples/122_PluralForms.htm#list6

http://d.hatena.ne.jp/au2010/20110616/1308233783
posted by bonworld at 09:11| Comment(0) | TrackBack(0) | Delphi

2017年02月17日

2017-02-17 Delphi 無償ダウンロード

2017-02-17 Delphi 無償ダウンロード

今なら無償で使用できるみたいです。以下にアクセスしてみて下さい。プログラムやインストールで質問があれば可能な範囲で対応します。使い初めは何をしていいのかが判らないと思いますので、気兼ねなく質問して下さい。

https://community.embarcadero.com/blogs/entry/delphi-c-builder-10-1-berlin-starter-edition-japan

https://www.embarcadero.com/jp/products/delphi/starter/promotional-download


自分が DOS のプログラムを開発していた時は(趣味の範囲です)、Borland の Turbo C 2.0 が最初でした。その後 Windows の環境になって、ぱったりとやめてしまいました。そんなときに Delphi(16Bit版です) と出会いました。かんたんに Windows のアプリケーションが開発が可能で、それ以来ずっと使用しています。

DOS のプログラムではファイラーやエディタを作成しました。プログラムは、キー入力を「永久」に待つような感じで、キー入力により処理を分岐するイメージです。

Windows ではイベント(キー入力やマウス入力)を「待つ」感じです。Windows の操作が行われると、Windows からアプリケーションにメッセージが送られて、それに従って処理を行うイメージです。処理に入ってしまえば、自分のアプリケーションの範囲になります。

このイベント部分や画面作成の部分を、Delphi が面倒をみてくれます。この事により簡単にアプリケーションが開発できます。制御系のアプリケーションになると C++ の開発になると思いますが、個人の範囲であれば、Delphi が提供する Object Pascal がおすすめです。

みなさんも、プログラムを作成してみませんか?

■2017-02-20 以下を追加しました■

「Embarcadero のDelphi による Windows アプリケーションの開発」
の手順書を作成しました。ダウンロードからメモ帳の雛型の作成までを記述しました。
興味があれば、見て下さい。

■目次
Delphi 目次.pdf

■01:Windows のアプリケーション
Delphi 第1章.pdf

■02:Delphi の説明
Delphi 第2章.pdf

■03:Delphi のインストール
Delphi 第3章.pdf

■04:メモ帳の作成
Delphi 第4章.pdf

■05:その他
Delphi 第5章.pdf

■Main.pas
Main.pdf

■ソースプログラム
MyMemo.zip




posted by bonworld at 08:31| Comment(0) | TrackBack(0) | Delphi

2017年02月13日

2017-02-13 Delphi ドラッグ&ドロップ

2017-02-13 Delphi ドラッグ&ドロップ

Delphi の XE2 を使用して Windows のプログラムを開発しています。久しぶりにプログラミングを行ったのですが、ドラッグ&ドロップ部分を忘れていたので記述しておきます。

1:フォームでドラッグ&ドロップを受け入れるようにします。
2:Windowsからドラッグ&ドロップのメッセージが来るので、その内容を判定します。
3:複数のファイルを含まれる場合があるので、最初にファイル数を判定します。
4:ファイルが一個の場合は、先頭のファイル名を取得します。
5:ドロップされたマウスカーソルの位置を取得します。
6:カーソル位置のコンポーネントの名前を取得します。
7:該当場所を決定して、ドロップされた内容を設定します。

Setting.pas
ソースプログラムです。


==========================================================
procedure TFormSetting.FormShow(Sender: TObject);
==========================================================
begin
..//ドラッグの受入れを許可する
..DragAcceptFiles(FormSetting.Handle, TRUE);
end;


==========================================================
procedure TFormSetting.WMDropFiles(var msg: TWMDROPFILES);
==========================================================
var
..pDropFileName: array [0..255] of Char;
..sStr1: String;
..iCount1: Integer;
..Compo1: TComponent;
..Pt1: TPoint;

begin
..//ドロップの処理
..iCount1 := DragQueryFile(Msg.Drop, Cardinal(-1), nil, 0);
..if iCount1 > 1 then
..begin
....ShowMessage('Error:ドロップするファイルは1個にしてください。');
....Exit;
..end;

..//ファイル名を設定
..DragQueryFile(Msg.Drop, 0, pDropFileName, SizeOf(pDropFileName));
..sStr1 := StrPas(pDropFileName);

..//カーソル位置を取得
..GetCursorPos(Pt1);
..//コンポーネントを取得
..Compo1 := FindDragTarget(Pt1, TRUE);

..//判定
..if Compo1.Name = Edit1.Name then
..begin
....Edit1.Text := sStr1;
..end
..else if Compo1.Name = Edit2.Name then
..begin
....Edit2.Text := sStr1;
..end
..else if Compo1.Name = Edit3.Name then
..begin
....Edit3.Text := sStr1;
..end
..else
..begin
....ShowMessage('Information:ドロップする場所は編集エリアにしてください。');
....Exit;
..end;
end;





posted by bonworld at 14:52| Comment(0) | TrackBack(0) | Delphi

2012年05月02日

EBPocketでENG2JAPの辞書を使用するツールを作成しました

EBPocketでENG2JAPの辞書を使用するツールを作成しました。
辞書の変換は拙作のソフトで行います。
EPWING形式への変換にはEBStudioが必要になります。
よろしければ、お使い下さい。検証は充分ではありませんので注意して使用して下さい。

■ENG2JAP(TAB区切り形式)からEPWINGへの変換(EBStudioとBONEP.EXEで変換)
「ソートする」「重複を削除する」を選択すると、拙作のソフトだけで処理が可能です。

01:「PDIC1行形式」に変換します。

ENG2JAP(Shift-JIS)の「TAB」を「 /// 」に変換します。
拙作のBONEP.EXEを使用して変換します。
「ソートする」「重複を削除する」を選択して、「変換」を実行します。

「ソートする」の場合は、「TAB」を「 /// 」に置き換えた後にソート属性を設定して、
並び替えています。
「重複を削除する」の場合は、同じ「読み」があった場合は「訳」をまとめています。
訳の区切りはカンマを使用しています。

02:EBStudioで「EPWing」に変換します。

「出力形式」は「EPWING」を選択します。
「インデックスの指定」は「前方一致表記検索、前方一致かな検索、メニュー」を選択します。

「ファイル|新規作成」を選択します。
「書籍情報の登録」が表示されたら「書籍名称」は「ENG2JAP」、「書籍ディレクトリ」は「ENG2JAP」、
「書籍の種類」は「英和辞典」を設定します。
「入力ファイルの登録」が表示されたら「PDIC1行テキスト」を選択します。

同様に、JAP2ENGの設定も行います。

「電子辞書作成の実行」を実施します。


■ENG2JAP(TAB区切り形式)からEPWINGへの変換(EBStudioとPDICとBONEP.EXEで変換)

01:「PDIC1行形式」に変換します。
02:PDICで「PDIC形式」で登録します。
03:PDICで「1行テキスト」で保存します。
04:「文字コード」を「Shift-JIS」に変換します。
05:EBStudioで「EPWing」に変換します。

BONEP.JPG

以下をダウンロードして下さい

BONEP100.ZIP
posted by bonworld at 19:08| Comment(0) | TrackBack(0) | Delphi

2010年05月23日

MacBinary変換ソフト

最近になって、Mac のエミュレータの Basilisk と Sheep Shaver の環境を、再び整え始めました。この過程で、Windows でダウンロードした Mac 用のファイルを、 Mac の仮想ドライブのファイルにコピーする事になりますが、このために HFVExplorer.exe が供給されています。
ただ、MacBinaryII・III にのみ対応していて、無印の MacBinaryI は未対応なのです。

使用したい圧縮ファイルを転送する事は出来ましたが、肝心の圧縮ファイルを解凍するソフトがMacBinaryI のために、ファイルの転送が出来ません。解凍するファイルの転送が出来ないので、そこから先に進まなくなってしまいました。

ネット上を探しましたが変換ソフトは見つける事ができませんでした。ただ、「MacLHA は 自己解凍式の hqx のファイルなのでコピーが可能」との情報を見つけました。
まず MacLHA を転送して、 Mac 上で LHA を使用する事はできるようになりました。
Windows 上で、MacBinaryI のファイルを LHA で圧縮して、このファイルを転送して、Mac 上のMacLHA で解凍するという手順で、無事解凍ソフトの転送に成功しました。MacLHA が hqx で良かったです。

試行錯誤の中で、MacBinary の情報が判ったので、変換するソフトを作成してみる事にしました。ファイル作成日時の項目は、Mac と開発環境の Delphi では、開始日の違いがあり、簡単には変換できませんでした。この違いは Inside Machintosh の資料により解決しました。

次に、Mac の CRC の計算方法が分からなくて、色々と試してみた結果、ようやく同じ結果になる式を見つける事ができました。

開始してから 3週間近くで完成しました。使用頻度は高くはありませんが、あると便利なソフトです。

BONZP-ScreenShot.JPG

BONZP11.LZH
Ver1.1です。

BONZP13.ZIP
Ver1.3です。



posted by bonworld at 18:47| Comment(0) | TrackBack(0) | Delphi