喫茶XRAYトップページ


[7401] delphi 5 で頑張ってます返信 削除
2014/4/1 (火) 12:54:48 空色の渚
みなさん、はじめまして。
私は、未だdelphi5でプログラムを組んでいるオールドタイプのプログラマもどきです。
なぜ、5かといえば、それで足りているからなんですが、正直、最近の状況がよく分からないのです。

新しいバージョンを購入すると、何が起きるのか?
参考書は出ているのか?
で、最新版に二の足を踏んでいる次第です。
出来ないことは、なんとかアイディアで凌いでいるのですが、StringGridで作った表をエクセル形式で出力したいのですが、出来るものなのでしょうか?

アドバイスを頂けると助かります。


是非、皆さんのお仲間に入れて頂き、今後ともお付き合いを頂ければと思います。
よろしくお願い致します。



[7402] Re:delphi 5 で頑張ってます返信 削除
2014/4/1 (火) 15:33:29 Mr.XRAY
▼ 空色の渚さん,こんにちは.Mr.XRAY と申します.

> 私は、未だdelphi5でプログラムを組んでいるオールドタイプのプログラマもどきです。

delphi 5 というと,私がまだ生まれていない時ですね(ウソです)


> 新しいバージョンを購入すると、何が起きるのか?

う〜む.何とも.パス!!

> StringGridで作った表をエクセル形式で出力したいのですが、出来るものなのでしょうか?

そうですね.いろいろな方法があると思います.
具体的には,まっ,ちょっと待ってくださいませ.


[7408] Re2:delphi 5 で頑張ってます返信 削除
2014/4/1 (火) 20:51:47 taki
▼ Mr.XRAYさん
> ▼ 空色の渚さん

>
> > 新しいバージョンを購入すると、何が起きるのか?
>
> う〜む.何とも.パス!!
>


私は、文字がユニコードになったのが一番うれしかった。
つまり、AnsiPos()でなくPos()で全てOK。
でも、プログラムサイズはかなり大きくなった事には驚きました。


[7425] Re3:delphi 5 で頑張ってます返信 削除
2014/4/4 (金) 06:36:26 空色の渚
はじめまして

pos()で漢字まで使えるようになったんですか!
それは、驚きです。
私は、未だに IsKanji なるサブルーチンを作ってShift文字の先頭バイトで判断しております。
古い人間ですね(笑)

これからもよろしくお願い致します。

▼ takiさん
> ▼ Mr.XRAYさん
> > ▼ 空色の渚さん
>
> >
> > > 新しいバージョンを購入すると、何が起きるのか?
> >
> > う〜む.何とも.パス!!
> >
>
> 私は、文字がユニコードになったのが一番うれしかった。
> つまり、AnsiPos()でなくPos()で全てOK。
> でも、プログラムサイズはかなり大きくなった事には驚きました。


[7403] まずはエクセルの操作をテストしてみる返信 削除
2014/4/1 (火) 16:27:49 Mr.XRAY
> StringGridで作った表をエクセル形式で出力したいのですが、出来るものなのでしょうか?

まず,エクセルの操作ができないと,できないわけですが,
エクセルの操作はたとえば,

http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm#list8

は,エクセル操作の基本的なコードですが,
この Button1クリックのコードを次ののようにすると,セルに値をセットできます.

//=============================================================================
//  エクセルの操作例
//=============================================================================
procedure TForm1.Button1Click(Sender: TObject);
begin
  //文字列
  WorkSheet.Cells[1,1].Value := '文字列';
  WorkSheet.Cells[1,1].Interior.ColorIndex := 4;

  //数値
  WorkSheet.Cells[1,2].Value := 123;
  WorkSheet.Cells[1,2].Font.Color := RGB(255, 0, 0);
end;

Delphi 5 ですと,uses 部の Excel2000, Office2000 が「未定義のエラー」となるかも知れません.
未定義のエラーが発生したら削除してください.
Delphi 5 だと他にもエラーがでるかも知れません.
確認できないので.自分で確認してください.

もし,この [400] のサンプルをダウンロードして使う場合は,以下を参考にしてください.

[Delphi 5 以前で使用]
http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#02

[別のバージョンで作成された Delphi プロジェクトの利用]
http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#01




[7426] Re:まずはエクセルの操作をテストしてみる返信 削除
2014/4/4 (金) 06:41:54 空色の渚
Mr.XRAYさん
 
はじめまして。
ネットで不明な点を検索するとかならずMr.XRAYさんのお名前を見つけることができます。
お会いできてなともうれしい限りです。

エクセルで出力するのは、意外と簡単なんですね。
はじめから、質問すればよかったです。
stringgridからの変換も簡単そうです。
いま、サロンの予約、顧客管理を作っているんですが、日報をメールで送らなくてはなりません。
svcで送ると列も行もめちゃくちゃなんで、困っていました。
今まで使う機会のなかったEXEL機能ですが、Delphiを購入してから十数年目で初めて使えそうです。
ありがとうございました。
今後ともよろしくお願いします。


> > StringGridで作った表をエクセル形式で出力したいのですが、出来るものなのでしょうか?
>
> まず,エクセルの操作ができないと,できないわけですが,
> エクセルの操作はたとえば,
>
> http://mrxray.on.coocan.jp/Delphi/plSamples/400_Excel_CreateObject.htm#list8
>
> は,エクセル操作の基本的なコードですが,
> この Button1クリックのコードを次ののようにすると,セルに値をセットできます.
>
> //=============================================================================
> //  エクセルの操作例
> //=============================================================================
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>   //文字列
>   WorkSheet.Cells[1,1].Value := '文字列';
>   WorkSheet.Cells[1,1].Interior.ColorIndex := 4;
>
>   //数値
>   WorkSheet.Cells[1,2].Value := 123;
>   WorkSheet.Cells[1,2].Font.Color := RGB(255, 0, 0);
> end;
>
> Delphi 5 ですと,uses 部の Excel2000, Office2000 が「未定義のエラー」となるかも知れません.
> 未定義のエラーが発生したら削除してください.
> Delphi 5 だと他にもエラーがでるかも知れません.
> 確認できないので.自分で確認してください.
>
> もし,この [400] のサンプルをダウンロードして使う場合は,以下を参考にしてください.
>
> [Delphi 5 以前で使用]
> http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#02
>
> [別のバージョンで作成された Delphi プロジェクトの利用]
> http://mrxray.on.coocan.jp/Delphi/Others/Delphi_Versionl.htm#01
>
>


