LabelのCaptionの内容を縦書きで表示させたいのですが、どのようにすればいいのでしょうか。ご教授お願いします。
編集 削除Labelは確かCanvasをもっていたはずです.
そのCanvasに縦書きで文字列を描画するというのはどうでしょうか.
参考URL
http://homepage2.nifty.com/Mr_XRAY/Halbow/Notes/N003.html
なるほど。確かにこの方法なら、縦書き表示が出来ますね。Mr.XRAYさん、ありがとう御座いました。
ちなみに、Canvasを使わずにLabelで縦書き表示させたいというのは無理な話でしょうか?素人同然な者ですみませんが、是非教えて下さい。
フォームをエディタで表示し改行コードを加えれば一応できます
編集 削除見事に縦書きになりました。TtPIPICHさん、ありがとう御座いました。
編集 削除前出のコードを参考に,制限付きですが,コンポーネントにしてみました.
もし,後で縦書きを使用する予定があるなら,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.
すみません。
Delphi7だとインストールしてコンパイルする時に「ファイル'plLabel.dcu'が見つかりません」とエラーが出てしまいます。
Delphi6では普通にインストールできました。
同じ方法でインストールしているはずなのに何故このようなことになるのでしょうか?Delphi7では無理なのでしょうか?
(インストールの方法はMr.XRAYさんのHPで紹介した通りにしました。大変分りやすかったです。ありがとう御座います。)
>Delphi7では無理なのでしょうか?
多分,Delphi7では,plLabel.pasが入っているフォルダに
パスが通っていないのかも知れません.
返信遅くなってすみません。
たぶんパスは通せていると思うのですが成功しません。
何か他に悪いことがあるのでしょうか?
>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さんと同様のエラーが発生しました.
成功しました。plLabel.dcuを削除してインストールしたらうまくいきました。
本来の質問に関係ないことを長々と聞いてしまって大変申し訳ないなと思っています。
Mr.XRAYさん、本当にありがとう御座いました。