textoutで改行するためには?

解決


ごりのぶ  2012-12-25 09:59:29  No: 43541

textoutで2行の文章を打つことは可能でしょうか?
2つtextoutを用意するかlabelで描くしか無いんでしょうか?


Mr.XRAY  2012-12-25 21:16:57  No: 43542

こんにちは.

「文章を打つこと」が目的なのでしょうか ?
でしたら,次のようにしてみてください.

(1) 新規のプロジェクトを作成
(2) コンポーネントパレットの[Standard] タブの TMemo をフォームに配置
    または,[Win32] タブの TRichEdit をフォームに配置
(3) [F9] を押下して実行

これで,TMemo または TRichEdit に何行でも「文章を打つ」ことができます.
Delphi と Windows のバージョンによっては,制限はあります.
TMemo, TRichEdit は,多分, Personla 版,Starter 版にもあると思います.

「文章を打つ」のではなく,もしかしたら...


Mr.XRAY  2012-12-25 21:46:46  No: 43543

>「文章を打つ」のではなく,もしかしたら...

TCanvas に TextOut というのがあります.
これは文字列を TCanvas に描画するためのメソッドです.
「入力用のコントロール」ではありません.

一方,TMemo や TRichEdit は,文章や文字列を入力したり,打ったりするための
コントロールです.
TMemo や TRichEdit にも,Canvas があります.したがって,この Canvas に直接
文字列を描画することもできます.
DrawText や DrawTextEx を使用すれば,複数行のテキストも描画できます.


  2012-12-25 22:08:41  No: 43544

改行を含めてTextOutしても1行になって出てくるのであれば、
ご指摘の通りかと。


ごりのぶ  2012-12-26 09:51:34  No: 43545

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

文章を打つって言い方が誤解を招いてしまったようです
TextOut(x,y,'abc'+改行コード+'def');
とソースプログラムを書いて

abc
def

とのように出力する方法(改行コード)が知りたいです。


  2012-12-26 15:03:42  No: 43546

そこまで来てるなら、検索して調べてみましょう。
Googleで、delphi 改行コード、と入れると答えがすぐ出てきますよ。


RAD命  2012-12-26 19:25:28  No: 43547

canvas.TextOut(50,50,'aaa'+ chr(13)+ 'bbb');

chr(13)が改行コードになります。

ただ、Textoutでは、こちらの環境(D3)では改行できませんでした。


RAD命  2012-12-26 19:59:06  No: 43548

//一応書いてみました。
//以下でどうでしょうか?
//即興なので、使うにはまだ不便な箇所が多数ありますが^^;

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;


KHE00221  2012-12-26 20:36:13  No: 43549

>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


au  2012-12-26 22:57:56  No: 43550

VCLで書くならTCanvasのTextRectの一番目の定義の方を使うと同じ
http://docwiki.embarcadero.com/Libraries/XE3/ja/Vcl.Graphics.TCanvas.TextRect


Mr.XRAY  2012-12-27 00:25:52  No: 43551

こんにちは,

>textoutで2行の文章を打つことは可能でしょうか?

ハッキリしたレスをしたなかったので,誤解があるようですので,
この textout は,TCanvas の textout メソッドと仮定してのことです.

>改行を含めてTextOutしても1行になって出てくるのであれば、
>ご指摘の通りかと。

というレスの通り,「可能ではありません」つまり.できません.
複数行の文字列を,TCanvas に描画したい,というのであれば,
これも既にレスがあるように,他の方法があります.
Delphi のバージョンによっては,専用の関数 (メソッド) があります.

それと,

>文章を打つって言い方が誤解を招いてしまったようです

ですが,誤解ではないと思いますよ.単に用語の使い方が間違っている
だけだと思いますよ.
ネット上で検索する時に,意味が違う用語や単語で検索しても,必要な
情報は得られません.用語や単語は大切です.
同じ用語や単語を,別の意味として解釈している人が会話すると,会話に
なりません.これは,漫才等で利用される手法ですね.

