表題の件、どなたか教えてください。
「可能」か「不可能」かの情報や代替案でもありがたいです。

※delphi6 enterprise版を使用しています。

質問
コンポーネント名の指定に変数は使えるのでしょうか?
例えば、labelコンポーネントを複数設置しそのlabel名の末尾を数字にする(label1,2,3・・・)。何かの処理の際に、for文で変数を送り(i=1,2,3・・・)、label名+変数.captionなどという形で指定することはできるでしょうか?


ラベル名 label1 label2 label3 を設置

ボタンクリック時などに、
var
i : integer;

for i := 1 to 3 do
begin
  label(i).caption := inttostr(i) ;
end;

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

そのような目的にはFindComponentが使えます。



for i := 1 to 3 do
begin
TLabel(FindComponent('Label'+InttoStr(i))).Caption:=InttoStr(i);
end;
    • good
    • 2
この回答へのお礼

素早いご回答まことにありがとうございます。
これで煩雑なコーディングを回避出来そうです。

お礼日時:2009/05/15 00:37

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qdelphi でのコード上でTab を入力。

delphiで、コード上からString変数などに、Tabを入力する方法を教えてもらえませんか?

Javaでは確か \t とかだったと思うのですが。。。

また、よろしければ多言語でのバックスラッシュコード(?改行の\nなど)に対応するものがdelphiに存在するのかも教えてください。

Aベストアンサー

Delphi6での場合。

#数字 でASCIIコードを記述します。
数字の所は16進数も使えます。

タブ(10進数): 'abc'#9'def'
タブ(16進数): 'abc'#$9'def'

改行(10進数): 'Line 1'#13#10'Line 2'
改行(16進数): 'Line 1'#$d#$a'Line 2'


こんな感じだったと思います。

C言語やJavaのような、\t みたいな記述は無かったと思います。

文字列中に'(シングルクオート)を入れる場合も、\' ではなく、
二つ重ねて '' だし。(この点ではVBに似てるかな)

Qdelphiにて 文字列の最後の改行を取り除く

S :=TStringList.Create;
で読みこんだテキスト S.Textの文字列の末尾に一個もしくは複数個の改行#13#10があった場合に取り除きたいのですが、
その方法がいまいちよくわかりません。

ずばり方法、アドバイス、tipsのサイトなど、
教えていただけないでしょうか?

Aベストアンサー

こんにちは、honiyonです。

 すいません、質問を見落としていました。
 そうしますと、以下のような処理になるでしょうか。

