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になっています。
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が抜けてました。
親コントロールの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でも自フォーム(またはコンポーネント)の名前は省略できます。
解答ありがとうございました。
試してみましたが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;
コンパイルがとまる?
ならば、コンパイラのエラーメッセージが出ていると思いますけど、
それは確認しましたか?
(編集フォームの下側に表示されるはずです)
上のコードを実際に確認したわけではないですけど、
似たようなことをうちでも何度もやっていますし、
問題ないと思いますけど。
未定義の識別子:'TSpeedButton'のエラーが出ました。
Delphi7 Personalを使っています。
未定義の識別子といわれるということは、
コンパイラが"TSpeedButtonという名前の識別子(この場合クラス)を見つけられなかった"ということになりますけど…。
このエラーが出るのは、普通こんな場合になると思います。
1.TSpeedButtonを宣言したユニットがusesされていない。
ボタンはVCLなので、これはないと思いますけど…。
2.スペルミス。
ヘルプにもありますけど、これが一番多いです。わたしも、よくします^^;
ちょっと確認してみてください。
最初にご回答をもらってから補完機能を使いながら入力しました。
2回目にご回答をもらったときは、たかみちえさんのコードをコピーして貼り付けました。
最初の回答の時は、TButtonに置き換えてコンパイルはできました。
従って、スペルミスはないと思いますけど・・・
他にはどんな原因があるでしょうか?
もしくはTagとかを使うか、Nameを同じにしてVBのように識別するような方法は無いでしょうか。
初めての書き込みです。
私がよく使う方法は下記のような感じです。
for c := 1 to 35 do
begin
TSpeedButton( FindComponent( 'SpeedButton'+IntToStr( c ) ) ).Caption := Memo1.Lines[c-1];
end;
たかみちえさんの方法でもできるはずですけど、
おかしいですね。
>もしくはTagとかを使うか、Nameを同じにしてVBのように識別するような方法は無いでしょうか。
Name でコンポーネントにアクセスするには、FindComponent
を使います。ヘルプで調べると、使用法の例ものってますよ。
chamさんの方法でもTSpeedButtonでエラーが発生します。
TButtonに替えたらコンパイルはできました。
たぶん根本的な原因があると思いますが全unitのソースコードをここに貼り付けるのも忍びないし・・・もう少し考えることにします。
form2の
implementationに
uses form1のunit名;
が書いてあります?>マールさん
>マールさん
>未定義の識別子:'TSpeedButton'のエラーが出ました。
>TButtonに替えたらコンパイルはできました。
「らぶり雀」Form2 のユニットに、uses Buttons; が書いてないのが原因でチュン。
「よっし烏」おー、さすがオイラの弟子。目の付け所がいいねぇ…カァー。
「ごまき雀」ちょっと〜、私の子はカラスなんかの弟子ではないでチュン。
「よっし烏」あんたはジャマ。 では、らぶり雀クン、TButton でエラーにならないのは何故カァーね?
「らぶり雀」それはでチュン。TButton は StdCtrlsゆにっと、TSpeedButton は Buttonsゆにっとで定義されてるからでチュン。
「ごまき雀」おー、さすが私の弟子でチュン。
「よっし烏」おいおい、それはオイラのセリフやんカァ〜。
「よっし烏」しカァ〜し、らぶり雀クン、普通 Formに SpeedButtonをおけば、usesの中に Buttons が自動的に追加されるんじゃないのカァーね?
「らぶり雀」たぶんでチュン。SpeedButtonは Form1の方にだけあって、Form2の方には置いて無いんでチュン。
「らぶり雀」ウーン、さすが ごまきカァーさんの子でチュン。
「よっし烏」おいおい、自我自賛やんカァ〜。
らぶりぃ雀&よっしぃ烏さんありがとうございます。
コンパイルはできるようになりましたが、たかみちえさん、chamさんのいずれの方法でもMemo1の内容をForm1のSpeedButtonに反映されません。
そろそろあきらめた方がいいでしょうか。
いまForm1にSpeedButtonを5個並べたものでテストしましたが
問題なく動作しましたよ。
ちなみに私が書いたコードの「FindComponent・・・」の部分は
「Form1.FineComponent・・・」に書き直してみてください。
おかしいですね。
form1.SpeedButton1.Caption:=form2.Memo1.Lines[0];
・
・
・
form1.SpeedButton35.Caption:=form2.Memo1.Lines[34];
の代わりになりません。
うーむ、どこがいけないのでしょうかねえ。
とりあえず私がテストで作成したソースを下記にアップしました。
2/5まではおいて置きますのでダウンロードしてコンパイル
して動作確認してみてください。
http://www.css-net.jp/cham/Soft/D6TEST.LZH
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.
?さんありがとうございました。
ようやく解決できました。
なんでこのソースで機能するか判りませんがこれから解析していきます。
これでSpeedButtonが100個になっても簡単に対応できそうです。
たくさんの方に応援して頂きありがとうございました。
これからも少しずつDelphiを覚えていこうと思います。
chamさんに至ってはソースを公開して頂きありがとうございます。
参考のためにこれからダウンロードさせて頂きます。
ツイート | ![]() |