ここは2チャンネルではありません.
カッコつけないで,ふつーの用語や言葉を使えばいいと思いますよ.

もっとも,言葉も生き物です.時代と共に,その意味が変わるものです.
将来は,textout で文字列を描画することを「文章を打つ」と言うように
なるかも知れません.かどうかは不明です(笑)


初心者?  2012-12-27 00:34:14  No: 43552

>RAD命さん
失礼を承知で申しますが、これは人に勧められるレベルのコードではないかと…。
関数の設計に目を瞑ったとしても、何を示しているかわからない変数名、
必要な量を確保せず適当な固定値で配列を確保してしまう等、
プログラミングの教科書で悪い例として示されているもののオンパレードです。
ボランティアで質問に回答するという姿勢は素晴らしいと思いますが、
初心者が初心者に説明をすると誤解を生むことも多いのではないでしょうか。


  2012-12-27 02:04:19  No: 43553

単に使い方を示すだけなら、
↓くらいでもいいかもしれませんね。

begin
  Form1.Canvas.TextOut(0, 0, 'あいうえお');
  Form1.Canvas.TextOut(0, 20, 'かきくけこ');
end;

  ただ、今回は質問者はTextOutの基本的な使い方は分かっているという前提の
質問の書き方をしているので、回答としては、「2行に分けたければ2回
実行するしかない」といった答え方をするか、代替案であるDrawText等の
要素部分のコードを提示すべきで、TextOutの冗長なコードは逆に理解を
妨げることになるかもしれません。

  私はこのようなコードを具体的に提示することはめったにありませんし、
RAD命様のお心遣いは非常に尊敬しておりますが、関数に戻り値が設定
されていない(Result変数がない)など、基本的なところで誤りも見られ、
場合によっては質問者をひどく混乱させてしまうおそれもあるのではないか
と思いました。そのボランティア精神はぜひ維持されつつ、ポイントを
押さえて正確な回答を書き込んでいただくことができれば、この掲示板で
貴重な指導者の1人になっていただけるのではないかと思います。ぜひお気
を悪くされず、今後とも皆様への支援を続けていただきたいと思います。

※参考までに、私が具体的なコードを提示するときは、実際に稼働したもの
  をIDEのエディタからコピー・ペーストするようにしています。


Mr.XRAY  2012-12-27 02:19:45  No: 43554

こんにちは,

RAD命 さんのサンプルですが,審問者が,

>canvas.TextOut(50,50,'aaa'+ chr(13)+ 'bbb');

>chr(13)が改行コードになります。

と書いていますから,最初から文字列が複数あるのではなく,
どちらかというと,以下のようなサンプルの方が近いのではと思われます.

なお,このサンプルは,当初の質問者の質問への解決となるものではありません.
質問の文章からは,少なくとも私には,具体的な,目的の動作仕様がわかりませんので.

[文字列を改行文字で分解する]
http://mrxray.on.coocan.jp/Others/StringLineBreak.htm


  2012-12-27 02:22:17  No: 43555

>関数に戻り値が設定されていない(Result変数がない)など、基本的なところで誤りも見られ、

この部分については訂正いたします。
気になって調べてみたのですが、文法上許容されていたのですね。
大変失礼いたしました。


Mr.XRAY  2012-12-27 02:37:10  No: 43556

>と書いていますから,最初から文字列が複数あるのではなく,
>どちらかというと,以下のようなサンプルの方が近いのではと思われます.

RAD命 さんの考え方を前面否定しているわけではありません.
質問された方正確な意図が分かりせんので.


ごりのぶ  2012-12-27 09:02:25  No: 43557

皆様の返答もあって
無事解決しました、ありがとうございます。

>Mr.XRAYさん
色々とご指摘ありがとうございます。
教えていただいた方法で試してみます。

>KHE00221さん、auさん
リンク参考になりました。

最後に僕の質問の書き方が曖昧なせいで
ご迷惑おかけしたことをお詫びします。


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

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






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