下のようなプログラムを作ったのですが、保存しようとすると、
「ソースファイルが見つかりません」というエラーがですのですが、
どうすればいいのでしょうか。教えてください。
procedure TForm1.Button1Click(Sender: TObject);
var
Name: String;
begin
try
if Open.Execute then
begin
Bitmap1 := TBitmap.Create;
Name := Open.FileName;
Bitmap1.LoadFromFile(Name);
Invalidate;
end;
except
Beep;
end;
end;
画像の編集
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Draw(0,0,Bitmap1);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if Save.Execute then
begin
Name := Save.FileName;
Bitmap1.SaveToFile(Name);
end;
end;
end.
> procedure TForm1.Button4Click(Sender: TObject);
> begin
> if Save.Execute then
> begin
> Name := Save.FileName;
> Bitmap1.SaveToFile(Name);
> end;
> end;
とりあえず、Name が関数内で宣言されてないようですね。
というより、
Bitmap1.SaveToFile(Save.FileName);
で良いのではないでしょうか。
> とりあえず、Name が関数内で宣言されてないようですね。
そうですね。Form1 にも Name プロパティーがあるのでコンパイルはできたの
でしょうね。ローカル変数にするにしても、プロパティーと同じ名前は避けた
方がいいです。
OnPaint イベントハンドラで、Bitmap1 を使っていますけど、まだ Button1 が
押される前では、エラーになりませんか? それと、Button1Click で Bitmap1
のインスタンスを作成していますけど、Button1 を押すたびに、あたらしい参照
が Bitmap1 に代入されて、以前のものが行方不明になりますね。Free はどこで
やっていますか?
John7さん、つっかさん、返答ありがとうございました。
おかげでできるよになりました。
>OnPaint イベントハンドラで、Bitmap1 を使っていますけど、まだ Button1 が押される前では、エラーになりませんか?
エラーにはなりませんよ。
Freeは↓のようにやっているのですが、違うところにも付けたほうが良いのでしょうか?
procedure TForm1.FormDestroy(Sender: TObject);
begin
Bitmap1.Free;
end;
Bitmap1 のインスタンスは、必ず一つ作られて、一つだけ作られる、
ということが守られればいいのです。ですから、Button1Click ではなく
OnCreate イベントハンドラでコンストラクタを実行してください。
Bitmap1 := TBitmap.Create;
これなら、OnDestroy で一つだけ確実に Free できます。
つっかさん、ありがとうございました。
まだまだ初心者ですが、これからがんばって勉強しようと思います。
ツイート | ![]() |