Labelに縦書きフォントを表示するには?

解決


Uga  2004-07-25 00:26:48  No: 10066  IP: [192.*.*.*]

LabelのCaptionの内容を縦書きで表示させたいのですが、どのようにすればいいのでしょうか。ご教授お願いします。

編集    削除
Mr.XRAY  URL  2004-07-25 08:14:40  No: 10067  IP: [192.*.*.*]

Labelは確かCanvasをもっていたはずです.
そのCanvasに縦書きで文字列を描画するというのはどうでしょうか.

参考URL
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N003.html

編集    削除
Uga  2004-07-25 09:52:27  No: 10068  IP: [192.*.*.*]

なるほど。確かにこの方法なら、縦書き表示が出来ますね。Mr.XRAYさん、ありがとう御座いました。
ちなみに、Canvasを使わずにLabelで縦書き表示させたいというのは無理な話でしょうか?素人同然な者ですみませんが、是非教えて下さい。

編集    削除
TtPIPICH  2004-07-26 01:05:49  No: 10069  IP: [192.*.*.*]

フォームをエディタで表示し改行コードを加えれば一応できます

編集    削除
Uga  2004-07-26 06:00:23  No: 10070  IP: [192.*.*.*]

見事に縦書きになりました。TtPIPICHさん、ありがとう御座いました。

編集    削除
Mr.XRAY  URL  2004-07-26 06:59:17  No: 10071  IP: [192.*.*.*]

前出のコードを参考に,制限付きですが,コンポーネントにしてみました.
もし,後で縦書きを使用する予定があるなら,Canvasへのコードや改行コー
ドを挿入するよりは,楽かも知れません.
Delhian Worldにも同様のコンポーネントがあるかも知れませんが...

以下のコードをplLabel.pasの名前で保存し,plLabel.pasをコンポーネント
としてインストールしてみて下さい.
必要であれば,コンポーネント名などを変更して下さい.


{$WARNINGS OFF}
//====================================================================
//  縦書き横書き両用ラベルコンポーネント
//
//  TLabelを継承したラベル
//  縦書きの場合,ShowAccelCharの設定は無効(常にFalseと同じ)
//  WordWrapも無効
//  当然英数字も縦書きになるので注意
//
//  追加プロパティ
//  Vertical  Trueで縦書き,FalseならTLabelそのもの
//
//                            2004.07.25  Ver.1.0   
//                            HGH03072@nifty.ne.jp Mr.XRAY
//                            http://homepage2.nifty.com/Mr_XRAY/
//====================================================================
unit plLabel;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls,StdCtrls;

type
  TplLabel = class(TLabel)
  private
    { Private 宣言 }
    FVertical : Boolean;
    procedure SetVertical(const Value: Boolean);
  protected
    { Protected 宣言 }
    procedure Paint; override;
  public
    { Public 宣言 }
    constructor Create(AOwner: TComponent); override;
  published
    { Published 宣言 }
    property Vertical : Boolean read FVertical write SetVertical;
  end;

//====================================================================
//  コンポーネント登録情報
//====================================================================
procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('plXRAY', [TplLabel]);
end;

{ TplLabel }

//====================================================================
//  Create処理
//====================================================================
constructor TplLabel.Create(AOwner: TComponent);
begin
     inherited Create(AOwner);
end;
//====================================================================
//  横書きか縦書きの設定
//====================================================================
procedure TplLabel.SetVertical(const Value: Boolean);
begin
     if Value<>FVertical then begin
       FVertical:=Value;
       Invalidate;
     end;
end;
//====================================================================
//  描画処理
//  DrawTextではなくTextOutを使用して描画しているための制限はあるが,
//  通常の用途には十分と考える
//====================================================================
procedure TplLabel.Paint;
var
     fMode: Integer;
     LF: TLogFont;
     PosX,PosY: Integer;