[7431] Re2:まずはエクセルの操作をテストしてみる返信 削除
2014/4/4 (金) 07:48:32 Mr.XRAY
▼ 空色の渚さん

> エクセルで出力するのは、意外と簡単なんですね。
> はじめから、質問すればよかったです。
> stringgridからの変換も簡単そうです。


実はですね.エクセルのセルに文字,テキストを代入したり,フォントを
設定したりするのは簡単なのですが,落とし穴があります.

説明は面倒なので省略しますが,エクセル等,他のアプリの操作は,
主に,COM (コム) という技術が使われています.
これが,動作が遅いのです.

したがつて,大量のデータをエクセルに転送するには,ちょっとした
テクニックが必要となります.
でも,とりあえずは,エクセルの基本的な操作は把握しておく必要が
あるというわけです.


[7433] Re3:まずはエクセルの操作をテストしてみる返信 削除
2014/4/4 (金) 08:43:55 Mr.XRAY
> したがつて,大量のデータをエクセルに転送するには,ちょっとした
> テクニックが必要となります.


難解とか,理解できないとか言われてしまうかも知れませんが,
クリップボードを使用する方法は高速です.
ただし,このコードは,そのままでは Delphi 5 で動作しません.
Delphi 2007 以降用です.

[20_クリップボードへのコピーと貼り付け - タフ区切り形式]
http://mrxray.on.coocan.jp/Delphi/plSamples/050_TStringGrid_OnDrawCell.htm#20

もしかしたら,以下のコードは Delphi 5 でも使用可能かも知れません.
これも非常に高速です.

[19_エクセルから読み込みとエクセルへの出力 - バリアント配列使用]
http://mrxray.on.coocan.jp/Delphi/plSamples/050_TStringGrid_OnDrawCell.htm#19


[7436] Re4:まずはエクセルの操作をテストしてみる返信 削除
2014/4/4 (金) 15:17:15 空色の渚
情報有り難うございます。
クリップボード経由ですね。
参考に致します。
delphi5も、win7の時代になっても、しっかりコンパイルしてくれるというのは
非常に助かっています。
なんだかんだと言いながらもマイクロソフトは互換性という面では頑張ってくれています。
ちょっと見直しています(笑)。

▼ Mr.XRAYさん
> > したがつて,大量のデータをエクセルに転送するには,ちょっとした
> > テクニックが必要となります.
>
> 難解とか,理解できないとか言われてしまうかも知れませんが,
> クリップボードを使用する方法は高速です.
> ただし,このコードは,そのままでは Delphi 5 で動作しません.
> Delphi 2007 以降用です.
>
> [20_クリップボードへのコピーと貼り付け - タフ区切り形式]
> http://mrxray.on.coocan.jp/Delphi/plSamples/050_TStringGrid_OnDrawCell.htm#20
>
> もしかしたら,以下のコードは Delphi 5 でも使用可能かも知れません.
> これも非常に高速です.
>
> [19_エクセルから読み込みとエクセルへの出力 - バリアント配列使用]
> http://mrxray.on.coocan.jp/Delphi/plSamples/050_TStringGrid_OnDrawCell.htm#19


[7405] Delphiの参考書返信 削除
2014/4/1 (火) 19:08:43 Mr.XRAY
▼ 空色の渚さん

> 参考書は出ているのか?

最近は参考書を購入していませんし,確認もしていませんが,
Delphi 5 の頃と比べると格段に状況は違います.
まず,オンランインヘルプが設置されています.

「○○を調べたいのですが,オンラインヘルプのどこにあるか知りたい」とか,
「オンラインヘルプに○○と書いてあるのですが,よく理解できません」

と言ったような訊き方もできるようになりました.
実際にそのような質問をされている方はいないようですけど,
と,いうより,ヘルプなんかみない人が多いのかも知れません.

[Delphi のオンラインヘルプ等]
http://mrxray.on.coocan.jp/Delphi/Others/A_Delphi_OnlieHelphtm.html

それと,Delphi の場合,新しい Delhi で実装された機能を使用しないのであれば,
古いバージョンの Delphi のコードが,ほとんどそのまま使用できます.
つまり,参考書も古いもので役に立つわけです.
その上で,オンラインヘルプ等で確認すれば,新しいコーディング方法が
見つかるかも知れません.


[7429] Re:Delphiの参考書返信 削除
2014/4/4 (金) 07:02:41 空色の渚
おはようございます。

いま、提示されたリンク先から半透明の記事を読んできました。
クラッとするほど素敵な機能です。
しかも、噂には聞いていましたがスマホ向けも開発できるとか。
iphone用は、マックがないと聞いていたので驚きです。

プログラム言語としてのDelphiは、
既に完成されたものですから、プログラマの負担を軽減するためのコード
たとえば、assign(f,Filename);reset(f); が LoadfromFile()になる程度だと
思いますが、グラフィックの強化などは本当にうれしいです。
で、困ったときにググって出てきていたのが、オンラインヘルプだったというのは、
ちょっと驚きでした。
てっきり個人の方が丁寧に作られたものだと思っていましたので。

完全に浦島太郎でした。
このサイトを発見して、本当に良かったです。

今後ともよろしくお願いします。


