textoutで2行の文章を打つことは可能でしょうか?
2つtextoutを用意するかlabelで描くしか無いんでしょうか?
こんにちは.
「文章を打つこと」が目的なのでしょうか ?
でしたら,次のようにしてみてください.
(1) 新規のプロジェクトを作成
(2) コンポーネントパレットの[Standard] タブの TMemo をフォームに配置
または,[Win32] タブの TRichEdit をフォームに配置
(3) [F9] を押下して実行
これで,TMemo または TRichEdit に何行でも「文章を打つ」ことができます.
Delphi と Windows のバージョンによっては,制限はあります.
TMemo, TRichEdit は,多分, Personla 版,Starter 版にもあると思います.
「文章を打つ」のではなく,もしかしたら...
>「文章を打つ」のではなく,もしかしたら...
TCanvas に TextOut というのがあります.
これは文字列を TCanvas に描画するためのメソッドです.
「入力用のコントロール」ではありません.
一方,TMemo や TRichEdit は,文章や文字列を入力したり,打ったりするための
コントロールです.
TMemo や TRichEdit にも,Canvas があります.したがって,この Canvas に直接
文字列を描画することもできます.
DrawText や DrawTextEx を使用すれば,複数行のテキストも描画できます.
改行を含めてTextOutしても1行になって出てくるのであれば、
ご指摘の通りかと。
回答ありがとうございます
文章を打つって言い方が誤解を招いてしまったようです
TextOut(x,y,'abc'+改行コード+'def');
とソースプログラムを書いて
abc
def
とのように出力する方法(改行コード)が知りたいです。
そこまで来てるなら、検索して調べてみましょう。
Googleで、delphi 改行コード、と入れると答えがすぐ出てきますよ。
canvas.TextOut(50,50,'aaa'+ chr(13)+ 'bbb');
chr(13)が改行コードになります。
ただ、Textoutでは、こちらの環境(D3)では改行できませんでした。
//一応書いてみました。
//以下でどうでしょうか?
//即興なので、使うにはまだ不便な箇所が多数ありますが^^;
procedure TForm1.Button1Click(Sender: TObject);
var
i,i1,i2:integer;
s:array[0..255] of string;
function rttextout(x,y,i1:integer):boolean;
begin
i2 := 0;
i := 0;
try
while i < i1 do begin
canvas.TextOut(x,y+ i2,s[i]);
inc(i); i2 := 15;
end;
except
//失敗したらfalse
rttextout := false;
end;
//成功したらTrue
rttextout := true;
end;
begin
s[0] := 'aaa';
s[1] := 'bbb';
rttextout(50,50,2);
end;
>2つtextoutを用意するかlabelで描くしか無いんでしょうか?
それじゃ上に対して はい になるだろ?
>DrawText や DrawTextEx を使用すれば,複数行のテキストも描画できます.
はこれ
DrawText
http://msdn.microsoft.com/ja-jp/library/cc428474.aspx
DrawTextEx
http://msdn.microsoft.com/ja-jp/library/cc428478.aspx
VCLで書くならTCanvasのTextRectの一番目の定義の方を使うと同じ
http://docwiki.embarcadero.com/Libraries/XE3/ja/Vcl.Graphics.TCanvas.TextRect
こんにちは,
>textoutで2行の文章を打つことは可能でしょうか?
ハッキリしたレスをしたなかったので,誤解があるようですので,
この textout は,TCanvas の textout メソッドと仮定してのことです.
>改行を含めてTextOutしても1行になって出てくるのであれば、
>ご指摘の通りかと。
というレスの通り,「可能ではありません」つまり.できません.
複数行の文字列を,TCanvas に描画したい,というのであれば,
これも既にレスがあるように,他の方法があります.
Delphi のバージョンによっては,専用の関数 (メソッド) があります.
それと,
>文章を打つって言い方が誤解を招いてしまったようです
ですが,誤解ではないと思いますよ.単に用語の使い方が間違っている
だけだと思いますよ.
ネット上で検索する時に,意味が違う用語や単語で検索しても,必要な
情報は得られません.用語や単語は大切です.
同じ用語や単語を,別の意味として解釈している人が会話すると,会話に
なりません.これは,漫才等で利用される手法ですね.
ここは2チャンネルではありません.
カッコつけないで,ふつーの用語や言葉を使えばいいと思いますよ.
もっとも,言葉も生き物です.時代と共に,その意味が変わるものです.
将来は,textout で文字列を描画することを「文章を打つ」と言うように
なるかも知れません.かどうかは不明です(笑)
>RAD命さん
失礼を承知で申しますが、これは人に勧められるレベルのコードではないかと…。
関数の設計に目を瞑ったとしても、何を示しているかわからない変数名、
必要な量を確保せず適当な固定値で配列を確保してしまう等、
プログラミングの教科書で悪い例として示されているもののオンパレードです。
ボランティアで質問に回答するという姿勢は素晴らしいと思いますが、
初心者が初心者に説明をすると誤解を生むことも多いのではないでしょうか。
単に使い方を示すだけなら、
↓くらいでもいいかもしれませんね。
begin
Form1.Canvas.TextOut(0, 0, 'あいうえお');
Form1.Canvas.TextOut(0, 20, 'かきくけこ');
end;
ただ、今回は質問者はTextOutの基本的な使い方は分かっているという前提の
質問の書き方をしているので、回答としては、「2行に分けたければ2回
実行するしかない」といった答え方をするか、代替案であるDrawText等の
要素部分のコードを提示すべきで、TextOutの冗長なコードは逆に理解を
妨げることになるかもしれません。
私はこのようなコードを具体的に提示することはめったにありませんし、
RAD命様のお心遣いは非常に尊敬しておりますが、関数に戻り値が設定
されていない(Result変数がない)など、基本的なところで誤りも見られ、
場合によっては質問者をひどく混乱させてしまうおそれもあるのではないか
と思いました。そのボランティア精神はぜひ維持されつつ、ポイントを
押さえて正確な回答を書き込んでいただくことができれば、この掲示板で
貴重な指導者の1人になっていただけるのではないかと思います。ぜひお気
を悪くされず、今後とも皆様への支援を続けていただきたいと思います。
※参考までに、私が具体的なコードを提示するときは、実際に稼働したもの
をIDEのエディタからコピー・ペーストするようにしています。
こんにちは,
RAD命 さんのサンプルですが,審問者が,
>canvas.TextOut(50,50,'aaa'+ chr(13)+ 'bbb');
>chr(13)が改行コードになります。
と書いていますから,最初から文字列が複数あるのではなく,
どちらかというと,以下のようなサンプルの方が近いのではと思われます.
なお,このサンプルは,当初の質問者の質問への解決となるものではありません.
質問の文章からは,少なくとも私には,具体的な,目的の動作仕様がわかりませんので.
[文字列を改行文字で分解する]
http://mrxray.on.coocan.jp/Others/StringLineBreak.htm
>関数に戻り値が設定されていない(Result変数がない)など、基本的なところで誤りも見られ、
この部分については訂正いたします。
気になって調べてみたのですが、文法上許容されていたのですね。
大変失礼いたしました。
>と書いていますから,最初から文字列が複数あるのではなく,
>どちらかというと,以下のようなサンプルの方が近いのではと思われます.
RAD命 さんの考え方を前面否定しているわけではありません.
質問された方正確な意図が分かりせんので.
皆様の返答もあって
無事解決しました、ありがとうございます。
>Mr.XRAYさん
色々とご指摘ありがとうございます。
教えていただいた方法で試してみます。
>KHE00221さん、auさん
リンク参考になりました。
最後に僕の質問の書き方が曖昧なせいで
ご迷惑おかけしたことをお詫びします。
ツイート | ![]() |