begin
     {縦書きの時の処理}
     if FVertical then begin
       with Canvas do begin
         {背景色}
         if not Transparent then begin
           Brush.Color := Self.Color;
           Brush.Style := bsSolid;
           FillRect(ClientRect);
         end;
         Brush.Style := bsClear;

         {縦書きフォント作成}
         Font.Assign(Self.Font);
         Font.Name :='@'+Self.Font.Name;
         GetObject(Font.Handle,SizeOf(LF),@LF);
         LF.lfEscapement := -900;
         Font.Handle := CreateFontIndirect(LF);

         {AutoSizeがTrueの場合}
         if AutoSize then begin
           SetBounds(Self.Left,Self.Top,TextHeight(Caption),TextWidth(Caption));
         end;

         fMode:=0;
         PosX:=0;
         PosY:=0;
         {横方向の位置揃え}
         if Alignment=taLeftJustify  then fMode:=fMode or VTA_LEFT;
         if Alignment=taCenter       then PosX:=(Width+TextHeight(Caption)) div 2;
         if Alignment=taRightJustify then begin
           PosX:=Width;
           fMode:=fMode or VTA_RIGHT;
         end;
         {縦方向の位置揃え}
         if Layout=tlCenter then PosY:=(Height-TextWidth(Caption)) div 2;
         if Layout=tlTop    then fMode:=fMode or VTA_TOP;
         if Layout=tlBottom then begin
           PosY:=Height;
           fMode:=fMode or VTA_BOTTOM;
         end;
         {アライメントの設定}
         SetTextAlign(Canvas.Handle,fMode);

         if not Enabled then begin
           Font.Color := clBtnHighlight;
           TextOut(PosX+1,PosY+1,Caption);
           Font.Color := clBtnShadow;
         end;
         TextOut(PosX,PosY,Caption);
       end;
     {横書きの時は継承元の処理を実行}
     end else begin
       {AutoSizeがTrueの場合}
       if AutoSize then begin
         SetBounds(Self.Left,Self.Top,Canvas.TextWidth(Caption),Canvas.TextHeight(Caption));
       end;
       inherited;
     end;
end;

end.

編集    削除
Uga  2004-07-26 19:10:49  No: 10072  IP: [192.*.*.*]

すみません。
Delphi7だとインストールしてコンパイルする時に「ファイル'plLabel.dcu'が見つかりません」とエラーが出てしまいます。
Delphi6では普通にインストールできました。
同じ方法でインストールしているはずなのに何故このようなことになるのでしょうか?Delphi7では無理なのでしょうか?
(インストールの方法はMr.XRAYさんのHPで紹介した通りにしました。大変分りやすかったです。ありがとう御座います。)

編集    削除
Mr.XRAY  URL  2004-07-26 22:01:29  No: 10073  IP: [192.*.*.*]

>Delphi7では無理なのでしょうか?

多分,Delphi7では,plLabel.pasが入っているフォルダに
パスが通っていないのかも知れません.

編集    削除
Uga  2004-07-27 02:14:33  No: 10074  IP: [192.*.*.*]

返信遅くなってすみません。
たぶんパスは通せていると思うのですが成功しません。
何か他に悪いことがあるのでしょうか?

編集    削除
Mr.XRAY  URL  2004-07-27 09:33:23  No: 10075  IP: [192.*.*.*]

>Delphi7だとインストールしてコンパイルする時に「ファイル'plLabel.dcu'が見つかりません」とエラーが出てしまいます。

通常のインストールでは,エラーが発生することは考えられません.
(Delphu5,6,7で同じパスにあっても共用できます)

以下の手順で再インストールしてみて下さい.
(1) Delphi7を起動
(2) [コンポーネント][パッケージのインストール]
    以下,私のHPの説明にしたがって,plLabelがリストにあれば削除

(3) Delphi7を終了
(4) エクスプローラなどで,plLabel.dcuがあれば削除
(5) Delphi7を起動して,plLabel.pasをコンポーネントとしてインストール

[注意]
インストールするのは,plLabel.dcuでありません.
plLabel.pasです.
ソースコードがないコンポーネントでは拡張子がdcuのものをインストール
しますが,この場合,サポート以外のDelphiのバージョンでは使用できません.

もし,これでダメなら私にはわかりません.
しつこいようですが,コンポーネントとしてインストールするにはplLabel.pasです.
試しに,Delphi5でインストールした時にできたplLabel.dcuをインストール
したらUgaさんと同様のエラーが発生しました.

編集    削除
Uga  2004-07-27 19:19:25  No: 10076  IP: [192.*.*.*]

成功しました。plLabel.dcuを削除してインストールしたらうまくいきました。
本来の質問に関係ないことを長々と聞いてしまって大変申し訳ないなと思っています。
Mr.XRAYさん、本当にありがとう御座いました。

編集    削除