▼ Mr.XRAYさん
> ▼ 空色の渚さん
>
> > 参考書は出ているのか?
>
> 最近は参考書を購入していませんし,確認もしていませんが,
> Delphi 5 の頃と比べると格段に状況は違います.
> まず,オンランインヘルプが設置されています.
>
> 「○○を調べたいのですが,オンラインヘルプのどこにあるか知りたい」とか,
> 「オンラインヘルプに○○と書いてあるのですが,よく理解できません」
>
> と言ったような訊き方もできるようになりました.
> 実際にそのような質問をされている方はいないようですけど,
> と,いうより,ヘルプなんかみない人が多いのかも知れません.
>
> [Delphi のオンラインヘルプ等]
> http://mrxray.on.coocan.jp/Delphi/Others/A_Delphi_OnlieHelphtm.html
>
> それと,Delphi の場合,新しい Delhi で実装された機能を使用しないのであれば,
> 古いバージョンの Delphi のコードが,ほとんどそのまま使用できます.
> つまり,参考書も古いもので役に立つわけです.
> その上で,オンラインヘルプ等で確認すれば,新しいコーディング方法が
> 見つかるかも知れません.


[7407] Re:delphi 5 で頑張ってます返信 削除
2014/4/1 (火) 20:43:25 snail
▼ 空色の渚さん
こんにちは

> 新しいバージョンを購入すると、何が起きるのか?
最近のは変数や手続き名に日本語が使えます。
日本語使ってコーディングしましょう。

↓こんな感じ。

procedure TFormCngClosing.締め日変更( );
var
  W締日 : String;
begin




[7411] Re2:delphi 5 で頑張ってます返信 削除
2014/4/1 (火) 23:18:53 Mr.XRAY
▼ snailさん

> 日本語使ってコーディングしましょう。

日本語化推進委員長に任命します (笑)


[7412] Re2:delphi 5 で頑張ってます返信 削除
2014/4/2 (水) 13:01:50 千絵 〔HomePage
▼ snailさん

> 最近のは変数や手続き名に日本語が使えます。

えっ!日本語が使えるんですか?いいですねぇ
「英語がわからないからだろ」と、
Mr.XRAYさんから言われそうですが・・・そうです。

ずいぶん前ですが、桐というDBを使っていました。
好きだったところは日本語が使えるというところでした。

日本語が扱えるDelphiはとても魅力ですが、高いので買ってもらそうにありません。
自分で買え!って?
自分の財布は大切にしたいのですよ。(主婦の知恵)
私の場合100%趣味なので、高価な買い物は難しいです。

新しいのが買えたら、日本語化推進委員会の雑用係にでも使ってください。


[7413] Re3:delphi 5 で頑張ってます返信 削除
2014/4/2 (水) 18:20:12 Mr.XRAY
▼ 千絵さん

> 「英語がわからないからだろ」と、
> Mr.XRAYさんから言われそうですが・・・そうです。


うむ.
昔の日活の映画「愛と死をみつめて」にこんなシーンがあります.

ミコ「マコ,ほんまに怒っているの?」
マコ「あたりまえじゃないか!」
ミコ「なら,ゴメンナサイ」
マコ「謝るなよ!」
ミコ「何で?」
マコ「だって,怒れないじゃないか」
(若い二人の会話です.くすぐったいのは致し方ありません)

