複数のボタンのCaptionに代入するには

解決


マール  2003-02-01 22:21:58  No: 2748

form2のMemo1が変わるたびにSpeedButtonのCaptionに代入したいのですが下記のプログラムではコンパイルできません。
なにか方法はありませんか。
ちなみにVBではコンポーネントのNameを同じ名前にして配列を表記することができましたけど・・・

procedure TForm2.Memo1Change(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 35 do
  form1.SpeedButton.tag(i):=form2.Memo1.Lines[i];
end;

form1に35個のSpeedButtonを貼り付けTagプロパティに0から34までの数字を入力しました。
それぞれのSpeedButtonの名前にはSpeedButton1からSpeedButton35になっています。


マール  2003-02-01 22:25:42  No: 2749

procedure TForm2.Memo1Change(Sender: TObject);
var
i:Integer;
begin
for i:=0 to 35 do
  form1.SpeedButton.tag(i).Caption:=form2.Memo1.Lines[i];
end;

Captionが抜けてました。


たかみちえ  URL  2003-02-01 23:07:18  No: 2750

親コントロールのControlsプロパティを使うといいでしょう。
ControlCountプロパティに、子コントロールの数が入っていますから、
for i := 0 to form1.ControlCount - 1 do
  if form1.Controls[i] is TSpeedButton then // i番目のコントロールがスピードボタンなら…。
    TSpeedButton(form1.Controls[i]).Caption := Memo1.Lines[i];
    // キャプションにMemoのi行目の文字列を入れる

  となります。
それから、Delphiでも自フォーム(またはコンポーネント)の名前は省略できます。


マール  2003-02-02 04:38:59  No: 2751

解答ありがとうございました。
試してみましたがTSpeedButtonのところでコンパイルが止まってしまいます。
TButtonに置き換えるとコンパイルできましたがCaptionは変わりませんでした。
現状は下記の通り全てのSpeedButtonにmemo1.Lineの内容を代入しています。
35個くらいならいいですが近々100個に増やそうと思っていますので
for文を使って数行で処理できないかなと思っています。
何かアイデアがあったらご指導ください。

procedure TForm2.Memo1Change(Sender: TObject);
begin
  form1.SpeedButton1.Caption:=form2.Memo1.Lines[0];
                              ・
                              ・
                              ・  
  form1.SpeedButton35.Caption:=form2.Memo1.Lines[34];
end;


たかみちえ  URL  2003-02-02 05:01:10  No: 2752

コンパイルがとまる?
ならば、コンパイラのエラーメッセージが出ていると思いますけど、
それは確認しましたか?
(編集フォームの下側に表示されるはずです)

  上のコードを実際に確認したわけではないですけど、
似たようなことをうちでも何度もやっていますし、
問題ないと思いますけど。


マール  2003-02-02 05:31:32  No: 2753

未定義の識別子:'TSpeedButton'のエラーが出ました。
Delphi7 Personalを使っています。


たかみちえ  URL  2003-02-02 05:39:19  No: 2754

未定義の識別子といわれるということは、
コンパイラが"TSpeedButtonという名前の識別子(この場合クラス)を見つけられなかった"ということになりますけど…。

  このエラーが出るのは、普通こんな場合になると思います。
1.TSpeedButtonを宣言したユニットがusesされていない。
  ボタンはVCLなので、これはないと思いますけど…。
2.スペルミス。
  ヘルプにもありますけど、これが一番多いです。わたしも、よくします^^;

  ちょっと確認してみてください。


マール  2003-02-02 05:57:24  No: 2755

最初にご回答をもらってから補完機能を使いながら入力しました。
2回目にご回答をもらったときは、たかみちえさんのコードをコピーして貼り付けました。
最初の回答の時は、TButtonに置き換えてコンパイルはできました。
従って、スペルミスはないと思いますけど・・・
他にはどんな原因があるでしょうか?
もしくはTagとかを使うか、Nameを同じにしてVBのように識別するような方法は無いでしょうか。


cham  2003-02-02 06:16:59  No: 2756

初めての書き込みです。

私がよく使う方法は下記のような感じです。

for c := 1 to 35 do
begin
  TSpeedButton( FindComponent( 'SpeedButton'+IntToStr( c ) ) ).Caption := Memo1.Lines[c-1];
end;


hatena  2003-02-02 06:26:33  No: 2757

たかみちえさんの方法でもできるはずですけど、
おかしいですね。

>もしくはTagとかを使うか、Nameを同じにしてVBのように識別するような方法は無いでしょうか。

Name でコンポーネントにアクセスするには、FindComponent 
を使います。ヘルプで調べると、使用法の例ものってますよ。


マール  2003-02-02 06:42:59  No: 2758

chamさんの方法でもTSpeedButtonでエラーが発生します。
TButtonに替えたらコンパイルはできました。
たぶん根本的な原因があると思いますが全unitのソースコードをここに貼り付けるのも忍びないし・・・もう少し考えることにします。


(´∀`)  2003-02-02 08:45:15  No: 2759

form2の
implementationに
uses form1のunit名;
が書いてあります?>マールさん


らぶりぃ雀&よっしぃ烏  2003-02-02 11:40:17  No: 2760

>マールさん
>未定義の識別子:'TSpeedButton'のエラーが出ました。
>TButtonに替えたらコンパイルはできました。

「らぶり雀」Form2 のユニットに、uses Buttons; が書いてないのが原因でチュン。
「よっし烏」おー、さすがオイラの弟子。目の付け所がいいねぇ…カァー。
「ごまき雀」ちょっと〜、私の子はカラスなんかの弟子ではないでチュン。
「よっし烏」あんたはジャマ。 では、らぶり雀クン、TButton でエラーにならないのは何故カァーね?
「らぶり雀」それはでチュン。TButton は StdCtrlsゆにっと、TSpeedButton は Buttonsゆにっとで定義されてるからでチュン。
「ごまき雀」おー、さすが私の弟子でチュン。
「よっし烏」おいおい、それはオイラのセリフやんカァ〜。


らぶりぃ雀&よっしぃ烏  2003-02-02 12:43:14  No: 2761

「よっし烏」しカァ〜し、らぶり雀クン、普通 Formに SpeedButtonをおけば、usesの中に Buttons が自動的に追加されるんじゃないのカァーね?
「らぶり雀」たぶんでチュン。SpeedButtonは Form1の方にだけあって、Form2の方には置いて無いんでチュン。
「らぶり雀」ウーン、さすが ごまきカァーさんの子でチュン。
「よっし烏」おいおい、自我自賛やんカァ〜。


マール  2003-02-02 18:50:14  No: 2762

らぶりぃ雀&よっしぃ烏さんありがとうございます。
コンパイルはできるようになりましたが、たかみちえさん、chamさんのいずれの方法でもMemo1の内容をForm1のSpeedButtonに反映されません。
そろそろあきらめた方がいいでしょうか。


cham  2003-02-02 19:36:13  No: 2763

いまForm1にSpeedButtonを5個並べたものでテストしましたが
問題なく動作しましたよ。

ちなみに私が書いたコードの「FindComponent・・・」の部分は
「Form1.FineComponent・・・」に書き直してみてください。


マール  2003-02-02 21:16:41  No: 2764

おかしいですね。
form1.SpeedButton1.Caption:=form2.Memo1.Lines[0];
                              ・
                              ・
                              ・  
form1.SpeedButton35.Caption:=form2.Memo1.Lines[34];
の代わりになりません。


cham  2003-02-02 22:21:23  No: 2765

うーむ、どこがいけないのでしょうかねえ。

とりあえず私がテストで作成したソースを下記にアップしました。
2/5まではおいて置きますのでダウンロードしてコンパイル
して動作確認してみてください。

http://www.css-net.jp/cham/Soft/D6TEST.LZH


  2003-02-03 00:32:48  No: 2766

unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Memo1: TMemo;
    SpeedButton1: TSpeedButton;
    procedure Memo1Change(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form2: TForm2;

implementation
   uses unit1;

{$R *.dfm}

procedure TForm2.Memo1Change(Sender: TObject);
var
    i: integer;
    c: TComponent;
begin
    for i:=0 to 34 do begin
    c:= Form1.FindComponent('SpeedButton'+IntToStr(i+1));
    TSpeedButton(c).Caption:= Memo1.Lines[i];
    end;
end;

end.


マール  2003-02-03 05:21:20  No: 2767

?さんありがとうございました。
ようやく解決できました。
なんでこのソースで機能するか判りませんがこれから解析していきます。
これでSpeedButtonが100個になっても簡単に対応できそうです。

たくさんの方に応援して頂きありがとうございました。
これからも少しずつDelphiを覚えていこうと思います。

chamさんに至ってはソースを公開して頂きありがとうございます。
参考のためにこれからダウンロードさせて頂きます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加