縦書き文字列に対応するVCLはあるでしょうか

解決


さる  2009-08-29 21:46:05  No: 35530

D2006(Xp,Sp3)で作業しているんですが、
(同時にD2010のトライアル版も試用中)

フォームやパネルに縦書きの文字を配置できるVCLはあるでしょうか。
Labelで出来そうな感じなんですが、上手く出来ません。
コードでCanvas上に補完するしかないでしょうか。


igy  2009-08-30 02:06:45  No: 35531

Labelに縦書きフォントを表示するには?
https://www.petitmonte.com/bbs/answers?question_id=1873
は、いかがですか?


さる  2009-08-30 02:38:20  No: 35532

igyさん、ありがとうございます。
過去のレスを良く調べずに投稿してしまいました。

やはり、ダイレクトに使える縦書き対応のVCLは無いんですね。

尊敬するMr.XRAYさんの
http://mrxray.on.coocan.jp/Halbow/Notes/N003.html
でも書かれている便利なTLogFont、これがやはり、一番ですね。

解決です。


古いソース  2009-08-30 02:55:11  No: 35533

既に解決済ですが...
以前どこからか貰ったものに少し手を加えたもので
シンプルなソースになっていますので不要かも知れませんが
良ければどうぞ。

先にフォームに PaintBoxを貼ります。

  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    SpeedButton1: TSpeedButton;

//---------------------------------------------
type
  Canvas_P  = ^TCanvas ;

  VFStrOut_ = record
    FAngle  :integer ;   // 角度  2700=縦書
    FCol    :integer ;   // 文字色
    FColBK  :integer ;   // 文字背景色
    FStyle  :integer ;   // 1=BOLD    0=Normal
    FItalic :integer ;   // 1=Italic
    Fsize   :integer ;   // 9-99
    Fname   :string ;    // フォント名
    Pcvas   :Canvas_P ;  // canvas
    FposX   :integer ;   // 座標
    FposY   :integer ;   //
    outstr  :string ;    // 出力文字
  end ;

//---------------------------------------------
// Canvas上に文字縦書きルーティン
procedure CVStrOut(VFStrOutX:VFStrOut_) ;
var
  LogFont1 : TLogFont ;
begin
  with VFStrOutX do begin
    with LogFont1 do begin
      lfHeight       := Fsize ;
      lfWidth        := 0 ;
      lfEscapement   := FAngle ;
      lfOrientation  := 0 ;
      lfWeight       := FW_NORMAL ; // FW_BOLD ;  FW_NORMAL
      lfItalic       := 0 ;   // 1=on  0=off
      if FStyle=1  then lfWeight := FW_BOLD ;
      if FItalic=1 then lfItalic := 1 ;
      lfUnderline    := 0 ;
      lfStrikeOut    := 0 ;
      lfCharSet        := DEFAULT_CHARSET ;
      lfOutPrecision   := OUT_DEFAULT_PRECIS ;
      lfClipPrecision  := CLIP_DEFAULT_PRECIS ;
      lfQuality        := DEFAULT_QUALITY ;
      lfPitchAndFamily := DEFAULT_PITCH ;
      StrPCopy(lfFaceName,Fname) ;  // '@MS ゴシック'
    end;
    with Pcvas^ do begin
      Font.Handle   := CreateFontIndirect(LogFont1) ;
      Font.Color    := clBlue ;
      Brush.Style   := bsClear ;
      TextOut(FposX,FposY, outstr ) ;
    end;
  end;
end;

//------------------------------------------
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  VFStrOut : VFStrOut_ ;
begin
  with VFStrOut do begin
    FAngle  :=2700 ;   // 角度
    FCol    :=clBlue ; // 色
    FStyle  :=1 ;
    FItalic :=0 ;
    Fsize   :=26 ;
    Pcvas   :=@PaintBox1.canvas ;
    Fname   :='@MS ゴシック' ;
    FposX   := 100 ;
    FposY   := 10 ;
    outstr  :='東京都港区12312345' ;
  end ;
  CVStrOut(VFStrOut) ;
end;


さる  2009-08-30 04:20:45  No: 35534

少し考えたら、TLogFont を使わずにLabelで可能でした。
まず、LabelのFontを設計時、日本語で縦書き(@MSPゴシックなど)を
選び、 コードでLabelを回転させるだけです。

  Label1.Font.Orientation := -900;

これだけで縦書きで表示出来ました。
この時Label1の
AutoSize := False;にして、
縦書きにする分Label1のCanvas(大きさ)を縦長にして、
Alignmentを右にしておけばおよそ完成です。


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

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






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