function HOGE(S:string):string;
var
i : integer;
begin
for i:=length(S) downto 1 do begin
if not (S[i] in [#13,#10]) then break;
end;
Result := LeftStr(S, i);
end;

テストしていないので不具合あるかも知れませんが、だいたいこんな感じだと思います。

QDelphiのマルチスレッドの割り込み処理について

Delphiのマルチスレッドの割り込み処理について教えて欲しいのですが、ファイルをスレッドオブジェクトで作成して
クラス名.Execute関数内でSynchronizeメソッドを使用しています。
本にはSynchronizeメソッドは「渡したメソッドが実行され終了するまで待ちます」と書いてあり、テストプログラムを作成してもそうでした。ということはSynchronizeメソッドは普通の関数と一緒のような気がしてしまうのですが、違うのでしょうか?
Procedure MyThread.Execute
begin
Synchronize(AAA); AAAの処理が終了するまで待機している
end;
Procedure TmyThread.AAA;
begin
'したい処理'
end;

Aベストアンサー

実際にプログラムを作って試した訳ではありません。見当違いでしたらすみません。

BDS2006のヘルプを見たところ、SynchronizeメソッドはDelphiの中で唯一つしかないメインVCLのスレッドを使うための方法です。すなわちスレッド間の競合の問題を「簡単に」解決する方法です。

ですから、'したい処理' 全体をSynchronizeで呼び出すのではなく、基本的には 'したい処理' はExecute内に書き、その中の競合する部分だけを切り出してSynchronizeで呼び出すようにします。

例えば、DelphiのDemoフォルダ下にあるThreadsプログラムは、PaintBoxを書き換える処理だけを切り出してSynchronizeで呼び出しています。配列に関しては各スレッドで独立しているため勝手に書き換えています。

また、競合を回避するには、TCriticalSectionクラスを使う方法もあります。'したい処理' はExecute内に書き、その中の競合する部分だけをEnter-Leaveではさむようにします。

Qデルファイ TabControl タブの追加

ターボデルファイです。

TabControlをフォームに置いたのですが、デフォルトはタブ1枚でみたいで、タブの追加はどうするのでしょか?
ヘルプファイルには、個別のタブは「TabPage オブジェクト」とありますが、これがどこにあるかわかりません。
「TabControl の主要プロパティは TabPages 」ともありますが、これもどこにあるのか、見当たりません。

Aベストアンサー

タブの切り替えで各タブページごとに載せるコンポーネントを替えるには、
TabControlではなく、多分その横にあるPageControlを使います。
PageControlをフォーム上に配置して右クリックするとメニューで新規のタブシートコンポーネントが作れます。
あとは、この各タブシートに好きなコンポーネントを載せていけば良いわけです。

QDelphiの型変換について教えてください

DelphiからRubyプログラムを起動するには
ShellExecuteを使えばいけそうなことがわかったのですが、コンパイルでエラーが出ます。

ShellExecute(Handle,'open'、'xxx.rb',OpenDialog1.FileName,syori,SW_SHOWNORMAL)としたのですが
TFileNameとPAnsiCharには互換性がありませんとエラーが出ます。
どんな関数を使って変換すればいいのでしょうか?

Aベストアンサー

私の知識不足のためにお手間かけさせてすみませんでした。
(バージョン間の差異についての常識を把握できていないもので。)

結論としては、普通にPCharでキャスト(型変換)すればOkです。
ShellExecute(Handle, 'open', 'xxx.rb', PChar(OpenDialog1.FileName), PChar(syori), SW_SHOWNORMAL);

よく分からなかったのは、"PAnsiChar"とエラーが出たことです。(それとバージョン不明)
Delphi6ですと、宣言内容と一致する「'TFileName' と 'PChar' には互換性がありません」と出ます。


お手間のおわびにちょっと解説します。

・ PChar(OpenDialog1.FileName), PChar(syori)
これらはPChar型です。OpenDialog1.FileNameはTFileName型ですが、これは TFileName = type string; と宣言されており、実質的にはString型です。syoriはおそらくString型ですよね。それぞれPChar()という形でキャストすることによりPChar型に出来ます。

・ 'open', 'xxx.rb'
これらもPChar型なので PChar('open'), PChar('xxx.rb') として良いのですが…、文字列リテラルの場合はコンパイラが適切に解釈し、宣言に合わせてPChar型と扱ってくれるので 'open', 'xxx.rb' のように省略できます。constで宣言する文字列定数でも同様です。

・ PChar型はヌルを終端とする文字列へのポインタ型です。C言語等で使われているものと同一です。DelphiではString型をPChar()という形でキャストすることにより、簡単にPChar型を得ることが出来ます。PChar型はAnsi Delphi(D2007以前)ではPAnsiChar型のエイリアス、Unicode Delphi(D2009以降)ではPWideChar型のエイリアスになります。

・ PAnsiChar型は内部がShift_JIS、ヌルはBYTE型の 0 です。
・ PWideChar型は内部がUnicode(UTF-16LE)、ヌルはWORD型の0(≒2byteの 0 0)です。

私の知識不足のためにお手間かけさせてすみませんでした。
(バージョン間の差異についての常識を把握できていないもので。)

結論としては、普通にPCharでキャスト(型変換)すればOkです。
ShellExecute(Handle, 'open', 'xxx.rb', PChar(OpenDialog1.FileName), PChar(syori), SW_SHOWNORMAL);

よく分からなかったのは、"PAnsiChar"とエラーが出たことです。(それとバージョン不明)
Delphi6ですと、宣言内容と一致する「'TFileName' と 'PChar' には互換性がありません」と出ます。


お手間のおわびにちょ...続きを読む

Qdelphiでの文字表示書式

delphiにて、以下のような書式設定はできるのでしょうか?

ゼロサプレス+カンマ表示+桁数固定での表示をさせたいと思っております。

例)数値データ → 変換後(6桁固定)
  「1000」    「 1,000」

簡単な方法はありますでしょうか?

Aベストアンサー

こんにちは。
こんな感じではどうでしょう?

var r: Currency;
begin
 r := StrToFloat(Edit1.Text);
 Edit2.Text := Format('%6.0n',[r]);
end;

↓こちらを参考にしました。
http://forum.nifty.com/fdelphi/faq/00149.htm

参考URL:http://forum.nifty.com/fdelphi/faq/00149.htm

QDelphi6 Delimiterの使い方

CSVファイルの処理で困っています。

ファイルから1行読んだ後、必要なカラムだけを
取得しようと思っています。

TStrings と DelimitedText を使って
カンマで分割してくれるのは便利なのですが、
どうも半角スペースでも分割してしまうようです。

Delimiterプロパティで ',' と指定してるはず
なのですが、空白も強制的に分割文字になって
しまうんでしょうか?

ソースのイメージとしては

Var SL: Tstrings;
で宣言して

begin
  ・・・
  readln(target, line); { 1行読み込み }
  SL := TStringList.Create;
  SL.Delimiter := ',';
  SL.DelimitedText := line;

とやった上で
SL[0]とかSL[1]とかで必要なカラムを取得しています。

宜しくお願いします。

Aベストアンサー

こんにちは、honiyonです。

 お礼ありがとうございます(..
 なるほど、CSV側が自動生成では、それに修正加えろ、というのは難しいかも知れませんね...(笑)
 では、やはりCommaTextに代わるものを自分で作成する必要があると思います。

 下記は何のエラーも想定していない基本的な独自処理のサンプルです。
 メモ帳で適当に書いた非テストコードなので、あくまで考え方の参考程度にお願いします(^^;
 また、半角カンマを含む文字列の処理は想定していませんのでご注意ください。

procedure SetCSV(var SL:TStringList; line:string);
var
  i : integer;
  ans : string;
begin
  i := 0;
  repeat
    if line[i] = ',' then begin  //カンマ文字発見
      SL.Add(ans);
      ans := '';
    end else begin //カンマ以外
      ans := ans + line[i];
    end;
    inc(i);
  until (length(line) < i);
end;

 このコードは、
  readln(target, line); { 1行読み込み }
  SL := TStringList.Create;
  SetCSV(SL,line);
 こんな風に使用します。

 参考になれば幸いです(..

こんにちは、honiyonです。

 お礼ありがとうございます(..
 なるほど、CSV側が自動生成では、それに修正加えろ、というのは難しいかも知れませんね...(笑)
 では、やはりCommaTextに代わるものを自分で作成する必要があると思います。

 下記は何のエラーも想定していない基本的な独自処理のサンプルです。
 メモ帳で適当に書いた非テストコードなので、あくまで考え方の参考程度にお願いします(^^;
 また、半角カンマを含む文字列の処理は想定していませんのでご注意ください。

procedure Set...続きを読む

QDelphiでキー入力を投げたい

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox(LP).Items.AddObject(Buff, Pointer(WH));
Result := True;
end;

次に、ListBoxを用意して、以下を実行しました。
EnumWindows(@CallBackTest, Longint(ListBox1));
ListBoxには実行中のウインドウタイトルが表示されます。そこで、目的のウインドウ名を選択して

for i := 0 to (ListBox1.Items.Count - 1) do
if ListBox1.Selected[i] then
PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
end;

こんな感じで投げられるかな?と思ったのですが、悲しいほど無反応。
なにか根本的にやり方を間違えているのでしょうか・・・?

ゲームコントローラに対応していないソフトウェアを、コントローラに対応させるべくプログラムを組んでいます。
Delphiのプログラムでコントローラからの入力を受け取り、該当するウインドウにメッセージを送信すればこの仕組みが実現できると考えたのです。

まず、以下の関数を記述しました。

function CallBackTest(WH: HWND; LP: LParam): BOOL stdcall;
var
Buff: array [0..255] of Char;
begin
if IsWindowVisible(WH) then
if GetWindowText(WH, Buff, 255) <> 0 then
TListBox...続きを読む

Aベストアンサー

コードを試しました。WindowハンドルをAddObjectで記憶していますので下記は修正しました。

【修正前】PostMessage(hwnd(listbox1.Items[i]), WM_KEYDOWN, 入力キー名, 0);
【修正後】PostMessage(hwnd(listbox1.Items.Objects[i]), WM_KEYDOWN, {入力キー名} 48, 0);

この修正を加えたら、秀丸エディタには文字0を入力できました。しかし、メモ帳やワードパッドには入力できませんでした。

ウィンドウとメッセージについて調べて試す必要があると思います。EnumWindowsはトップレベルのウィンドウしか探しません。目的のアプリケーションがトップレベルのウィンドウにWM_KEYDOWNを送って反応するものかどうか。子ウィンドウあるいは別のメッセージにしたらどうか、フォーカスをあてたらどうか、など。

Q「読み込み違反」が起きたときのデバッグ方法

たとえば、Metasequoiaさんのページにありますように、読み込み違反が発生しプログラムが停止したとき「”main.exe”のアドレスXXXXXXでYYYYYYに対する読み込み違反が発生しました。」などどいうメッセージが出ることがあります。

http://www.metaseq.net/metaseq/bbs.html

まれに、このアドレスをメモしておいて、報告してほしいという開発者さんを見かけます。例えば、上記Metasequoiaさんの場合もそうです。

例えば、VC++やBorland、GCCなどで開発している場合、このアドレスからいかにしてデバッグするのでしょうか?「私はこうしてる」などと言ったお話が聞ければと思い質問させていただきました。

よろしくお願いします。

Aベストアンサー

そういう情報を元にしたデバッグにはデバッガを使います。
VC++とかの統合環境ならデバッガを内蔵してるし、gccを使ってるならgdbで。

「アドレスXXXXXXで」の方の値は、実行している命令のアドレスを示しています。これは、同じプログラムであれば、ユーザー環境でも開発環境でもどこで実行しても同じになります。
ですから、開発側でデバッガを使うことで「どの関数のどの文を実行している時にエラーが発生したのか」がわかります。

「YYYYYYに対する読み込み違反」の方の値はデータアドレスなのですが、こちらは実行条件によって値が変わってきます。そのため、ユーザーの環境をそのまま開発環境に再現することはできません。
ですが、「00000000」とか「FFFFFFFF」とかの特徴的な値が出てきたとしたら、そこからコード上の問題を追及できる可能性はあります。

QDelphiの型変換

わけあって、Array of charとStringを相互に変換したいのですが、方法はありますでしょうか。
stringは1文字なのですが、charとの変換がどうしても上手くいきません。
よろしくお願いします。

x : string;
y : array [0..79] of char;

x := 'A';
y[0] := x; みたいなコトをしたいのですが・・・。

Aベストアンサー

String -> Array of Charの変換は、StrPCopy()でできます。
ご質問の例だと
 StrPCopy(y,x);
のような感じにすると、xの文字列がyの配列にコピーされます。

逆に、Array of Char -> Stringに変換するには、StrPas()を使います。
 x:=StrPas(y);

詳しくは、この2つの関数をヘルプで見ればおわかりになると思います。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報