というわけで反論はできませんです. (^^;

> 私の場合100%趣味なので、高価な買い物は難しいです。

確かに,個人の趣味で購入するのは.
Starter という安価なのもありますが,機能がかなり限定されていますしね.
偽物の高額な骨董品を買うよりはマシなんですが,って比較にはなりませんが.
 
> 新しいのが買えたら、日本語化推進委員会の雑用係にでも使ってください。

私の権限で,内緒で,委員に任命します.


[7415] Re4:delphi 5 で頑張ってます返信 削除
2014/4/2 (水) 19:58:48 taki
▼ Mr.XRAYさん

> Starter という安価なのもありますが,機能がかなり限定されていますしね.
> 偽物の高額な骨董品を買うよりはマシなんですが,って比較にはなりませんが.


私はXE4のStarterしか持ってないので、機能が制限されているのかどうかは
判断できないのですが、多分制限だろうと思っていることを書きます。

マウスで変数をポイントしても値が表示されない。
監視式として変数を登録すれば見れるが、配列などの大量の値は表示されている
時間が2秒ほどで、消えてしまう。

クラス定義の中で関数やメソッドの宣言文を記述して,[Ctrl]+[Shift]+[C]を
押しても実装部のコードのひな形が作成されない。

「コードの折りたたみ」はできるが、維持できない。

この3点はたぶん制限ですよね。(T_T)



[7416] Starterエディションの制限返信 削除
2014/4/2 (水) 22:44:37 Mr.XRAY
▼ takiさん

> クラス定義の中で関数やメソッドの宣言文を記述して,[Ctrl]+[Shift]+[C]を
> 押しても実装部のコードのひな形が作成されない。


これどこかで読んだことがあります.
「へぇー,不便じゃないのかな.こんなことも制限しちゃうのか ?」
と,その時思いました.
後は,ちょっと分かんないです.


以前は,サイトの記事に,Personal 版の場合は,という内容も書いていました.
さすがに,Starter 版では,というのは,ちょっと無理ですね.
実際に導入してみないと確認できませんから.

それで,Personal 版に関する記事,文章も削除しました.


[7417] Re:Starterエディションの制限返信 削除
2014/4/3 (木) 06:25:19 taki
▼ Mr.XRAYさん
 
> 以前は,サイトの記事に,Personal 版の場合は,という内容も書いていました.
> さすがに,Starter 版では,というのは,ちょっと無理ですね.
> 実際に導入してみないと確認できませんから.
>
> それで,Personal 版に関する記事,文章も削除しました.


マスター、気を使っていただき恐縮です。
マスターが負担になるようなことは決して要求していません。

ただ単に「制限だろうな〜」と思ったことを書いただけです。

がんばってProfessional版を買えるようにしたいです。


[7418] Re2:Starterエディションの制限返信 削除
2014/4/3 (木) 07:05:35 taki
▼ Mr.XRAYさん

マスター すみません。ひとつだけ教えてください。

マスターが使われているバージョンでは、デバッグ時に変数をポイントするだけで
変数の値は表示されますか。

よろしくお願いします。m(_ _)m


[7419] Re3:Starterエディションの制限返信 削除
2014/4/3 (木) 15:42:57 Mr.XRAY
▼ takiさん

> マスターが使われているバージョンでは、デバッグ時に変数をポイントするだけで
> 変数の値は表示されますか。


表示されますよん.一応,Windows 7 U64(SP1) + Delphi XE4(UP1) Pro での確認です.
監視式としては登録していません.というより,
デバッグ関係の操作は,赤丸のブレークポイントを設定しただけです.


[7420] Re4:Starterエディションの制限返信 削除
2014/4/3 (木) 17:41:23 taki
▼ Mr.XRAYさん
 
> 表示されますよん.一応,Windows 7 U64(SP1) + Delphi XE4(UP1) Pro での確認です.
> 監視式としては登録していません.というより,
> デバッグ関係の操作は,赤丸のブレークポイントを設定しただけです.


うらやまし〜。(T_T)


[7427] Re2:delphi 5 で頑張ってます返信 削除
2014/4/4 (金) 06:44:21 空色の渚
snailさん はじめまして。

日本語が使えるなんて昔(かなり遙の)あった日本語ベーシックを思い出しました。
あれは、使えませんでした。
便利になりましたね。
正直、この投稿を頂いたときに、頭の中に「がちょーん」という言葉が浮かびました。
今後ともよろしくお願いします。

> ▼ 空色の渚さん
> こんにちは
>
> > 新しいバージョンを購入すると、何が起きるのか?
> 最近のは変数や手続き名に日本語が使えます。
> 日本語使ってコーディングしましょう。
>
> ↓こんな感じ。
>
> procedure TFormCngClosing.締め日変更( );
> var
>   W締日 : String;
> begin
>
>


[7430] Re3:delphi 5 で頑張ってます返信 削除
2014/4/4 (金) 07:44:27 Mr.XRAY
▼ 空色の渚さん

> 「がちょーん」という言葉が浮かびました。

古っ !! (^^)


[7437] Re4:delphi 5 で頑張ってます返信 削除
2014/4/4 (金) 15:28:24 空色の渚
その返しで「ちょんがー」も口から出ました(笑)

もう一つ、質問させてください。
凸凹ボタン全盛期のdelphi5で、最近流行のふらっとデザインに挑戦しています。
パネルやメモ帳などは、ボーダースタイルをなくすとフラットになるので
いいのですが、問題は、ボタンです。
マウスが通過すると出っ張るボタンというのがあるのですが、あれでは、やはり
時代を感じてしまいます。
いわゆるTimage にてボタンの絵を貼り付けて on click で機能を果たしているのですが、
問題が発生しました。
マウスが上空を通過した時は、on mouse move でイベントが発生して、ボタンの色を
変えることが出来ます。が、マウスが去った後のイベントがないんですね。

そこで、苦肉の策として、ボタンの絵を描いた絵に、上下左右に5ドットづつの余白をつけて
余白の上にマウスカーソルが乗ったら、マウスが去ったということにして、
ボタンの色を元に戻しす用にしました。

if (x > 4 ) or (x < 116) or (y > 4) or (y < 36) then  begin

マウスをゆっくり動かしたときはいいのですが、勢いよく通過すると、マウスカーソルが
5ドット以上で通過していくので、反応しなくなったりします。

なにかよい手立てはありませんでしょうか?

よろしくお願い致します。


▼ Mr.XRAYさん
> ▼ 空色の渚さん
>
> > 「がちょーん」という言葉が浮かびました。
>
> 古っ !! (^^)


[7438] マウスがコントロールから去った時のイベント返信 削除
2014/4/4 (金) 16:31:14 Mr.XRAY
▼ 空色の渚さん

> マウスが去った後のイベントがないんですね。

Delphi 2007 以上なら OnMouseLeave イベントがあるんですけどね.
ない時は作る,ですね.

type
  TMyButton = class(TButton)
  protected
    procedure WMMouseleave(var Message: TMessage); message WM_MOUSELEAVE;
    procedure Click; override;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private 宣言 }
    MyButton1 : TMyButton;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyButton1 := TMyButton.Create(Self);
  MyButton1.Parent := Self;
  MyButton1.Left   := 20;
  MyButton1.Top    := 10;
end;

{ TMyButton }

procedure TMyButton.Click;
begin
  inherited;
  ShowMessage('クリック');
end;

procedure TMyButton.WMMouseleave(var Message: TMessage);
begin
  inherited;
  Form1.Memo1.Lines.Add('Leave');
end;

これだと,実行時に生成ですから,必要なら,コンポーネントとして
登録できるようにコードを追加する.

あるいは,実行時に,フォームに配置したボタンと交換するかですね.
[派生元のコンポーネントと交換する方法]
http://mrxray.on.coocan.jp/Delphi/CompoInstall/CompInstallDD.htm#03

あるいは,サブクラス化,あるいは,WndProc で処理する.
あるいは,TApplicationEvents の OnMessage イベントで処理するか,
等々,いろいろ方法はありますです.
コーディング的にいいと思われるのは,コンポーネントの生成でしょう.


[7439] Re:マウスがコントロールから去った時のイベント返信 削除
2014/4/4 (金) 16:47:03 Mr.XRAY
> あるいは,TApplicationEvent の OnMessage イベントで処理するか,

