|
まずは図形の作図を行う事から考えていきます。第1の目的は矩形(四角形)の作図とします。プロジェクト「p021」の準備を行います。「C:\DelphiProgram\jww」フォルダの中に「p021」というフォルダを作成し、Delphi6を起動します。メニュー「プロジェクト」→「オプション」を実行し、下記の設定を行います。
[アプリケーション]頁
タイトル | p021−矩形を作図 |
[ディレクトリ/条件]頁
パス及びディレクトリ | C:\DelphiProgram\jww\p021 |
メニュー「ファイル」→「名前を付けて保存」
「C:\DelphiProgram\jww\p021」の中に「Unit1.pas」を保存
メニュー「ファイル」→「プロジェクトに名前を付けて保存」
「C:\DelphiProgram\jww\p021」の中に「p021.dpr」を保存
◆
Form1の画面の大きさを扱いやすいよう小さくし、オブジェクトインスペクタで Form1 のプロパティを設定します。
BorderIcons
biMaximize | False | 最大化しないように |
BorderStyle | bsSingle | 画面をリサイズしないように |
Caption | 矩形を作図 | タイトルバーに表示されます |
Color | clMoneyGreen | お好みでどうぞ |
Font内
Name | MS ゴシック |
プロポーショナルフォントは
文字配置調整が微妙なので |
Font内
Size | 10 | 小さいと少し見難い為 |
Scaled | False |
動作環境によっての文字の
大きさ変動を少し抑えられる |
矩形の大きさを入力出来るよう、Label2つ Edit2つ配置し、それぞれプロパティを指定します。Edit1・2は両方選択した状態でプロパティを指定すると一度で変更出来ます。
Label1
Caption | 横サイズ | 画面上の文字が「横サイズ」に変わります |
Label2
Caption | 縦サイズ | 画面上の文字が「縦サイズ」に変わります |
Edit1、Edit2
ImeMode | imDisable | 全角文字入力出来ないように |
MaxLength | 8 | 最大入力文字数 |
Text | (空状態) | 未入力状態を初期状態に |
ボタン Button2つ配置し、プロパティを指定します。
Button1
Caption | OK(&Y) | ボタン上の文字 |
Default | True | [Enter]キーを押したら[OK] |
Button2
Caption | キャンセル(&N) | ボタン上の文字 |
Cancel | True | [Esc]キーを押したら[キャンセル] |
画面のレイアウトは下図のようにしてみましたが、好きなように自由に作ってみて下さい。
オブジェクトインスペクタにて
Form1 の イベント OnShowの箇所でダブルクリック、OnCloseの箇所でダブルクリックし、取りあえず下記のように追記します。(※以下では全角空白を付けて桁調整等をしていますが実際は半角空白或いは無しです)
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private 宣言 }
AppPath : string ;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 起動時
procedure TForm1.FormShow(Sender: TObject);
begin
// プログラムのあるフォルダを取得します
AppPath := ExtractFilePath(Application.ExeName) ;
// JWC_TEMP.TXTを開きます
end;
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// JWC_TEMP.TXTを上書き保存します
end;
end. |
|
で、どんどんプログラミングしていく訳ですが
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」(「コンパイル」でも可)を行いエラー表示されない事を確認して「C:\DelphiProgram\jww\p021」内に「p021.exe」が作成される事を確認して下さい。エクスプローラ等からこの「p021.exe」をダブルクリック等をしてみて下さい。[OK]や[キャンセル]を押しても何も起きません。まだ「ボタンを押した時」の処理を書いていないからです。右上の[×]を押して終了して下さい。再度実行すると、画面の位置が直前の場所になって欲しいなぁ等と思われる事と思います。そのためには、終了時に画面位置を保存するようにして、起動時に画面位置を読み込むようにします。
よくあるパターンとしては
・レジストリを使用する方法
・iniファイルを使用する方法
・独自形式ファイルを使用する方法
があります。
レジストリを使用すると、Windowsがどんどん重くなるかもしれない等がありますし、iniファイルにするまでもない、という事で独自形式にするとします。テキスト形式とバイナリ形式がありますが、バイナリ形式は扱いにくいのでテキスト形式にします。
テキスト形式のファイルを保存する場合は
|
var
F : TextFile ;
・・・
try
AssignFile(F,'ファイル名');
Rewrite(F);
・・・ファイル書き込み・・・
CloseFile(F);
except
CloseFile(F);
end; |
|
という感じで、ファイル読み書きをする場合にはエラー確率が高いので(FDに保存しようとしてFDが抜かれてしまうとエラーが出る等)必ず例外処理を使います。except〜にはエラーした場合の処理を記述しますが、エラーしたファイルを削除する等を記述する場合もあります。ファイル書き込みの命令は「Write(F,〜)」(〜の最後に改行無し)や「WriteLn(F,〜)」(〜の最後に改行有り)などを使います。〜部は文字列となります。数値を扱う場合は、文字列との変換を行います。
テキスト形式のファイルを読み込む場合は
|
var
F : TextFile ;
・・・
try
AssignFile(F,'ファイル名');
FileMode := 0;
Reset(F);
・・・ファイル読み込み・・・
CloseFile(F);
except
CloseFile(F);
end; |
|
という感じで、こちらも例外処理を掛けますが、その前に、ファイルが存在するかどうかを確認しておく事も重要です。ファイルが存在しなければ、ファイルを読み込む事も出来ませんので。ファイルが存在するかどうかは、FileExists関数で分かります。ファイル読み込みの命令は「Read(F,〜)」(〜の最後に改行無し)や「ReadLn(F,〜)」(〜の最後に改行有り)などを使います。〜部は文字列となります。数値を扱う場合は、文字列との変換を行います。
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private 宣言 }
AppPath : string ;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
F : TextFile ;
s : string ;
begin
// プログラムのあるフォルダを取得します
AppPath := ExtractFilePath(Application.ExeName) ;
// 位置情報等を読み込み
if (FileExists(AppPath+'p021.dat')) then begin
try
AssignFile(F, AppPath+'p021.dat');
FileMode := 0;
Reset(F);
ReadLn(F, s); Form1.Left := StrToInt(s);
ReadLn(F, s); Form1.Top := StrToInt(s);
CloseFile(F);
except
CloseFile(F);
end;
end;
// JWC_TEMP.TXTを開きます
end;
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
F : TextFile ;
begin
// 位置情報等を保存
try
AssignFile(F, AppPath+'p021.dat');
ReWrite(F);
WriteLn(F, IntToStr(Form1.Left));
WriteLn(F, IntToStr(Form1.Top));
CloseFile(F);
except
CloseFile(F);
end;
// JWC_TEMP.TXTを上書き保存します
end;
end. |
|
文字列を数値に変換するのにここでは説明を簡略化するため StrToInt関数を使っていますが、この関数はエラーが出やすいので実際のプログラミングでは余り使いません。
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して、メニュー「実行」→「実行」を行ってみて下さい。画面位置を変更して終了し、再度実行すると、画面位置が前回位置になっているのが確認出来ると思います。
[OK]ボタンを押した時には、矩形を作図するための書き出しを行い、[キャンセル]ボタンを押した時には、"未実行"としたい、という訳で処理が異なります。[×]を押した時は「キャンセル」とします。これを区別して JWC_TEMP.TXT の内容を書き出す必要があります。そのための変数 OKflag(Boolean)を用意します。[OK]の場合は True、初期状態・[キャンセル]の場合は False とします。[OK]の場合には、Edit1、Edit2に入力した文字列を数値に変換し、数値が不正(0以下)の場合は入力し直し、という事にします。画面を閉じる命令は「Close」です。この命令を使っても OnClose イベントが発生します。それでは、オブジェクトインスペクタで Button1・Button2のイベント OnClick の箇所でダブルクリックしてコード入力します。ついでに Edit1・Edit2の内容も保存・読み込みするよう追加します。
|
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private 宣言 }
AppPath : string ;
OKflag : Boolean ;
Xsize,Ysize : double ;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// 起動時
procedure TForm1.FormShow(Sender: TObject);
var
F : TextFile ;
s : string ;
begin
OKflag := False ;
Xsize := 0.0 ;
Ysize := 0.0 ;
// プログラムのあるフォルダを取得します
AppPath := ExtractFilePath(Application.ExeName) ;
// 位置情報等を読み込み
if (FileExists(AppPath+'p021.dat')) then begin
try
AssignFile(F, AppPath+'p021.dat');
FileMode := 0;
Reset(F);
ReadLn(F, s); Form1.Left := StrToInt(s);
ReadLn(F, s); Form1.Top := StrToInt(s);
ReadLn(F, s); Xsize := StrToFloat(s);
ReadLn(F, s); Ysize := StrToFloat(s);
CloseFile(F);
except
CloseFile(F);
end;
end;
Edit1.text := FloatToStr(Xsize);
Edit2.text := FloatToStr(Ysize);
// JWC_TEMP.TXTを開きます
end;
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
F : TextFile ;
begin
// 位置情報等を保存
try
AssignFile(F, AppPath+'p021.dat');
ReWrite(F);
WriteLn(F, IntToStr(Form1.Left));
WriteLn(F, IntToStr(Form1.Top));
WriteLn(F, FloatToStr(Xsize));
WriteLn(F, FloatToStr(Ysize));
CloseFile(F);
except
CloseFile(F);
end;
// JWC_TEMP.TXTを上書き保存します
end;
// [OK]
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Edit1.Text = '') then
Xsize := 0.0
else
Xsize := StrToFloat(Edit1.Text) ;
if (Edit2.Text = '') then
Ysize := 0.0
else
Ysize := StrToFloat(Edit2.Text) ;
if (Xsize <= 0.0) then begin
MessageBeep(Word(-1));
ShowMessage('横サイズがゼロ以下の数値になっています。再入力して下さい。');
exit ;
end;
if (Ysize <= 0.0) then begin
MessageBeep(Word(-1));
ShowMessage('縦サイズがゼロ以下の数値になっています。再入力して下さい。');
exit ;
end;
OKflag := True ;
Close ;
end;
// [キャンセル]
procedure TForm1.Button2Click(Sender: TObject);
begin
OKflag := False ;
Close ;
end;
end. |
|
ここまで入力して
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して、メニュー「実行」→「実行」を行ってみて下さい。エラー画面が出て中断されます。これは、横サイズ・縦サイズのデータはないはずなのに読み込もうとするからです。メニュー「実行」→「実行」を行って下さい。終了して下さい。再度、メニュー「実行」→「実行」を行ってみて下さい。今度はエラー画面は出ないはずです。
横サイズ、縦サイズに色々と入力をして[OK]を押してみて下さい。「abc」等と入力すると、例外が発生します。StrToFloat関数はそういう風になってしまいますのでそれについては次回考えます。
それでは「JWC_TEMP.TXT」を扱う事を考えていきます。
本当は、軸角など各設定を読み込んで、その条件を考慮したりして、色々な処理を行い、保存する訳ですが、ここでは最初のテストですので簡略化します。
・「JWC_TEMP.TXT」は読み込まない事とします。
・[OK]の場合は以下のように保存する事とします。
|
0 0 (Xsize) 0
(Xsize) 0 (Xsize) (Ysize)
(Xsize) (Ysize) 0 (Ysize)
0 (Ysize) 0 0 |
|
・[キャンセル]の場合は以下のように保存する事とします。
以下のように追記します。
|
(前略)
// 終了時
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
F : TextFile ;
s : string ;
begin
// 位置情報等を保存
try
AssignFile(F, AppPath+'p021.dat');
ReWrite(F);
WriteLn(F, IntToStr(Form1.Left));
WriteLn(F, IntToStr(Form1.Top));
WriteLn(F, FloatToStr(Xsize));
WriteLn(F, FloatToStr(Ysize));
CloseFile(F);
except
CloseFile(F);
end;
// JWC_TEMP.TXTを上書き保存します
try
AssignFile(F, AppPath+'JWC_TEMP.TXT');
ReWrite(F);
if (OKflag) then begin
// [OK]
s := '0 0 ' + FloatToStr(Xsize) + ' 0' ;
WriteLn(F, s);
s := FloatToStr(Xsize) + ' 0 ' + FloatToStr(Xsize) + ' ' + FloatToStr(Ysize) ;
WriteLn(F, s);
s := FloatToStr(Xsize) + ' ' + FloatToStr(Ysize) + ' 0 ' + FloatToStr(Ysize) ;
WriteLn(F, s);
s := '0 ' + FloatToStr(Ysize) + ' 0 0' ;
WriteLn(F, s);
end
else begin
// [キャンセル]
WriteLn(F, 'hq');
end;
CloseFile(F);
except
CloseFile(F);
end;
end;
(後略) |
|
メニュー「ファイル」→「すべて保存」を行い
メニュー「プロジェクト」→「再構築」を行いエラー表示されない事を確認して、メニュー「実行」→「実行」を行ってみて下さい。同じフォルダの中にファイル「JWC_TEMP.TXT」が作成されますので内容を確認してみて下さい。
Windowsのメモ帳やテキストエディタ等を利用し、フォルダ「Gapp」内に以下のようなバッチファイルを作成します。
|
p021.bat |
REM p021−矩形を作図
@echo off
REM #jww
REM #cd
REM #zs
REM #zw
REM #0配置点を指示して下さい。(L)free (R)Read
REM #hr
start /w p021.exe |
|
Windowsのエクスプローラ等で、「C:\DelphiProgram\jww\p021」内にある「p021.exe」をフォルダ「Gapp」内へコピーします。
Jw_cad を起動し、何か作図してある状態で
メニュー→その他→外部変形
「ファイル選択」画面でフォルダ「Gapp」を指定し、上記で作成したバッチファイル「p021.bat」を実行します。
バッチファイルで指定したように「配置点を指示して下さい」と表示されますので、矩形を作図する点を指示します。
コマンドプロンプト画面が表示されて、上記で作成した外部変形プログラム「p021.exe」=「p021−矩形を作図」が起動されます。
コマンドプロンプト画面が大きすぎて邪魔な場合には、コマンドプロンプト画面の左上のアイコン位置で右クリックし、表示されるポップアップメニューの「プロパティ」を選択します。(※Windows2000の場合。Windowsの種類によって異なる場合があります)
[レイアウト]頁の「□システム設定を使う」のチェックを外し、各値を下記のように指定します。(※1024×768画面での例)[OK]ボタンをクリックします。
「同じタイトルのウィンドウに適用する」にチェックを入れて[OK]をクリックします。
コマンドプロンプト画面が左下に下図のような表示になり、以降、こういった画面表示に変わります。
外部変形プログラム「p021.exe」=「p021−矩形を作図」が起動されますので、数値を入力して[OK]をクリックします。
指定した大きさの矩形が作図されました。
以上で、オリジナルの外部変形アプリケーション「矩形を作図」が作成出来ました。勿論いろいろと足らずはあります。軸角の対応やエラー処理、矩形の基準点指定、大きさの選択、等々。それらについては次回以降に続きます、という事にて今回は終了します。
今回のバッチファイルと実行ファイル、及び、ソースファイルについては、Pcataサイトに置いておきますので必要な方はそちらからダウンロードして下さい。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
M7
Jw_cad
[BACK]
[NEXT]
|