jpgファイルが上書きできない

解決


mizuki  2013-04-15 01:46:34  No: 44315

XE3 starter + Win7
次のようなコードで動かしても古い(同名の)ファイルがあると上書きされなくて困っています。試しに古いファイルを削除(Shift+del)してからボタンを押しても古いファイルがエクスプローラに出てきます。タイムスタンプも古いままで、また内容も古いままです。なおD6パーソナルの時はこれで意図する動作が得られていました。何か解決法がありましたらご教示お願いします。

procedure TForm1.Button4Click(Sender: TObject);
var
   jp :TJPEGImage;
   pq:integer;
begin

pq:=50;
Jp :=TJpegImage.Create ;
jp.Assign(bmp2);
    with jp do begin
      CompressionQuality :=PQ; //圧縮率 1〜100
      DIBNeeded;               
      Compress;              
      SaveToFile(ofile);
    end;

jp.Free;

end;


Mr.XRAY  URL  2013-04-15 03:23:55  No: 44316

>(同名の)ファイルがあると上書きされなくて困っています

何かエラーが発生しますか ?

参考リンク
[コンパイルのエラーメッセージ等のコピー方法 ( エラー報告用 )]
http://mrxray.on.coocan.jp/Delphi/Others/RunError.htm#03


Mr.XRAY  2013-04-15 03:30:36  No: 44317

ゴメンナさい.

実行時のエラーだから,こちらですね.
もし,エラーが発生しているとすればですが.
http://mrxray.on.coocan.jp/Delphi/Others/UsageFastMM.htm#04

一応,前の記事にもリンクがありますが,念のため.


mizuki  2013-04-15 03:42:09  No: 44318

Mr.Xray様  早速のご回答をありがとうございます。

エラーは出ていません。  試しにTry+Exceptでもやってみましたが引っかかりませんでした。  また試しにPCを再起動してみましたら上書きができました。  しかしその状態で再度上書きしようとしてもできませんでした。PC(Win7)は最近XE用に買ったもので特に不具合はないものと思います。


Nov  2013-04-15 04:18:37  No: 44319

>エラーは出ていません。
GetLastErrorの値は確認しましたか?

前の環境(D6)とOSが異なる場合は、UACとかの罠があるかも。
(管理者として実行しても起きるようならたぶんUACは影響ないですが)


Mr.XRAY  2013-04-15 05:47:29  No: 44320

>試しに古いファイルを削除(Shift+del)してからボタンを押しても古いファイルがエクスプローラに出てきます

これは,ゴミ箱に行かずに削除ですよね.
たとえ,ゴミ箱だとしてもです.にわかには信じられない現象ですね.
作成したそのプログラムに,削除したものを元に戻す機能があるということになります.
コードが断片的なので断定はできませんが.

そのような現象が発生する,最小限の,実際に他の方が確認できるコードがあれば,
確認してくれる人もいるとは思いますが.  
また,しつこいと嫌われてしまいますが,テスト用に新規プロジェクトを作成
してテストすることです.あくまでも「新規」です.


KHE00221  2013-04-15 07:56:26  No: 44321

Memo1.Lines.SaveToFile とかでも同じ現象でるのかな?


とーりすがりマン  2013-04-15 18:11:37  No: 44322

"%LocalAppData%\VirtualStore\Program Files"

とかに何か残ってませんか?


mizuki  2013-04-15 20:48:09  No: 44323

皆様  沢山のアドバイスをありがとうございます。

アドバイスに従い下記のようなテストの結果(タイムスタンプは変更されない状態ですが)変更内容の上書きができるようになりました。お礼申し上げます。

・同じプログラムでテキスト、JPGの書き込みをしてみましたがタイムスタンプも内容も上書きできていました。
・GetLastErrorの使い方をネットで調べて怪しいところに配置しました。その結果ScanLine直後にForm1.Canvas。Draw(10,10,BMP2)のところで「その要求はサポートされていません」というエラーが出ました。そこで0.2秒遅らせてからDrawしてみたところこのエラーがなくなりました。
・またJpegをセーブする箇所では「既に存在するファイルを作成することはできません」と出ましたので直前にDeleteFileを入れたらこのエラーは消えました。タイムスタンプは変わりませんが内容は変更されていることを確認しましたので解決サインをチェックさせていただきました。

タイムスタンプの問題があり、まだ何かがおかしいと思います。プログラムは現在まだ2000行足らずのものですのでこれから全く新規にデザイン段階からやりなおしてみます。ありがとうございました。


Mr.XRAY  2013-04-16 02:55:41  No: 44324

具体的な処理を推測するためのコードも説明もないので,確実なことは言えませんが,
もしかして,元の画像を読み込んで,それを加工して,保存しようとしていませんか ?