Delphi 5 で実装された ApplicationEvents コンポーネントを使用した例です.
OnMessage イベントを作成します.
コンポーネントパレットの [Additional] タブにあります.

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ApplicationEvents1: TApplicationEvents;
    Button1: TButton;
    procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
  //Buttopn1で,かつメッセージがWM_MOUSELEAVEの時だけ処理
  if Msg.hwnd = Button1.Handle then begin
    if Msg.message = WM_MOUSELEAVE then begin
      Memo1.Lines.Add('Leave');
    end;
  end;
end;

他の方法が必要なら,いくらでもコード書きますよ.
サンプルプログラム集に,いくつも参考コードがあるので,たいして時間はかかりません.
次はサブクラスを使用したコードといきますか ?


[7440] Re2:マウスがコントロールから去った時のイベント返信 削除
2014/4/4 (金) 17:51:31 空色の渚
Mr.XRAY様

 早速のレスありがとうございます。
 またしても、頭の中では「ばっちぐー」的なコメントが発生しました。
 これなら簡単にいけそうです。
 感謝。感謝です。

 ありがとうございました!
 さっそく組み込みます!

 追伸
 これで、delphi5は生きながらえるのでした。


▼ Mr.XRAYさん
> > あるいは,TApplicationEvent の OnMessage イベントで処理するか,
>
> Delphi 5 で実装された ApplicationEvents コンポーネントを使用した例です.
> OnMessage イベントを作成します.
> コンポーネントパレットの [Additional] タブにあります.
>
> type
>   TForm1 = class(TForm)
>     Memo1: TMemo;
>     ApplicationEvents1: TApplicationEvents;
>     Button1: TButton;
>     procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
>   private
>     { Private 宣言 }
>   public
>     { Public 宣言 }
>   end;
>
> var
>   Form1: TForm1;
>
> implementation
>
> {$R *.dfm}
>
> procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
>   var Handled: Boolean);
> begin
>   //Buttopn1で,かつメッセージがWM_MOUSELEAVEの時だけ処理
>   if Msg.hwnd = Button1.Handle then begin
>     if Msg.message = WM_MOUSELEAVE then begin
>       Memo1.Lines.Add('Leave');
>     end;
>   end;
> end;
>
> 他の方法が必要なら,いくらでもコード書きますよ.
> サンプルプログラム集に,いくつも参考コードがあるので,たいして時間はかかりません.
> 次はサブクラスを使用したコードといきますか ?


[7441] Re3:マウスがコントロールから去った時のイベント返信 削除
2014/4/4 (金) 18:51:59 Mr.XRAY
▼ 空色の渚さん

>  さっそく組み込みます!

