- PR -

【Delphi(デルファイ)】コントロール配列のつくりかた

投稿者投稿内容
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-06-16 14:11
ぽてCCPさん、レスありがとうございます。
引用:

ぽてCCPさんの書き込み (2006-06-16 13:59) より:
デルファイだと、配列の変数名が変わるんですか?

配列って、変数名が同じで、添え字によって指定されるものと思ってたもので。



delphiでも配列は存在しますが、
もちろん変数が変わることはありません。

変数の配列ではなく、コントロールの配列について質問しています。



七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-06-16 14:17
引用:

わしこさんの書き込み (2006-06-16 14:06) より:

確かに説明が不足していて意図する内容の書き込みではありませんが、
『ボタン1、2を押したときにボタン3のイベントが発生する』と書いているようには
どうしても思えないのですが。。。




で やって見ましたか!記述が正しいのかどうかは不明ですが、うまくいくと思うのですが、

delphiはここ数年さわってないので、忘れた ちなみにVBと同じようにしようとすると
良さが発揮できません。
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-06-16 14:18
==補足==

VBのコントロール配列を例にあげると
Private Sub Command1_Click()
 Picture1.Picture = Image1.Picture
End Sub

Private Sub Command2_Click()
 Picture1.Picture = Image2.Picture
End Sub

Private Sub Command3_Click()
 Picture1.Picture = Image3.Picture
End Sub

↓↓↓↓↓(上の様に同じ処理を何度も書くと面倒なので)
↓↓↓↓↓(コントロール配列に変更)

Private Sub MyButton_Click(Index As Integer)
 Picture1.Picture = MyImage(Index).Picture
End Sub

==============
このような処理(コントロール配列)をdelphiでもできないのでしょうか?

できるはずな気がするのですが、
VBでは「一つのボタンコントロールをコピペするだけでコントロール配列になる」
のに、delphiでは同じ様にやってもコントロール配列になりません。
CHN#
常連さん
会議室デビュー日: 2004/11/07
投稿数: 31
投稿日時: 2006-06-16 14:19
引用:

わしこさんの書き込み (2006-06-16 11:56) より:
Delphiについて他に質問できそうな所が無かったので、
VBに似ていると言われているようなのでここで質問させてください><

Delphiをインストールしてかれこれ1時間ほど
コントロール配列の作成をしていますができません。

btn1〜3を作成し、Label1に「1」or「2」or「3」を出力、という極単純なことがしたいのです。

http://www.w-frontier.com/delphi/4_calc.htmlを参考に作成しています。

方法↓
btn1〜3を作成する。
[Shift]を押下したままbtn1〜3をクリックして選択する。
ダブルクリックする。

以上の方法でできると書いてありますが、
結果はbtn3をクリックすると「3」と出力されるだけで、
btn1,btn2は音沙汰無しです。

場違いだとは思いますが、
もしDelphiを使用されたことがあるという方がいらっしゃいましたら、ご教授くださいませ。

実行コードは以下===========================================
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
btn3: TButton;
Label1: TLabel;
procedure btn3Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn3Click(Sender: TObject);
var s : Char ;
begin
if Sender is TButton then
begin
s := TButton(Sender).Name[4] ;
Label1.Caption := s;
end;
end ;

end.


[ メッセージ編集済み 編集者: わしこ 編集日時 2006-06-16 13:03 ]


元記事をよく読んでいますか?

でしゃばるアレではないですが、Delphi知っている人少ないと思いますので。

本当のコントロール配列をやろうとしてるわけではありません。
イベントプロシージャの共有です。
Delphiではメソッドポインタで
.NETではデリゲートで実現しています。
ですから今回の場合は三つのボタンのOnClickに同じprocedureを代入すればOKです。
プロシージャ名はなんでもいいです。たとえばbtn1だからbtn1Clickでなければならないことはありません。
btn1.OnClick := a; // procedure なんとかフォーム.a(Sender: TObject); があればOKです。
DelphiなのでVB(6以前)と同じ考えかたしてもしょうがないです。
どうしてもコントロール配列がしたいなら「コントロール」の「配列」を作ってください。
それでも最後はやることが同じです。


今回は根本的にdelphiを理解してないのが原因です。
習う前に慣れろっのはコンピュータ業界においては
おかしい考え方です。動かす前に基礎をまず学ぶ!!!!
スポーツ界とかにおいてはありだと思いますが。

