喫茶XRAYトップページ


[3294] くだらないことですみません。返信 削除
2010/4/25 (日) 00:56:32 たたみや
マスター、こんばんは。

昨日今日とDelphiで簡単なコードを書いていて躓いてしまい、
お知恵を借りたいのですが。。。

環境はWin7アルティメット(32bit)+Delphi2010(Update5)です。


コード
Usesには、shellapiを入れています。
-----------------------------------------------------------

  private
    { Private 宣言 }
  procedure WMDropFiles(var Msg: TWMDropFiles); message WM_DROPFILES;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure tform1.WMDropFiles(var Msg:TWMDropFiles);
var
  FileName: array[0..255] of Char;
begin
   DragQueryFile(Msg.Drop,0,Filename,255);
   ListBox1.Items.Add(Filename);
   DragFinish(Msg.Drop);
end;

----------------------------------------------------------------

>> DragQueryFile(Msg.Drop,0,Filename,255);
の行をブレークポイントにしても、ファイルのD&D時に止まってくれません。

Win7かDelphi2010では、何か仕様の変更でもあったのかな・・・
とか考えてしまいました。

WinXPPro+Delphi5で試すと、当然ですが期待の動作をします。
よろしくお願いします。

話変わって、明日(今日?)は地元商工会のお手伝いで桜祭りに行ってきます。
しかし未だ桜は咲く気配すらありません(^^;;)
どんなイベントになるのやら。。。

[3296] Re:くだらないことですみません。返信 削除
2010/4/25 (日) 11:58:00 Mr.XRAY
▼ たたみやさん