組み込むのはいいのですが,折角提示したコードです.
提示した程度の簡単なコードを実際に試して,確認してみることをお勧めします.
もしかしたら,本当は,動作しないかも知れません (^^;

ネット上でよく質問される方の中には,どう考えても,折角提示したコード
を試していない方がいるようです.また,リンクも辿ってみないどころか,
本文さえもろくに読んでいないと思われる方がいます.
そして,何万行もあるコードに組み込んで,
「うまくいきません」という人さえいます.

そして,同じ様な質問を繰り返し,他の場所で質問する等をする方もいます.
空色の渚さんがそういう方というわけではありません.
ここは他の方も見ている思いますので念のため.

# 眺めているのと,実際にやってみるのとは全く違います.
# 体操やスケート,スキーの選手が,他の方の競技を眺めているだけで
# 出来るのであれば,こんな簡単なことはありません.

DEKO さんや山本隆さんのサイトを見ていると分かります.
レスするだけでなく,自分のサイトで記事にしています.
つまり,実際にやっているんですね.
「忙中閑あり」というやつでしょうか.

[あなたにとっての情報発信]
http://www.hyuki.com/dig/press2.html


[7444] Re4:マウスがコントロールから去った時のイベント返信 削除
2014/4/5 (土) 14:28:35 空色の渚
こんにちは

 お言葉に甘えまして、さっそく組み込み前のtest21.pas にコピペしてみました。
 各コンポは同じ名前で、そっくりそのまま実験しましたが、なにも起こりません。
 ぴくりともメモ帳は反応しません。
 何か設定が間違っておりますでしょうか?
 それまで実験してきたマウスの各イベントは全て削除して綺麗になっています。
 本来なら、左にある「閉じる」ボタンの図柄が変わるはずでしたが、何も起こらないので
そっくりそのままのコードで試してみた次第です。
 よろしくお願い致します。

  ↓読んできました。

> [あなたにとっての情報発信]
> http://www.hyuki.com/dig/press2.html


 先ほどアップした画像が間違えていましたので、正しい画像に変えました。

 追伸
 私の周囲にはプログラマがおらず、全て独学でした。
 F-Basicから始まり、6809アセンブラ、98、Turbo Pasca の順です。
 ですから、(専門学校生でCをやっている人はいましたが)小出俊夫氏や
日高徹氏、竹田英雄氏の本が私のバイブルです。
 誰にも聞けず、一人悶々と苦闘する日が続きましたが、やっとここで、現役の方々に
会えてとても幸せな気分です。
 これからもよろしくお願い致します。
 

[7445] Re5:マウスがコントロールから去った時のイベント返信 削除
2014/4/5 (土) 16:47:09 taki
▼ 空色の渚さん
 
>  お言葉に甘えまして、さっそく組み込み前のtest21.pas にコピペしてみました。
>  各コンポは同じ名前で、そっくりそのまま実験しましたが、なにも起こりません。
>  ぴくりともメモ帳は反応しません。


マスターでなくてすみません。
takiといいます。私も試してみました。

DelphiXE4 Starter + Win7 32Bit ですが・・・。

新規作成しました。
Form上にButton1とApplicationEvents1とMemo1を配置しました。
オブジェクトインスペクタにApplicationEvents1を選択して
イベントタブよりOnMessageをダブルクリックしました。
作成された手続きprocedure TForm1.ApplicationEvents1Messageの
ひな形にホームページより31〜36行のコードだけを貼り付けました。
コンパイル後、Button1にマウスを置き、外へ動かすと
Memo1にLeaveと表示されました。

※スクリーンコピーしたのでマウスは消えています。


[7447] Re6:マウスがコントロールから去った時のイベント返信 削除
2014/4/5 (土) 18:08:03 空色の渚
Taki様

 はじめまして。
 わたしも、新規作成で挑戦してみましたが、やはり反応しませんでした。
 新規作成 → ボタン、メモ、ApplicationEvents1 配置 →
 ApplicationEvents1 の onMessage Wクリック 中身のみペースト → コンパイル
 コンパイル時にエラーは出ません。
 何事もなかったように動き出しますが、反応しませんでした。
 
 当方の環境は、

 Windows7 32bit + Delphi 5 Professional  です。

 残念です。
 ひょっとすると、WM_MOUSELEAVE そのものを Ver.5 では返さないのかもしれないです。
 むかし、他のコンパイラですが、定義はされているけど「意味を持たない」みたいな宣言があったように思います。
 ので、未定義の宣言みたいなエラーがでないのではないでしょうか?


[7448] Re7:マウスがコントロールから去った時のイベント返信 削除
2014/4/5 (土) 18:58:58 taki
▼ 空色の渚さん

>  残念です。
>  ひょっとすると、WM_MOUSELEAVE そのものを Ver.5 では返さないのかもしれないです。
>  むかし、他のコンパイラですが、定義はされているけど「意味を持たない」みたいな宣言があったように思います。
>  ので、未定義の宣言みたいなエラーがでないのではないでしょうか?


う〜ん。ごめんなさい。
私の手には負えません。残念です。


[7449] Re8:マウスがコントロールから去った時のイベント返信 削除
2014/4/5 (土) 22:41:05 Mr.XRAY
▼ takiさん,すみません.スレッドのつながりでここにレスします.

今か帰ってきました.桜はまだきれいでした.

 空色の渚さん,

>言葉に甘えまして、さっそく組み込み前のtest21.pas にコピペしてみました。

テストしていただき,ありがとうございます.
掲示板等でレスした時は,感謝の言葉も嬉しいのですが,本当にうれしいのは
実際に質問された方にテストして頂くこくとです.
このことで,更にサイトの記事も充実していけます.

で,空色の渚 さんの環境でおきている現象ですが,
いま戻ってきたばかりなので,後で調べてみます.


[7451] Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 13:30:00 Mr.XRAY
▼ takiさん,空色の渚さん,

空色の渚さんのテストの結果から判断すると,
Delphi 5 では WM_MOUSELEAVE は実装されているが,実際には検出しないみたいですね.
CM_MOUSELEAVE メッセージを使用するコードを書いてみました.
このメッセージは,Delphi 1 の時からあるので,多分動作するのではと.

例によって,TForm1 のクラス内で処理する場合と,
TButton の継承クラスのコードを書いてみました.
継承クラスを使う方法は,コンポーネントとして使う場合の参考です.
CM_XXXX メッセージについては,以下を参考にしてください.

[10-04_コンポーネントの内部メッセージと通知メッセージ]
http://mrxray.on.coocan.jp/Delphi/plSamples/160_CreateComponent.htm#10-04

参考リンクの VCL Component Messages [RTF] - delphi about.com を
ダウンロードすると,メッセージの説明があります.
ただし,英語です.

動作確認は,Windows 7 U64(SP1) + Delphi XE Pro ですので,あしからず.


[7452] Re:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 13:33:18 Mr.XRAY
> このメッセージは,Delphi 1 の時からあるので,多分動作するのではと.

実際のコードです,usse 部は省略しています.
uses 部に追加するものはありません.多分.

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
  private
  protected
    { Private 宣言 }
    procedure CMMouseleave(var Message: TMessage); message CM_MOUSELEAVE;
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

type
  TCMMouseLeave = record
    Msg    : Cardinal;
    Unused : Integer;
    Sender : TControl;
    Result : LongInt;
  end;

{ TForm1 }

procedure TForm1.CMMouseleave(var Message: TMessage);
begin
  inherited;
  if TCMMouseLeave(Message).Sender = Button1 then begin
    Memo1.Lines.Add('Leave');
  end;
end;

TCMMouseLeave = record の定義は
Inside Delphi (Borland programming series) [単行本]
Ray Lischner 著
満田 秀訳,大野 元久,服部 誠監修の
634 頁にあるものを使用しました.
http://www.amazon.co.jp/dp/4756119514


[7453] Re2:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 13:35:06 Mr.XRAY
> 実際のコードです,usse 部は省略しています.
> uses 部に追加するものはありません.多分.


続いて,TButton の継承クラスを作成して使用する例です.

type
  TMyButton = class(TButton)
  protected
    procedure CMMouseleave(var Message: TMessage); message CM_MOUSELEAVE;
  public
    procedure Click; override;
  end;

  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure Button1MouseEnter(Sender: TObject);
  private
    MyButton1 : TMyButton;
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1MouseEnter(Sender: TObject);
begin
  Memo1.Lines.Add('AAAA');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyButton1 := TMyButton.Create(Self);
  MyButton1.Parent := Self;
  MyButton1.Left   := 20;
  MyButton1.Top    := 5;
end;

{ TMyButton }

procedure TMyButton.Click;
begin
  inherited;
  ShowMessage('クリック');
end;

procedure TMyButton.CMMouseleave(var Message: TMessage);
begin
  inherited;
  Form1.Memo1.Lines.Add('Leave');
end;


[7454] Re2:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 14:28:49 空色の渚
Mr.XRAYさん

 さっそくのご教示有り難うございました。
 動きました!
 メモに文字が出ました(涙

 引き続き、現在テスト中の環境に実装してみます。
 左にある「閉じる」ボタンが水色になれば完成です。

 


[7455] Re3:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 14:49:14 空色の渚
Mr.XRAYさん

>  引き続き、現在テスト中の環境に実装してみます。
>  左にある「閉じる」ボタンが水色になれば完成です。


 判定部分をイメージの上に変更し、実行したところ
見事に動作いたしました。
 マウスを下ろせば、元に戻り、乗せれば色が変わる。
 これぞフラットデザインの象徴的なボタンが出来上がりました。

 感謝。
 感謝。
 
 最後まで面倒を見て頂き、有り難うございました。




[7456] Re4:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 15:59:17 Mr.XRAY
▼ 空色の渚さん

動作してよかったでござんす.
そして,お疲れ様でした.
taki さんも動作確認サンクスです,

更に,掲示板にはレスしなかったけど,実際にコードをテストした方々,
サンクスです.


[7457] Re4:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 16:18:31 空色の渚
Mr.XRAY 様

 残念な続報です。

 私が作っているプログラムへ移植したところ反応しなくなりました。
 30分ほど四苦八苦して、気づいたのが Timage が、Tpanel の上に
乗っているということでした。
 そこで、先ほどの実験用の form に Tpanel 貼り付け、その上に
Timage を乗せて実験したところ反応しなくなりました(涙
 何が彼等をそうさせてしまうのでしょう?
 対応策はできますでしょうか?

 よろしくお願い致します。

 


[7458] Re5:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 19:16:40 Mr.XRAY
▼ 空色の渚さん

> Timage を乗せて実験したところ反応しなくなりました(涙
>  何が彼等をそうさせてしまうのでしょう?


それはですね.普段の行いが悪いからです.
よ〜く,思い出してください.

>  対応策はできますでしょうか?

上記の理由から,心を改め,普段の行動を改めることです.
こういうのを
「身から出たさび」とか「天網恢恢疎にして漏らさず」
というわけです.
ウソ,ウソです (^^;


他のコントロールに載せているコントロールの場合,
親のコントロールがメッセージを処理します.
このような場合,対象にするコントロールに CM_MOUSELEAVE メッセージを処理する
機能をつけることになります.
その方法は,前に書いたように,継承クラスを作成する.つまりコンポーネントを
作ることです.そのための継承クラスの作成機能があるわけです.
もう1つの方法は,前にも述べた,サブクラス化の方法です,
サブクラス化は,その対象コントロールはあまり使わない,一時的な場合には
便利です.
以下は,サブクラス化のコード例です.
図は,テスト用のフォームの設計時の画面です,
動作確認環境は,またまた Windows 7 U64(SP1) + Delphi XE Pro です.

サブクラスについては,以下を参考にしてください.
[サブクラス化コンポーネント]
http://mrxray.on.coocan.jp/Halbow/Notes/N004.html

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Panel1: TPanel;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
  protected
    { Private 宣言 }
    OriginalImageProc : TWndMethod;
    procedure SubClassImageProc(var Message:TMessage);
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }
//-----------------------------------------------------------------------------
//  アプリ開始時にImage1のWindowProcを自作のWindowProcに置き換える
//  サブクラス関数の名前は何でもいいが,引数はvar Message:TMessage だけ
//-----------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
  OriginalImageProc := Image1.WindowProc;
  Image1.WindowProc := SubClassImageProc;

  //テスト用の画像をImage1に表示
  Image1.Stretch := True;
  Image1.Picture.LoadFromFile('503.bmp');
end;

//-----------------------------------------------------------------------------
//  自作のImage1専用WindowProcのサブクラス化関数
//-----------------------------------------------------------------------------
procedure TForm1.SubClassImageProc(var Message: TMessage);
begin
  //元のWindowProcは必ず実行する
  OriginalImageProc(Message);

  case Message.Msg of
  CM_MOUSELEAVE:
    begin
      Memo1.Lines.Add('Leave');
    end;
  end;
end;


[7459] Re6:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 19:26:28 Mr.XRAY
> 他のコントロールに載せているコントロールの場合,
> 親のコントロールがメッセージを処理します.


したがって,もし,Image1 の Align が alClient であれば,

procedure TForm1.CMMouseleave(var Message: TMessage);
begin
  inherited;
  if TCMMouseLeave(Message).Sender = Panel1 then begin
    Memo1.Lines.Add('Leave');
  end;
end;

のように,親の TPanel で処理しても構わないと思います.


[7460] Re7:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 21:50:20 空色の渚
Mr.XRAY様

 今、頂きましたコードを実装致しました。

 結論から書かせていただくと、意図したとおりになりました。

 なぜ意図したとおりに動いたのかわかりませんが、
> したがって,もし,Image1 の Align が alClient であれば,
 と書かれていたので、 alclient にしたところ、「閉じる」ボタンのイメージが
すぅっとパネルに吸い込まれて、下段になくてはならないのに上段へ移動して
しまいました。
 ダメだこりゃ!?とばかりに、ここに書かれているとおりに、panel のname を
そのまま(PL5 というnameにしてある)書き込んでみたら、マウスオンで色が変わり、
マウスアウトで色が元に戻りました。
 理由はよく分からないのですが、とにかく意図したとおり動きました。
 上手く動いているので、いいかな?という気もしますが、理屈に合っていますか?

 このパネルの上に2枚のimage を置いたらどうなるのだろう?とか考えて
しまいますが、偶然なのでしょうか?

 どうもクラスの継承あたりが苦手です(苦笑

 今回も大変お世話になりました。
 ありがとうございました。


追伸

 余談ながら
 私の普段の行いは、秋の青空のように澄んでいるとよく言われます。
 根が爽やかなので、作るソフトのデザインも爽やかです。
 ただ、動作が微妙なのですね。
 よく分からずに書いているコードがあるので(笑)
 「動いたからいいや」みたいな点だけは、高田純次っていわれています。


> > 他のコントロールに載せているコントロールの場合,
> > 親のコントロールがメッセージを処理します.
>
> したがって,もし,Image1 の Align が alClient であれば,
>
> procedure TForm1.CMMouseleave(var Message: TMessage);
> begin
>   inherited;
>   if TCMMouseLeave(Message).Sender = Panel1 then begin
>     Memo1.Lines.Add('Leave');
>   end;
> end;
>
> のように,親の TPanel で処理しても構わないと思います.


[7461] Re8:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/6 (日) 22:15:58 Mr.XRAY
▼ 空色の渚さん

>  ダメだこりゃ!?とばかりに、ここに書かれているとおりに、panel のname を
> そのまま(PL5 というnameにしてある)書き込んでみたら、マウスオンで色が変わり、
> マウスアウトで色が元に戻りました。


ここ ?
「ここ」がどこかは分かりませんが,プログラムは
「勝てば官軍,動けば正義」です.ハッキリ言って.


[7462] Re8:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/7 (月) 07:58:47 Mr.XRAY
▼ 空色の渚さん

>  どうもクラスの継承あたりが苦手です(苦笑

そうですか ? 折角意識的に継承クラス,つまりコンポーネント化の参考となる
コードを提示しているのにぃ.
了解しました.今後は,継承クラスやコンポーネント化しないとできない
場合は,「できません」とレスします.

# 昔,データベース関係のレスで SQL 文の使用を勧めたところ,
# 同様の反応が何回か続いたことがありました.
# それ以来データベース関係にはレスしなくなり,記事も書かなくなりました.


[7463] Re9:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/7 (月) 09:16:58 空色の渚
Mr.XRAY様

 動いたので官軍だったと思います。
 しかし、開発していたマシンでは問題なかったのですが、
家のマシンで動かしたら、やはり元の「戻らない状態」に戻りました。
 動いていた理由がやはりわかりません。
 
 
 プログラムを組んでいて、自分の限界にぶち当たり
一人でへこんでいたところこの掲示板で助けられました。
 そんな中、誰ともわからぬ人に、無償で知識を提供してくださることに
大変な感謝をしております。
 意識的に継承クラス,コンポーネント化の参考となるコードまで提示して
頂いたことには頭が下がるばかりです。

 ありがとうございました。


> >  どうもクラスの継承あたりが苦手です(苦笑
>
> そうですか ? 折角意識的に継承クラス,つまりコンポーネント化の参考となる
> コードを提示しているのにぃ.
> 了解しました.今後は,継承クラスやコンポーネント化しないとできない
> 場合は,「できません」とレスします.
>
> # 昔,データベース関係のレスで SQL 文の使用を勧めたところ,
> # 同様の反応が何回か続いたことがありました.
> # それ以来データベース関係にはレスしなくなり,記事も書かなくなりました.


[7466] Re10:Delphi 5のMouseLeaveメッセージ返信 削除
2014/4/8 (火) 16:51:03 Mr.XRAY
▼ 空色の渚さん

なんか,お役に立たなかったようで,申し訳ありません.


[7410] Delphi の機能返信 削除
2014/4/1 (火) 23:07:47 Mr.XRAY
▼ 空色の渚さん

Delphi 5 を使い続けるにしても,Delphi がどのように変化してきたかを
知ることは損はないと思います.

Delphi 7
Windows XP テーマに対応

Delphi 2007
Windows Vista に対応

Delphi 2009
グラフィックス機能が強化され,透明,半透明のアルファイチャンネル付き
の画像を扱えるようになった.
全面的にユニコード化され,中国の漢字やハングル文字等も扱えるようになった.
ポインタ等の扱いが厳重になった半面,型変換が柔軟になった.

Delphi XE2
64 ビットのアプリの開発が可能になった
FireMonkey というのが実装された.
従来の VCL では困難だった画像処理が容易になった.
3D のアニメーションの作成も容易になった.
iOS, iPhone, iPad, Android 等で動作するアプリの開発が可能になった.
(Ent 版以上, Pro 版では,別途 Mobile Add-On Pack の購入が必要)

こんなところでしょうか.

http://www.embarcadero.com/jp/products/delphi


[7428] Re:Delphi の機能返信 削除
2014/4/4 (金) 06:50:29 空色の渚
グラフィックの強化は、驚くべきものですね。
半透明は憧れます。
カラフルなゲームが作れそうです。
私は、ビジネスソフトにアニメーション効果を入れて作るのが好きで、時間の経過を表現するのにアニメを多用しています。
delphi2009を中古で購入というのも手でしょうか。
アクティベーションってあるのでしょうか。
ちょっと調べてきます。
情報ありがとうございます。


▼ Mr.XRAYさん
> ▼ 空色の渚さん
>
> Delphi 5 を使い続けるにしても,Delphi がどのように変化してきたかを
> 知ることは損はないと思います.
>
> Delphi 7
> Windows XP テーマに対応
>
> Delphi 2007
> Windows Vista に対応
>
> Delphi 2009
> グラフィックス機能が強化され,透明,半透明のアルファイチャンネル付き
> の画像を扱えるようになった.
> 全面的にユニコード化され,中国の漢字やハングル文字等も扱えるようになった.
> ポインタ等の扱いが厳重になった半面,型変換が柔軟になった.
>
> Delphi XE2
> 64 ビットのアプリの開発が可能になった
> FireMonkey というのが実装された.
> 従来の VCL では困難だった画像処理が容易になった.
> 3D のアニメーションの作成も容易になった.
> iOS, iPhone, iPad, Android 等で動作するアプリの開発が可能になった.
> (Ent 版以上, Pro 版では,別途 Mobile Add-On Pack の購入が必要)
>
> こんなところでしょうか.
>
> http://www.embarcadero.com/jp/products/delphi


INCM/CMT
Cyclamen v3.82