喫茶XRAYトップページ

[スレッド全体
]

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

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

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


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



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

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

↓こんな感じ。

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




[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 では返さないのかもしれないです。
>  むかし、他のコンパイラですが、定義はされているけど「意味を持たない」みたいな宣言があったように思います。
>  ので、未定義の宣言みたいなエラーがでないのではないでしょうか?


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


[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


[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 さんも動作確認サンクスです,

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


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82