落書き帳プログラムを少しだけバージョンアップして、「お絵かき帳」に進化しました。
ブラシサイズ2種類と、ブラシの色が変えられるようになりました。
カラーボタンをクリックするとダイアログが表示されます。
ファイルに保存したりできませんので、まだこのお絵かき帳は不完全です。
ダンナのPCのデスクトップに、電卓プログラムを貼り付けて、自慢げに「やってみて」と言いました。
がちゃがちゃと入力して、「なにこれ?」と言われちゃいました。ふん!
エラーチェックを作っていませんでした。
そこで次のようなエラーチェックを追加しました。ナッキー様のページを見てですけど(^^;
同じ処理をするときには、この機能は便利です。
長くてわかりにくいのですが、エラーチェックした場所にコメントを入れておきました。
同じ処理をあちこちに書いているので、関数を作っておいたほうがよいのでしょうね。
だけどまだ関数作りにはチャレンジしていませんので、後日また変更するかも。
procedure TForm1.btnTasuClick(Sender: TObject);
//演算ボタン[+]が押されたとき
begin
//エラー処理(値がないのに演算ボタンをクリックしたとき
if Edit1.Text = '' then
raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');
if Edit2.Text <>'' then
begin
Edit2.Text := '';
ShowMessage('値を入力してください');
end;
lblEnzan.Caption := '+';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
//演算ボタン「-」が押されたとき
procedure TForm1.btnHikuClick(Sender: TObject);
begin
if Edit1.Text = '' then
raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');
if Edit2.Text <>'' then
begin
Edit2.Text := '';
ShowMessage('値を入力してください');
end;
lblEnzan.Caption := '-';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
//演算ボタン「×」が押されたとき
procedure TForm1.btnKakeruClick(Sender: TObject);
begin
if Edit1.Text = '' then
raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');
if Edit2.Text <>'' then
begin
Edit2.Text := '';
ShowMessage('値を入力してください');
end;
lblEnzan.Caption := '×';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
//演算ボタン「÷」が押されたとき
procedure TForm1.btnWaruClick(Sender: TObject);
begin
if Edit1.Text = '' then
raise Exception.Create('値を入力してから演算ボタンをクリックしましょう');
if Edit2.Text <>'' then
begin
Edit2.Text := '';
ShowMessage('値を入力してください');
end;
lblEnzan.Caption := '÷';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
//クリアボタンが押されたとき初期化する
procedure TForm1.btnClearClick(Sender: TObject);
begin
Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
Edit1.Color := clWhite;
Edit2.Color := clYellow;
Edit3.Color := clYellow;
lblEnzan.Caption := '';
lblEqual.Visible := False;
end;
procedure TForm1.btnCloseClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.btnCopyClick(Sender: TObject);
//コピーボタンを押したとき、計算結果をクリップボードに保存
begin
Edit3.SelectAll;
Edit3.CopyToClipboard;
btnClearClick(Sender);//クリアボタンを呼び出す
Edit1.PasteFromClipboard;
end;
procedure TForm1.btnKeisanClick(Sender: TObject);
var
Num1 : Integer;
Num2 : Integer;
Ans : Double;
//計算ボタンを押したとき
begin
// StrToIntDefは文字列型から整数型へ変換する関数
Num1 := StrToIntDef(Edit1.Text,0);
Num2 := StrToINtDef(Edit2.Text,0);
//ラベルのキャプションで判断して計算する
if lblEnzan.Caption = '+' then
Ans := Num1 + Num2
else if lblEnzan.Caption = '-' then
Ans := Num1 - Num2
else if lblEnzan.Caption = '×' then
Ans := Num1 * Num2
else if lblEnzan.Caption = '÷' then
try
Ans := Num1 / Num2;
//例外処理
except
Edit2.Text := '';
ShowMessage('0では割れません。正しい数値を入力してください。');
Exit;
end
else
Ans := Num1;
Edit2.Color := clYellow;
Edit3.Color := clWhite;
lblEqual.Visible := True;//=を表示する
// FloatToStr は、実数型から文字列型へ変換する関数
Edit3.Text := FloatToStr(Ans);
end;
procedure TForm1.sbtn10Click(Sender: TObject);
//数値0のボタンが押されたとき
//演算記号が入ったら右側の入力ボックスに0を入れる
//ヌル(空)の場合は、左側のボックスに0を入れる
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '0'
else
Edit2.Text := Edit2.Text + '0';
end;
procedure TForm1.TenKeyClick(Sender: TObject);
var
TenKey : TSpeedButton;
TenKeyNum : string;
//電卓の数値ボタンが押されたとき
//ボタンは共有している
begin
//=表示されているときは入力ボックスをクリアする
if lblEqual.Visible then
btnClearClick(Sender);
TenKey := Sender as TSpeedButton;
TenKeyNum := IntToStr(TenKey.Tag);
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + TenKeyNum
else
Edit2.Text := Edit2.Text + TenKeyNum;
end;
procedure TForm1.sbtn2Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '2'
else
Edit2.Text := Edit2.Text + '2';
end;
procedure TForm1.sbtn3Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '3'
else
Edit2.Text := Edit2.Text + '3';
end;
procedure TForm1.sbtn4Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '4'
else
Edit2.Text := Edit2.Text + '4';
end;
procedure TForm1.sbtn5Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '5'
else
Edit2.Text := Edit2.Text + '5';
end;
procedure TForm1.sbtn6Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '6'
else
Edit2.Text := Edit2.Text + '6';
end;
procedure TForm1.sbtn7Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '7'
else
Edit2.Text := Edit2.Text + '7';
end;
procedure TForm1.sbtn8Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '8'
else
Edit2.Text := Edit2.Text + '8';
end;
procedure TForm1.sbtn9Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '9'
else
Edit2.Text := Edit2.Text + '9';
end;
電卓プログラム、動きましたぁ!!
ちょっと手抜きして、Editに名前をつけなかったりはしましたが・・・なんとか動きました。
独力ではありませんが(^^; ナッキーさまのプログラムをマネしてみただけです。
今回はちょいと長かったのですが、2日でやっつけました。
いまのところそんなに難しい部分は出てきませんので、なんとか理解の範囲内です。
procedure TForm1.btnTasuClick(Sender: TObject);
//演算ボタン[+]が押されたときラベルに+と表示
//Edit1と2の色を変更する
begin
lblEnzan.Caption := '+';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
//クリアボタンが押されたとき初期化する
procedure TForm1.btnClearClick(Sender: TObject);
begin
Edit1.Text := '';
Edit2.Text := '';
Edit3.Text := '';
Edit1.Color := clWhite;
Edit2.Color := clYellow;
Edit3.Color := clYellow;
lblEnzan.Caption := '';
lblEqual.Visible := False;
end;
procedure TForm1.btnCloseClick(Sender: TObject);
begin
Close;
end;
procedure TForm1.btnCopyClick(Sender: TObject);
//コピーボタンを押したとき、計算結果をクリップボードに保存
begin
Edit3.SelectAll;
Edit3.CopyToClipboard;
btnClearClick(Sender);//クリアボタンを呼び出す
Edit1.PasteFromClipboard;
end;
procedure TForm1.btnHikuClick(Sender: TObject);
begin
lblEnzan.Caption := '-';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
procedure TForm1.btnKakeruClick(Sender: TObject);
begin
lblEnzan.Caption := '×';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
procedure TForm1.btnKeisanClick(Sender: TObject);
var
Num1 : Integer;
Num2 : Integer;
Ans : Double;
//計算ボタンを押したとき
begin
// StrToIntDefは文字列型から整数型へ変換する関数
Num1 := StrToIntDef(Edit1.Text,0);
Num2 := StrToINtDef(Edit2.Text,0);
//ラベルのキャプションで判断して計算する
if lblEnzan.Caption = '+' then
Ans := Num1 + Num2
else if lblEnzan.Caption = '-' then
Ans := Num1 - Num2
else if lblEnzan.Caption = '×' then
Ans := Num1 * Num2
else if lblEnzan.Caption = '÷' then
Ans := Num1 / Num2
else
Ans := Num1;
Edit2.Color := clYellow;
Edit3.Color := clWhite;
// FloatToStr は、実数型から文字列型へ変換する関数
Edit3.Text := FloatToStr(Ans);
end;
procedure TForm1.btnWaruClick(Sender: TObject);
begin
lblEnzan.Caption := '÷';
Edit1.Color := clYellow;
Edit2.Color := clWhite;
end;
procedure TForm1.sbtn10Click(Sender: TObject);
//数値0のボタンが押されたとき
//演算記号が入ったら右側の入力ボックスに0を入れる
//ヌル(空)の場合は、左側のボックスに0を入れる
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '0'
else
Edit2.Text := Edit2.Text + '0';
end;
procedure TForm1.sbtn1Click(Sender: TObject);
//数値1のボタンが押されたとき
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '1'
else
Edit2.Text := Edit2.Text + '1';
end;
procedure TForm1.sbtn2Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '2'
else
Edit2.Text := Edit2.Text + '2';
end;
procedure TForm1.sbtn3Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '3'
else
Edit2.Text := Edit2.Text + '3';
end;
procedure TForm1.sbtn4Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '4'
else
Edit2.Text := Edit2.Text + '4';
end;
procedure TForm1.sbtn5Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '5'
else
Edit2.Text := Edit2.Text + '5';
end;
procedure TForm1.sbtn6Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '6'
else
Edit2.Text := Edit2.Text + '6';
end;
procedure TForm1.sbtn7Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '7'
else
Edit2.Text := Edit2.Text + '7';
end;
procedure TForm1.sbtn8Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '8'
else
Edit2.Text := Edit2.Text + '8';
end;
procedure TForm1.sbtn9Click(Sender: TObject);
begin
if lblEnzan.Caption = '' then
Edit1.Text := Edit1.Text + '9'
else
Edit2.Text := Edit2.Text + '9';
end;



今までは、イベントハンドラから自動で作られるプロシージャだけでプログラミングをしていましたが、プロシージャは自分で作ることもできるんですよね~。コード中の必要な場所から、プロシジャーを呼び出すことができますが、利用する前に「interface部に作成した手続き(または関数)が宣言されている」を確認する必要があります。
同じような操作(4つのボタンをクリックしたとき)をするので、いちいち4つのボタンをクリックしてイベントハンドラからプロシージャを作らなくても、一つにまとめてしまえばプログラムも短くなるし見やすい。賢いですねぇ
今回は、ボタンをクリックしたときのイベントプロシジャーから作ったプロシジャー「ShowItem」を呼び出しています。
カッコの中は引数です。引数を渡すことで、血液型を教えているとうわけ。たとえば1ならA型というふうに。
//プロシジャーを作る(入力する)
procedure ShowItem(Blood : Integer);
var
BloodType : string;
UranaiNum : Integer;
UranaiItem : string;
begin
case Blood of
1 : BloodType := 'A型';
2 : BloodTYpe := 'B型';
3 : BloodTYpe := 'O型';
4 : BloodTYpe := 'AB型';
end;
UranaiNum := Random(5);
case UranaiNum of
0 : UranaiItem := '犬';
1 : UranaiItem := 'ネコ';
2 : UranaiItem := '鳥';
3 : UranaiItem := 'ウサギ';
4 : UranaiItem := 'サル';
end;//Case文終わり
ShowMessage(BloodType + 'あなたの幸運の鍵は' + UranaiItem);
end;
procedure TForm1.btnAClick(Sender: TObject);
//ボタンA型が押されたとき
begin
// プロシジャーを呼び出す
ShowItem(1);
end;
procedure TForm1.btnBClick(Sender: TObject);
begin
ShowItem(2);
end;
procedure TForm1.btnOClick(Sender: TObject);
begin
ShowItem(3);
end;
procedure TForm1.btnABClick(Sender: TObject);
begin
ShowItem(4);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//乱数表の順番をランダムにする関数
Randomize;
end;
ナッキー様講座の5回目は、占いプログラムです。
条件を指定して分岐するというのをやるようです。だんだん難しくなるぞ!
たくさん分岐する場合は、caseのほうがif文を入れ子にするよりも見やすいという利点があります。
ナッキー様のプログラムですが、まんま写すのもなんなんで、変数名などを変えてみました。
説明はプログラムの中にメモしておきました。忘備録です。
procedure TForm1.btnAClick(Sender: TObject);
var
//ランダムな値を入れる変数(整数型)
UranaiNum : Integer;
//項目を入れる変数(文字列型)
UranaiItem : string;
begin
//ボタンAをクリックしたとき
//この場合は、0から4までのどれかの値が入る
UranaiNum := Random(5);
//Case文 ランダム値で分岐する
case UranaiNum of
0 : UranaiItem := '犬';
1 : UranaiItem := 'ネコ';
2 : UranaiItem := '鳥';
3 : UranaiItem := 'ウサギ';
4 : UranaiItem := 'サル';
end;//Case文終わり
ShowMessage('A型のあなたの幸運の鍵は' + UranaiItem);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
//乱数表の順番をランダムにする関数
Randomize;
end;
こんな感じです。動いた動いた嬉しいなっと。
今回勉強したのは、ランダムな数値を使うことと、Case文を使って複数に分岐することです。
プログラムって、すごいなぁ・・・と、あらためて感心しております。
ナッキー様講座の第4回目です。
前回の「コンポーネントを使う」(アンケート操作)のプログラムを変更しました。
Delphiで変数を宣言するには、予約語Varを使います。
プログラム中の変数を宣言する位置によって、有効範囲が決まります。
var
変数名:型名;
変数名:型名;
フォームの下のほうに、ツールパレットのStandard から「TListBox」を貼り付けます。
オブジェクトインスペクタのレイアウトから、Alignプロパティをクリックし「alBottom」を選びます。
同様にakTop を「True」に設定します。
実行結果
前回からの変更点は、変数を使ったこと、リストボックスを貼り付けたこと、エラーメッセージを出すようにしたことです。
procedure TForm1.Button1Click(Sender: TObject);
var
//文字列型の変数を宣言
Profile : string;
begin
Profile := Edit1.Text;
Profile := Profile + ':' + ComboBox1.Text;
if RadioGroup1.ItemIndex = 0 then
Profile := Profile + ':' + '男性'
else
Profile := Profile + ':' + '女性';
if CheckBox1.Checked then
Profile := Profile + ':' + '運転免許あり' ;
//名前が入力されていないとき
if Edit1.Text = '' then
ShowMessage('名前を入力してください')
else
ListBox1.Items.Add(Profile);
end;
ナッキーの「Turbo Delphiはじめて奮戦記」様の解説がとてもわかりやすく、当分こちらの教えに沿ってプログラミングを勉強したいと思います。第1回から24回まで連載していますが、どこまでやれるかは・・・未知数
今回のチャレンジは「第3回 いろいろなコンポーネントを使ってみよう」です。
フォームにコンポーネントを貼り付けました。日付を入れるのは、Win32カテゴリの「TDateTimePicker」です。
他は、ツールパレットの「Standard」カテゴリにあります。
コンポーネットを並べるには、必要なコンポーネットを選択し(Shift+クリック)、「編集」-「位置合わせ」を使うと便利です。
RadioGroupには、1つ目が選ばれていると0が入ります。だからそれ以外は「女性」ということになります。
CheckBoxは、「チェックボックスがオンになっていたら」というのが条件式です。
この2つの条件で、メッセージボックスに表示する文字列を変更しています。
procedure TForm1.Button1Click(Sender: TObject);
begin
if RadioGroup1.ItemIndex = 0 then
if CheckBox1.Checked then
ShowMessage(Edit1.Text + ':' + ComboBox1.Text +
':' + '男性' + ':' + '運転免許あり' )
else
ShowMessage(Edit1.Text + ':' + ComboBox1.Text + ';' + '男性' )
else
if CheckBox1.Checked then
ShowMessage(Edit1.Text + ':' + ComboBox1.Text + ':' + '女性'
+ ':' + '運転免許あり')
else
ShowMessage(Edit1.Text + ':' + ComboBox1.Text + ':' + '男性' );
end;
らくがき帳プログラムを作ってみました。
マウスでドラッグした通りに線を描くというプログラムです。
「ナッキーのTurbo Delphiはじめて奮戦記」ページを参考にさせていただきました。
とてもわかりやすくて、その通りにやったらできました。
色を塗ったり、消しゴムを使ったり、ファイルとして保存できれば、さらに進化するんですけど・・・
まだそこまでは。
フォームにTScrollBoxコンポーネントを貼り付けます。ツールパレットの「Additional」の中にあります。
プロパティは、Nameを「sbxDraw」、Alignを「alClient」、Colorを「clWhite」に設定します。
alClientは、「余った領域を占拠する」という意味らしいです。これを設定すると、TScrollBoxがいっぱに伸びます。
つぎに、ScrollBoxの上に、TPaintboxコンポーネントを貼り付けます。ツールパレットの「System」の中にあります。
オブジェクトプロパティで、Nameを設定し、Height=480、Width=640、Left=0、Top=0 を設定します。
次に、TXPManifestコンポーネントを貼り付けます。ツールパレットの「Win32」の中にあります。
unit rakugakityou;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, XPMan, ExtCtrls;
type
TfrmMain = class(TForm)
sbxDraw: TScrollBox;
pbxDraw: TPaintBox;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure pbxDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
//グローバス変数を宣言
preX : Integer;
preY : Integer;
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.FormCreate(Sender: TObject);
begin
//グローバル変数の初期化
preX := -1;
preY := -1;
end;
procedure TfrmMain.pbxDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if GetKeyState(VK_LBUTTON) < 0 then
begin
//線の描画方法、pmCopyは色を変更できるように
pbxDraw.Canvas.Pen.Mode := pmCopy;
pbxDraw.Canvas.Pen.Width := 5;
pbxDraw.Canvas.Pen.Color := clBlack;
//現在の描画位置を座標(X, Y)に変更する
pbxDraw.Canvas.MoveTo(preX,preY);
//X と Y で指定される座標まで線を引く
pbxDraw.Canvas.LineTo(X,Y);
end;
preX := X;
preY := Y;
end;
end.
テキストの入出力にチャレンジしてみました。お馴染み肥満度プログラムです。
まず最初は準備です。
フォームに、「Label」を4つ、「Edit」を5つ、「RadioGroup」を1つ、「BitBtn」を1つ、貼り付け、位置を調整します。
LabelのCaptionには文字(下記イメージ)を入力し、Editの初期文字列は削除します。
BitBtnの「Kind」プロパティで「bkOK」を選択します。
RadioGroupは、Itemsプロパティをダブルクリックすると、文字列を設定するダイアログが出ますので、「男性」と入力し、Enterをクリック「女性」と入力し、Enterをクリックします。
procedure TfrmBMI.btnOKClick(Sender: TObject);
Type
//Gender型を宣言(maleかfemaleしかとらない)
Gender = (male,female);
var
//変数の宣言
//Extended型は10バイトの実数値
height,
weight,
BMI,
max,
min :Extended;
sex :Gender;
begin
//性別をチェックする
case RadioGroup1.ItemIndex of
0 : sex := male;
1 : sex := female;
else
ShowMessage('性別を入力してください');
end;
//データの取り込みと計算
height := StrToFloat(Edit1.Text) / 100;
weight := StrToFloat (Edit2.Text);
BMI := weight / (height * height);
Edit4.Text := FloatToStrF(BMI, ffFixed,4,2);
//判定
case sex of
male: begin
if (BMI >= 0 ) and (BMI <19 ) then
begin
Edit3.Text := '体重が少なすぎます'
end;
if (BMI >= 19) and (BMI <=24) then
begin
Edit3.Text := '体重は正常範囲です'
end;
if (BMI >= 24) and (BMI <=29.4) then
begin
Edit3.Text := '体重が多すぎます'
end;
if (BMI >=29.4) then begin
Edit3.Text := '肥満傾向が顕著です。'
end;
//正常範囲の計算
max := 24 * height * height;
min := 19 * height * height;
Edit5.Text := '正常範囲:' + IntToStr(Round(min)) +
'Kg ---' + IntToStr(Round(max)) + 'kg';
end;
female: begin
if (BMI >= 0 ) and (BMI <18.2 ) then
begin
Edit3.Text := '体重が少なすぎます'
end;
if (BMI >= 18.2) and (BMI <=23) then
begin
Edit3.Text := '体重は正常範囲です'
end;
if (BMI >= 23) and (BMI <=29.4) then
begin
Edit3.Text := '体重が多すぎます'
end;
if (BMI >=29.4) then begin
Edit3.Text := '肥満傾向が顕著です。'
end;
//正常範囲の計算
max := 23 * height * height;
min := 18.2 * height * height;
Edit5.Text := '正常範囲:' + IntToStr(Round(min)) +
'Kg ---' + IntToStr(Round(max)) + 'kg';
end;
end;
end;