今頃は気づいているかも知れませんが,(^^;
これは,アプリ開始後に,ドロップを受入れる宣言が必要なんですよね.
例えば,FormのOnShowで

procedure TForm1.FormShow(Sender: TObject);
begin
  //Handleは,ドロップ受入れコントロールのハンドル
  DragAcceptFiles(Handle, True);
end;

ところで,私もうっかり.よく間違えるんですが,
と,とあるサンプルプログラム集のコードみたら,ヤバッ,また間違えている!!!
今日中に直そう.
何にも考えないで書いていると...

> procedure tform1.WMDropFiles(var Msg:TWMDropFiles);
> var
>   FileName: array[0..255] of Char; // 0-255だと要素数は256なんですよね.
> begin
>    DragQueryFile(Msg.Drop,0,Filename,255); //だから,ここ256


これ,大抵は問題が発生しないのですが,650_他アプリ(Delphi)へ文字列送信1
で間違えたら,文字化けしたことがあります.
使用する関数にもよるようです.
MAX_PATH定数を使用した方が無難も知れません.


[3297] 認知症ではないと思います返信 削除
2010/4/25 (日) 12:08:29 Mr.XRAY
> と,とあるサンプルプログラム集のコードみたら,ヤバッ,また間違えている!!!

私って,本当に誤字脱字,こういうの多いです.
参照カウントもそうですが,関連記事を読んだすぐ後のコーディングで
入れるの忘れたりしてんですよね.
いいえ,認知症ではないと思うんです.結構若い時からそうですから.


[3300] Re2:くだらないことですみません。返信 削除
2010/4/25 (日) 23:14:08 たたみや
▼ Mr.XRAYさん

こんばんは

> procedure TForm1.FormShow(Sender: TObject);
> begin
>   //Handleは,ドロップ受入れコントロールのハンドル
>   DragAcceptFiles(Handle, True);
> end;


すみません。
私も書き漏れで、上記のコードはすでに入っています。
一応、D5で動作したものを、コピペしてましたので。
試しにFormCreateに書き換えてもみましたがだめでした。
なもので、どうしたものかと。。。

>    DragQueryFile(Msg.Drop,0,Filename,255); //だから,ここ256

ですよね。
ものぐさで、書きやすい方でやってしまう悪い癖で。


本日の桜祭り、お天気はバッチリでしたが、
やはり桜は全く咲いておらず、花より団子状態で、
音響のオペやりながら、出店の食べ物を食いまくりでした(^^;;)

[3302] Re3:くだらないことですみません。返信 削除
2010/4/26 (月) 00:06:12 Mr.XRAY
▼ たたみやさん

> 音響のオペやりながら、出店の食べ物を食いまくりでした(^^;;)

あれっ? アルコールは?
またまたメタボへの道をまっしぐら...!
東京というか,小生の住まい周辺の桜はだいぶ散ってしまいました.
写真のコブシの花が,しつこくまだ少し咲いています.

> 私も書き漏れで、上記のコードはすでに入っています。

ありゃ,う〜ん.すると何だろう.お手上げです.

> 試しにFormCreateに書き換えてもみましたがだめでした。

OnShowでも同じなんですよね.
でも,もしかしたらと,どうしてもやってしまうんですよね.(^^;


[3303] Re3:くだらないことですみません。返信 削除
2010/4/26 (月) 00:20:31 Mr.XRAY
▼ たたみやさん

ヘヘヘッ、やってみました。

Windows XP(SP3) + Delphi 2010(UP5)
 OK
 これで作成したEXEをWindows 7 U64で実行してもOK

Window 7 U64 + Delphi 2010(UP5)
  ダメ!!

なんじゃこれ!?


[3304] Re4:くだらないことですみません。返信 削除
2010/4/26 (月) 00:25:33 Mr.XRAY
> なんじゃこれ!?

WM_DROPFILESにメッセージが飛んできませんよ〜。どぼちて。


[3305] Re5:くだらないことですみません。返信 削除
2010/4/26 (月) 01:00:23 Mr.XRAY
> WM_DROPFILESにメッセージが飛んできませんよ〜。どぼちて。

確かに「くだらない」なぁ.ウソです.
悔しいけど,もう眠いので.Zzzzz.


[3307] くだらなくない話に、格上げ?返信 削除
2010/4/26 (月) 10:27:46 たたみや
▼ Mr.XRAYさん

おはようございます。
たたみや@一服時間モードです。

> > WM_DROPFILESにメッセージが飛んできませんよ〜。どぼちて。

やはりそうですか。。。
Delphiはかなりのブランクがあり、かつWindows7はほとんど使っていない
という状況なので、自分が何かヘマしている確率95%以上と踏んでいた
のですが、マスターの所でも再現しましたか。

こうなるとメーカーさんのUpdate待ちでしょうか。
とりあえずこの機能は保留して、ファイルの読み込みは
FileOpenDlgあたりを使って、場しのぎします。
ありがとうございました。

他のスレッドでですが、たてぐやさんが通信コンポをIndyにしようかという
お話もありましたね。
私のこれから作りたいツールはindy10(Delphi2010標準)でFTP機能を利用する
予定ですので、たてぐやさんの話にも興味があります。

ではちょっと聞き耳を・・・ (カラン)

[3309] Re:くだらなくない話に、格上げ?返信 削除
2010/4/26 (月) 13:57:29 Mr.XRAY
▼ たたみやさん,ググッてみました.
ありましたよ,

管理者として起動したVS2005でデバッグするとWM_DROPFILESが発生しない
http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/83023985-3899-4566-bfef-beb269869653

すっかり忘れていました.
また後で,時間があったら調べてみます.


[3310] やっぱり、格下げ・・・解決しました返信 削除
2010/4/26 (月) 18:29:53 たたみや
▼ Mr.XRAYさん

マスター、ありがとうございました。

> 管理者として起動したVS2005でデバッグするとWM_DROPFILESが発生しない
> http://social.msdn.microsoft.com/Forums/ja-JP/vcgeneralja/thread/83023985-3899-4566-bfef-beb269869653


要は、
1.エクスプローラーのオプションで「別のプロセスでフォルダーウィンドーを開く」に
チェックを入れる。
2.その後コンパイル後のEXEを直接実行する。

これでOKでした。
これはこれで解決したのですが、これでは面倒ですね。
コンパイル後、いちいちEXEを直接実行して確認しなければなりません。。。

紹介してもらった記事内では、
>>Windows Vista では権限の異なるアプリケーション間のデータ通信
>>(ドラッグ&ドロップも含む)はできなくなっていると思います。
>>Visual Studio を管理者権限で起動したときにファイルをドロップできないのは、
>>エクスプローラーが通常の権限で起動されているためです。(Visual Studio
>>で起動されたアプリケーションは Visual Studio と同じ権限になります。)

ここらへんが、肝みたいですね。

INCM/CMT
Cyclamen v3.82