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;
>(同名の)ファイルがあると上書きされなくて困っています
何かエラーが発生しますか ?
参考リンク
[コンパイルのエラーメッセージ等のコピー方法 ( エラー報告用 )]
http://mrxray.on.coocan.jp/Delphi/Others/RunError.htm#03
ゴメンナさい.
実行時のエラーだから,こちらですね.
もし,エラーが発生しているとすればですが.
http://mrxray.on.coocan.jp/Delphi/Others/UsageFastMM.htm#04
一応,前の記事にもリンクがありますが,念のため.
Mr.Xray様 早速のご回答をありがとうございます。
エラーは出ていません。 試しにTry+Exceptでもやってみましたが引っかかりませんでした。 また試しにPCを再起動してみましたら上書きができました。 しかしその状態で再度上書きしようとしてもできませんでした。PC(Win7)は最近XE用に買ったもので特に不具合はないものと思います。
>エラーは出ていません。
GetLastErrorの値は確認しましたか?
前の環境(D6)とOSが異なる場合は、UACとかの罠があるかも。
(管理者として実行しても起きるようならたぶんUACは影響ないですが)
>試しに古いファイルを削除(Shift+del)してからボタンを押しても古いファイルがエクスプローラに出てきます
これは,ゴミ箱に行かずに削除ですよね.
たとえ,ゴミ箱だとしてもです.にわかには信じられない現象ですね.
作成したそのプログラムに,削除したものを元に戻す機能があるということになります.
コードが断片的なので断定はできませんが.
そのような現象が発生する,最小限の,実際に他の方が確認できるコードがあれば,
確認してくれる人もいるとは思いますが.
また,しつこいと嫌われてしまいますが,テスト用に新規プロジェクトを作成
してテストすることです.あくまでも「新規」です.
Memo1.Lines.SaveToFile とかでも同じ現象でるのかな?
"%LocalAppData%\VirtualStore\Program Files"
とかに何か残ってませんか?
皆様 沢山のアドバイスをありがとうございます。
アドバイスに従い下記のようなテストの結果(タイムスタンプは変更されない状態ですが)変更内容の上書きができるようになりました。お礼申し上げます。
・同じプログラムでテキスト、JPGの書き込みをしてみましたがタイムスタンプも内容も上書きできていました。
・GetLastErrorの使い方をネットで調べて怪しいところに配置しました。その結果ScanLine直後にForm1.Canvas。Draw(10,10,BMP2)のところで「その要求はサポートされていません」というエラーが出ました。そこで0.2秒遅らせてからDrawしてみたところこのエラーがなくなりました。
・またJpegをセーブする箇所では「既に存在するファイルを作成することはできません」と出ましたので直前にDeleteFileを入れたらこのエラーは消えました。タイムスタンプは変わりませんが内容は変更されていることを確認しましたので解決サインをチェックさせていただきました。
タイムスタンプの問題があり、まだ何かがおかしいと思います。プログラムは現在まだ2000行足らずのものですのでこれから全く新規にデザイン段階からやりなおしてみます。ありがとうございました。
具体的な処理を推測するためのコードも説明もないので,確実なことは言えませんが,
もしかして,元の画像を読み込んで,それを加工して,保存しようとしていませんか ?
そのような場合,似たようなエラーとなることがあります.
ただし,これは,コーディングによります.
>タイムスタンプの問題
これかも。ググったところ、Windows7でも起きてるようです。
http://support.microsoft.com/kb/172190
>Windows7でも起きてるようです。
不具合のような表記で不適切でした。
Windows7も同じ機能があるようです。
と言い換えて置きます。
Nov様、Mr.Xray様 ご回答をいただきありがとうございます。
MicrosoftのSupportを見るとトンネル現象というのがるようですが15秒以上経過すればOKかを確かめるためにDeleteFile ボタンを作り時間を置いて書き込んでみたらタイムスタンプも内容も新しくなっていることが確認できました。ありがとうございました。レジストリをいじると15秒を変更できるようではありますが使用者にこれをやってもらうわけにもいきませんので対策を考えて見ます。
アドバイスに従って思い切ってXE3で初めて「新規」にデザインから作り始めて何とか動く段階になったのですがexeファイルが見つからず、探したところ¥dprのあるフォルダー¥Win32\Debug\ABC.exeに入っていました。これをdprのあるフォルダーに作成する方法を教えてください。(別のスレッドが望ましいかもしれませんが)
>これをdprのあるフォルダーに作成する方法を教えてください
プロジェクトのオプションで設定します.
作成した EXE を配布するのであれば,絶対パスで構いません.
そのプロジェクトを,他の方に配布する場合,相対パスにしておいた方が無難です.
例えば,自分自身のディレクトリは,'.\' となります.
DLL とか パッケージでなければ,空白にすれば,自分自身のディレクトリとなります.
また,以下の図のように,最小限のファイルにしてから,IDE を起動して保存すれば,
全て,そのプロジェクトのフォルダ内に保存されます.
(DLL や パッケージの場合は不可)
http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#fig1
>(別のスレッドが望ましいかもしれません
ですね.というのは,タイトルからスレッドの内容を判断することがあります.
だからタイトルも重要なのです.
Mr.Xray様
プロジェクトのオプションを探し回りましたがEXEの出力指定の項目が見つからず悩んでいましたがご紹介いただいた貴サイトにあるdprojなどの削除を試したら見事DPRのあるフォルダーにEXEが生成されました。また直前まではDEBUGフォルダーに入っていたEXEのサイズが10MBを超えていたので不思議に思っていましたが新EXEは2MB少々になり、この問題も解決できました。僅かな本とこのサイトだけが頼りですので大変助かりました。
>EXEの出力指定の項目が見つからず悩んでいました
(1) [プロジェクト] [オプション] で設定ダイアログを表示
(2) 左ペインで [Delphi オプション] を選択 (初回はデフォルトで選択となっている)
(3) 出力ディレクトリで指定する
Delphi XE までは,[デフォルト] で,作成する全てのプロジェクトに適用することが
できましたが,
Delphi XE2, XE3 では [保存] で,プラットフォームごとの保存となっています.
>dprojなどの削除を試したら
参考までに,その方法でそうなるのは,dproj.local のファイルに,
出力先関係の情報が入っているからです.
これを削除したため,Delphi は,しょうがないので,プロジェクトのディレクトリ
を使用するわけです.
つまり,他の方にプロジェクトを配布する時に,この dproj.local も配布すると,
ファイルが見つからない等のエラーが発生することがあります.
掲示板等で,「新規にプロジェクトを作成してテストしてください.必ず新規です」
と書いているのは,このような現象をさけるためでもあります.
Mr.Xray様 色々とアドバイスをありがとうございました。
XE3からの新しい考え方やEXEの出力先の変更などが分かり、またdproj.localの内容など始めて眺めるなど勉強になりました。
しかし
>(1) [プロジェクト] [オプション] で設定ダイアログを表示
>(2) 左ペインで [Delphi オプション] を選択 (初回はデフォルトで選択となっている)
>(3) 出力ディレクトリで指定する
をやってみようとしましたがDelphiがスターターのためか[Delphi オプション]の文字はどうしても見つかりませんので当面ファイルの削除で対応していくことにしました。ありがとうございました。
>Delphiがスターターのためか[Delphi オプション]の文字はどうしても見つかりませんので
そうですか.スターターにはないんですか.結構制限ありますね.
>当面ファイルの削除で対応していくことにしました
面倒だけど,EXE のサイズも小さくなるし (^^)
>mizukiさん
[Delphi オプション]というのは確かにありませんがコンパイラの設定はあるはずです。
Mr.XRAYさんが勘違いで誤った名前を教えたのも悪いといえば悪いですが、
>初回はデフォルトで選択となっている
と書いてあるんですから、開いた時点で何が選択されているか、そこにどんな設定があるかくらい確認しましょう。
言われたことしかできないのですか?少しは自分で考えて行動して下さい。
あちゃー
>Mr.XRAYさんが勘違いで誤った名前を教えたのも悪いといえば悪いですが、
スミマセンね.私がわるーごいました.
[Delphi コンパイラ] だったです.ハイ.
ホントに私は悪い人間です.以後,十分注意いたしますので,今回,いや,今回も許してください.
誤字脱字の Mr.XRAY より
Mr.Xray様、頭ついてないの?様
大変失礼しました。プロジェクトオプション画面でもしや「出力ディレクトリ」というののことかもしれないと思ったのですが当方にとって意味不明な文字 .\$(Platform・・・の意味することが分からずにいじるととんでもないことになるかもしれないとの恐怖感から専ら「Delphiオプション」を探していました。新規に立ち上げたDefaultのものとDPRフォルダーにしたものと比較してみて確かにここであることがわかりました。以後これで設定します。申し訳ありませんでした。
DPRフォルダーのEXEが2MB少々に対してDEBUGフォルダーのものは10MB少々なのですが動作の違いと言うものはあるのでしょうか?
>動作の違いと言うものはあるのでしょうか
動作の違いという定義が難しいのですが,
実行ファイルのサイズ関係の確認は,
(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
オンラインヘルプも,評判はいまいちですが,活用する価値はありますね.
それと,これ以上続くのであれば,スレッドを別にした方がいいでしょう.
JPEG ではなく,どちらかと言えば IDE 関係ですから.
雑談系の掲示板ならば構わないとは思いますが.Q ans A ですから.
Mr.Xray様
OKボタンを一つ置いて「Debug」「Release」を試してみましたところ9728kbと2225kbの差が確認できました。差の原因は「[Release]構成では、シンボル デバッグ情報が生成されず」ということのようですので単にソフトを動かすだけの場合は特に問題はないものと解釈しました。
僅かな知識でもDelphiは快適に動くのでそのレベルで使ってきましたがその奥の深さを痛感しました。 色々とありがとうございました。
以下にもまとめておきました.
Delphi XE 以降を使用している方にも,そうでない方は,他の方から
プロジェクトを提供された時の参考になると思います.
[EXE をプロジェクトのフォルダ直下に作成 ( Delphi XE 以降 )]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1070.0
Mr.Xray様
出力ディレクトリの指定方法をありがとうございました。
ちなみに貴サイトにある「別のバージョンで作成された Delphi プロジェクトの利用 」にあるdprojなどのファイルの削除法でやってみた作成中のソフトのプロジェクトのオプションを調べたら出力ディレクトリは空欄となっていましたがでした。次回より「.\」で開始しようかと思います。
ツイート | ![]() |