Delphi10を使っています。
プロジェクト-->言語-->追加から英語と日本語を追加して各コンポーネントのキャプション等を多言語化できるようになったのですが、
プログラム中の多言語化をすることができません。
(たとえば、StatusBar1.Panels[0].Text := '実行中';を英語化)
XXX_DRC.rcファイルを修正するのかと思ったのですが、これではないようです。

質問者からの補足コメント

  • うーん・・・

    回答ありがとうございます。

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/11/27 12:09

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

A 回答 (1件)

Delphi は使ったことがないのでわからないのですが、一般的にはメッセージ文字列を定数化して、その定数に対する複数言語の文字列をリソースとして持っておくもんではないでしょうかね。



http://docwiki.embarcadero.com/RADStudio/XE8/ja/ …
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。
implementation
resourcestring
Status1 = '実行中';
//------
StatusBar1.Panels[0].Text := Status1;
という感じでトランスレーションエディタにも表示されるようになりました。
でも、動作確認はどうやったらいいんでしょうか?

お礼日時:2015/11/27 09:50

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

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

この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のマルチスレッドの割り込み処理について

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ではさむようにします。

Qdelphi 画面のちらつき

delphi6です
imageに描画する時、ちらつきがでます。
doublebufferdを設定すると良いみたいなんですが、コードの記述のしかたがわかりません。
どなたかお救いを・・・

Aベストアンサー

こんにちは。

失礼しました。TImage は TWinControl から派生したクラスではないので DoubleBuffered プロパティは使えませんね。

なるほど、やりたいことはよくわかりました。というか、私も同じようなことをやっています。

私は C++Builder を使用していますが、概念は一緒です。
まず、TScrollBox を配置し、その中に TImage と TPaintBox を配置します。TImage には画像を読み込んで表示し、その上に重なるように置いた TPaintBox で作図機能を実装します。マウスによる作図機能は、 TPaintBox の OnMouseDown, OnMouseMove 等のイベントで処理します。
で、実際に DoubleBuffered を設定するのは、TScrollBox のほうです。やりかたは、先の回答と同じで、ScrollBox1.DoubleBuffered := true です。

situmonnsya さんの Image2 に該当するのが TPaintBox となりますが、TPaintBox での描画内容は便宜 Bitmap や Jpeg 等に出力できるので、この方法で問題ないでしょう。あと、注意事項としては、TPaintBox の中身を FillRect 等で塗りつぶさないことです。確実にチラつきます(経験則です)。

こんにちは。

失礼しました。TImage は TWinControl から派生したクラスではないので DoubleBuffered プロパティは使えませんね。

なるほど、やりたいことはよくわかりました。というか、私も同じようなことをやっています。

私は C++Builder を使用していますが、概念は一緒です。
まず、TScrollBox を配置し、その中に TImage と TPaintBox を配置します。TImage には画像を読み込んで表示し、その上に重なるように置いた TPaintBox で作図機能を実装します。マウスによる作図機能は、 TPaintBox の O...続きを読む

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;

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

Q[delphi] 変数を利用してコンポーネント名指定したいのですが、可能でしょうか?

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

※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;

よろしくお願いします。

Aベストアンサー

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

for i := 1 to 3 do
begin
TLabel(FindComponent('Label'+InttoStr(i))).Caption:=InttoStr(i);
end;

Qdelphi 2次元配列がわかりません

将棋盤の様な9×9マスの配列宣言を
a1 : array[1..9, 1..9] of Integer ;とした場合、a1に値を
代入するにはどんな式が考えられますか?
a1 : array [1..9] of integer = (394,448,502,556,612,664,721,774,827); みたいに直接括弧内で
代入も可能でしょうか?

超初心者で頭の中で混乱してしまいます。
どなたかお助け下さい。

Aベストアンサー

しばらくさわってないので、忘れたが、2次元なんだから、入れ子2次元で初期化出来なかったかな?
実際には、いちいちデータを書き込むのは面倒だから、大概forループで回して、0とか入れていたんで以下のコードは未検証。

a1 : array [1..3,1..9] of integer =( (394,448,502,556,612,664,721,774,827)
,(1,2,3,4,5,6,7,8,92)
,(1,2,3,4,5,6,7,8,93)
);

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セマフォとmutexの違いは?

排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。

と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

Aベストアンサー

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)

ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。

ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む

Q(Delphi)ESCキーでWindowを閉じたい

TFormにTmemoが張り付けてあるだけのメモ帳を作り、
ESCキーを押すだけで終了できるようにしたかったのですが、
情報がなくて困っています。
1),Escキーの識別方法がわかりません。
Form上でKeypressを拾えばいいのかと思ったのですが、そもそもESCキーはどのように
識別させたらよいのでしょうか??
ヘルプにESCキーという項目があるのですが期待するような内容ではなくがっかりしました。
2)procedure節を任意に呼べるのか
Formをクローズする際にある処理をしているので、できればFormCloseのprocedure節を呼べると良いと思うのですが、Delphiでこういうことはできるのでしょうか?

よろしくお願いいたします。

Aベストアンサー

{$R *.dfm}より下をかきます。

procedure TForm1.FormCreate(Sender: TObject);
begin
KeyPreview := True;

end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=VK_ESCAPE then form1.Close;
end;

end.

ESCは仮想キーで VK_ESCAPE をつかいます。
かたは、WORD で、keyup をつかいます。

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&Aランキング