そのような場合,似たようなエラーとなることがあります.
ただし,これは,コーディングによります.


Nov  2013-04-16 03:15:02  No: 44325

>タイムスタンプの問題

これかも。ググったところ、Windows7でも起きてるようです。

http://support.microsoft.com/kb/172190


Nov  2013-04-16 03:22:51  No: 44326

>Windows7でも起きてるようです。
不具合のような表記で不適切でした。

Windows7も同じ機能があるようです。

と言い換えて置きます。


mizuki  2013-04-17 03:33:16  No: 44327

Nov様、Mr.Xray様  ご回答をいただきありがとうございます。
MicrosoftのSupportを見るとトンネル現象というのがるようですが15秒以上経過すればOKかを確かめるためにDeleteFile ボタンを作り時間を置いて書き込んでみたらタイムスタンプも内容も新しくなっていることが確認できました。ありがとうございました。レジストリをいじると15秒を変更できるようではありますが使用者にこれをやってもらうわけにもいきませんので対策を考えて見ます。

アドバイスに従って思い切ってXE3で初めて「新規」にデザインから作り始めて何とか動く段階になったのですがexeファイルが見つからず、探したところ¥dprのあるフォルダー¥Win32\Debug\ABC.exeに入っていました。これをdprのあるフォルダーに作成する方法を教えてください。(別のスレッドが望ましいかもしれませんが)


Mr.XRAY  URL  2013-04-17 04:33:22  No: 44328

>これをdprのあるフォルダーに作成する方法を教えてください

プロジェクトのオプションで設定します.
作成した EXE を配布するのであれば,絶対パスで構いません.
そのプロジェクトを,他の方に配布する場合,相対パスにしておいた方が無難です.
例えば,自分自身のディレクトリは,'.\' となります.

DLL とか パッケージでなければ,空白にすれば,自分自身のディレクトリとなります.
また,以下の図のように,最小限のファイルにしてから,IDE を起動して保存すれば,
全て,そのプロジェクトのフォルダ内に保存されます.
(DLL や パッケージの場合は不可)

http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#fig1