[ メッセージ編集済み 編集者: CHN# 編集日時 2006-06-16 14:34 ]
未記入
会議室デビュー日: 2006/06/16
投稿数: 3
投稿日時: 2006-06-16 14:20
これでどうでしょう?
ボタンクリックのイベントのあとに数字が入っていたから
わかりにくかったのでしょうか?
3つのボタンのONCLICKイベントにはBtnClickと入れてみてください。
ボタン1・ボタン2・ボタン3のをクリックすると
ONCLICKイベントのBtnClickのイベントを実行します。
ボタン1をクリックしたのであれば、BTN1の4文字目が1なので、キャプションには1
ボタン2をクリックしたのであれば、BTN2の4文字目が2なので、キャプションには2
が表示されるはずです。
必要ないかと思いますが、ロジックを貼り付けておきます。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Btn1: TButton;
Btn2: TButton;
Btn3: TButton;
Label1: TLabel;
procedure BtnClick(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BtnClick(Sender: TObject);
var s : Char ;
begin
if Sender is TButton then
begin
s := TButton(Sender).Name[4] ;
Label1.Caption := s;
end;
end ;
end.
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-06-16 14:23

引用:

七味唐辛子さんの書き込み (2006-06-16 14:17) より:

で やって見ましたか!記述が正しいのかどうかは不明ですが、うまくいくと思うのですが、



私が以前記述したコードでは、
btn3のクリックイベントしかない為かbtn3以外のボタンをクリックしても
音沙汰がないわけです。
ということはコントロール配列ができてないのだと思います。

コードの記述法よりも前に、
コントロールオブジェクト的にどうやったらコントロール配列になるのでしょう(;_
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-06-16 14:52
こんにちは。

わしこさんは VB.NET を利用したことがある方だと思いますが(以前 Insider.NET で
質問されていましたし) Delphi は VB (この場合は 6.0 )よりは VB.NET に近い感じ
だと思います。

提示していただいたコードを見ると、btn3Click() が生成されるところまではできているよ
うなので、あとは未記入さんのおっしゃるとおり、ボタン1〜3の OnClick イベントに
btn3Click() を割り当ててあげればご希望の操作はできると思います。

まずは btn1 と btn2 を選択して、オブジェクトインスペクタのイベントタブを表示
イベント一覧の中に OnClick と書かれたものがあると思うので、その中に btn3Click と入力
(コンボボックスになっているので、そこから選択することもできます)

以上のような感じでどうでしょうか。


引用:

コードの記述法よりも前に、
コントロールオブジェクト的にどうやったらコントロール配列になるのでしょう(;_?


他の方もおっしゃっていますが、Delphi には VB6.0 で言うところの「コントロール配列」
といった概念はありません
正直言って、わしこさんの挙げていただいたページは役に立たないと思います。そのペー
ジで教えているのは「イベントプロシージャの共有」であり、コントロール配列でもなんでも
ありません。誤解を招くような書き方をしているそのページはちょっと考えモノだと思います
が、そもそもトップページからリンクされていない「死んだページ」のようなので、そういったも
のを参照すべきではないのかもしれません。

わしこさんがやりたい(と私が思っている)ことは、未記入さんの回答で十分説明されてい
ると思うのですが、それを理解できておられないようでは、そもそも掲示板で質問すること
も考えられたほうが良いかと思います(厳しいようですが)。
Delphi がいくら簡単だと言っても VB6.0 とは違いますので、それぞれの文法の差です
とか言語の差をもう少し勉強されてからの方が良いと考えます。
わしこ
常連さん
会議室デビュー日: 2005/10/18
投稿数: 35
投稿日時: 2006-06-16 14:54
CHN#さん、未記入さん、レスありがとうございます。

引用:

本当のコントロール配列をやろうとしてるわけではありません。

ですから今回の場合は三つのボタンのOnClickに同じprocedureを代入すればOKです。
プロシージャ名はなんでもいいです。たとえばbtn1だからbtn1Clickでなければならないことはありません。
btn1.OnClick := a; // procedure なんとかフォーム.a(Sender: TObject); があればOKです。
DelphiなのでVB(6以前)と同じ考えかたしてもしょうがないです。
どうしてもコントロール配列がしたいなら「コントロール」の「配列」を作ってください。




>三つのボタンのOnClickに同じprocedureを代入すればOK

これは未記入さんが掲示してくださったコードと同じ意味ですよね。
―という事は、delphiではVBで使用していたようなコントロール配列とやらは
存在しないということですね。
結局、3つのイベントを書くしかないわけですね。
極端な話、ボタンが100個あっても100つのイベントを書くしかないわけですか…。


>「コントロール」の「配列」
最悪これしかないですね。

引用:

今回は根本的にdelphiを理解してないのが原因です。
習う前に慣れろっのはコンピュータ業界においては
おかしい考え方です。動かす前に基礎をまず学ぶ!!!!
スポーツ界とかにおいてはありだと思いますが。


確かにdelphiについてまだまだ理解が浅いのはご指摘のとおりですが、
基礎を学ぶ上の確認として、今回こうやって質問させて頂ました。
http://www.w-frontier.com/delphi/4_calc.html
にコントロール配列の作り方を掲示してあるにかかわらず
まったく予期しない動作をしたから質問させていただいているのです。
卓上で基礎を学ぶことが必ずしも正しいとは思いません。



[ メッセージ編集済み 編集者: わしこ 編集日時 2006-06-16 14:55 ]

スキルアップ/キャリアアップ(JOB@IT)