>(別のスレッドが望ましいかもしれません

ですね.というのは,タイトルからスレッドの内容を判断することがあります.
だからタイトルも重要なのです.


mizuki  2013-04-17 19:00:49  No: 44329

Mr.Xray様  
プロジェクトのオプションを探し回りましたがEXEの出力指定の項目が見つからず悩んでいましたがご紹介いただいた貴サイトにあるdprojなどの削除を試したら見事DPRのあるフォルダーにEXEが生成されました。また直前まではDEBUGフォルダーに入っていたEXEのサイズが10MBを超えていたので不思議に思っていましたが新EXEは2MB少々になり、この問題も解決できました。僅かな本とこのサイトだけが頼りですので大変助かりました。


Mr.XRAY  URL  2013-04-17 19:36:32  No: 44330

>EXEの出力指定の項目が見つからず悩んでいました

(1) [プロジェクト] [オプション] で設定ダイアログを表示
(2) 左ペインで [Delphi オプション] を選択 (初回はデフォルトで選択となっている)
(3) 出力ディレクトリで指定する

Delphi XE までは,[デフォルト] で,作成する全てのプロジェクトに適用することが
できましたが,
Delphi XE2, XE3 では [保存] で,プラットフォームごとの保存となっています.


Mr.XRAY  URL  2013-04-17 19:45:42  No: 44331

>dprojなどの削除を試したら

参考までに,その方法でそうなるのは,dproj.local のファイルに,
出力先関係の情報が入っているからです.
これを削除したため,Delphi は,しょうがないので,プロジェクトのディレクトリ
を使用するわけです.

つまり,他の方にプロジェクトを配布する時に,この dproj.local も配布すると,
ファイルが見つからない等のエラーが発生することがあります.

掲示板等で,「新規にプロジェクトを作成してテストしてください.必ず新規です」
と書いているのは,このような現象をさけるためでもあります.


mizuki  2013-04-18 18:07:02  No: 44332

Mr.Xray様  色々とアドバイスをありがとうございました。
XE3からの新しい考え方やEXEの出力先の変更などが分かり、またdproj.localの内容など始めて眺めるなど勉強になりました。

しかし
>(1) [プロジェクト] [オプション] で設定ダイアログを表示
>(2) 左ペインで [Delphi オプション] を選択 (初回はデフォルトで選択となっている)
>(3) 出力ディレクトリで指定する
をやってみようとしましたがDelphiがスターターのためか[Delphi オプション]の文字はどうしても見つかりませんので当面ファイルの削除で対応していくことにしました。ありがとうございました。


Mr.XRAY  2013-04-18 22:22:48  No: 44333

>Delphiがスターターのためか[Delphi オプション]の文字はどうしても見つかりませんので

そうですか.スターターにはないんですか.結構制限ありますね.

>当面ファイルの削除で対応していくことにしました

面倒だけど,EXE のサイズも小さくなるし (^^)


頭ついてないの?  2013-04-18 23:44:53  No: 44334

>mizukiさん

[Delphi オプション]というのは確かにありませんがコンパイラの設定はあるはずです。
Mr.XRAYさんが勘違いで誤った名前を教えたのも悪いといえば悪いですが、
>初回はデフォルトで選択となっている
と書いてあるんですから、開いた時点で何が選択されているか、そこにどんな設定があるかくらい確認しましょう。
言われたことしかできないのですか?少しは自分で考えて行動して下さい。


Mr.XRAY  URL  2013-04-19 00:07:55  No: 44335

あちゃー

>Mr.XRAYさんが勘違いで誤った名前を教えたのも悪いといえば悪いですが、

スミマセンね.私がわるーごいました.
[Delphi コンパイラ] だったです.ハイ.
ホントに私は悪い人間です.以後,十分注意いたしますので,今回,いや,今回も許してください.

誤字脱字の Mr.XRAY より


mizuki  2013-04-19 19:39:59  No: 44336

Mr.Xray様、頭ついてないの?様
大変失礼しました。プロジェクトオプション画面でもしや「出力ディレクトリ」というののことかもしれないと思ったのですが当方にとって意味不明な文字  .\$(Platform・・・の意味することが分からずにいじるととんでもないことになるかもしれないとの恐怖感から専ら「Delphiオプション」を探していました。新規に立ち上げたDefaultのものとDPRフォルダーにしたものと比較してみて確かにここであることがわかりました。以後これで設定します。申し訳ありませんでした。

DPRフォルダーのEXEが2MB少々に対してDEBUGフォルダーのものは10MB少々なのですが動作の違いと言うものはあるのでしょうか?


Mr.XRAY  URL  2013-04-19 20:06:43  No: 44337

>動作の違いと言うものはあるのでしょうか

動作の違いという定義が難しいのですが,

実行ファイルのサイズ関係の確認は,

(1) 新規にプロジェクトを作成 (必ず新規です !!)
    何もコンポーネントを配置する必要はありません.
    適当なフォルダにプロジェクトを保存してコンパイルして実行

(3) プロジェクトマネージャーで [ビルド構成] を Release にする
    [Release] のところをダブルクリックすると選択されます.
    コンパイルして実行

この作業の後,プロジェクトのフォルダの
[Win32] [Debug]
[Win32] [Release]
の EXE のサイズを見てください.

詳細は以下で
[ビルド構成の概要 - RAD Studio XE3]
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E3%83%93%E3%83%AB%E3%83%89%E6%A7%8B%E6%88%90%E3%81%AE%E6%A6%82%E8%A6%81

オンラインヘルプも,評判はいまいちですが,活用する価値はありますね.


Mr.XRAY  URL  2013-04-19 21:01:52  No: 44338

それと,これ以上続くのであれば,スレッドを別にした方がいいでしょう.
JPEG ではなく,どちらかと言えば IDE 関係ですから.
雑談系の掲示板ならば構わないとは思いますが.Q ans A ですから.


mizuki  2013-04-19 21:31:00  No: 44339

Mr.Xray様  

OKボタンを一つ置いて「Debug」「Release」を試してみましたところ9728kbと2225kbの差が確認できました。差の原因は「[Release]構成では、シンボル デバッグ情報が生成されず」ということのようですので単にソフトを動かすだけの場合は特に問題はないものと解釈しました。
僅かな知識でもDelphiは快適に動くのでそのレベルで使ってきましたがその奥の深さを痛感しました。  色々とありがとうございました。


Mr.XRAY  URL  2013-04-21 23:32:59  No: 44340

以下にもまとめておきました.
Delphi XE 以降を使用している方にも,そうでない方は,他の方から
プロジェクトを提供された時の参考になると思います.

[EXE をプロジェクトのフォルダ直下に作成 ( Delphi XE 以降 )]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1070.0


mizuki  2013-04-24 03:32:52  No: 44341

Mr.Xray様  
出力ディレクトリの指定方法をありがとうございました。
ちなみに貴サイトにある「別のバージョンで作成された Delphi プロジェクトの利用 」にあるdprojなどのファイルの削除法でやってみた作成中のソフトのプロジェクトのオプションを調べたら出力ディレクトリは空欄となっていましたがでした。次回より「.\」で開始しようかと思います。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加