文字列の整列

解決


表裏 未里  URL  2008-08-19 10:52:26  No: 31559

文字列を綺麗に並べるにはどのようにすれば良いのか、教えて欲しく、投稿させて頂きます。

現在、Listboxにこのように並んでます。

10:00
田中一郎 様  カット  担当:鈴木次郎
パーマ  担当:田中四郎
シャンプー&ブロー
伊集院峰弘 様  パーマ  担当:佐藤三郎

現在上記のように並んでいる文字列を

10:00
田中一郎   様  カット                担当:鈴木次郎
               パーマ                担当:田中四郎
               シャンプー&ブロー
伊集院峰弘 様  パーマ                担当:佐藤三郎

のように並べる方法はないでしょうか?

これは、入力画面で顧客名、メニュー、担当とあるのですが、
3つの全てを入力しなくても良いように出来てます。
そのため、シャンプー&ブローだけでも入力が出来ます。
TStringGridのように綺麗に並べたいのですが、ご教授頂けると幸いです。


表裏 未里  URL  2008-08-19 10:56:52  No: 31560

このスレッドで教えて頂けると幸いです。どうぞよろしくお願いします。


Ru  2008-08-19 17:08:18  No: 31561

書式を整えるならFormat関数が使えませんか?
あとフォントはプロポーショナルフォントは使用せずに
等幅フォントを使用した方が良いでしょう。


monaa  2008-08-19 17:45:02  No: 31562

TListViewを使うという手は有?無?
TListboxっぽくふるまうことは可能です。
TListboxを使うなら私ならオーナードローを使いますね。


ttt  2008-08-19 19:28:47  No: 31563

TListBoxなら、TabWidth設定してタブ文字(#9)で区切ればいいんじゃないかな
列ごとに幅を変えたかったら自分でLB_SETTABSTOPSを送らないといけなさそうですけど


3K  2008-08-19 20:11:31  No: 31564

>>TStringGridのように綺麗に並べたいのですが、

と言うならば、TStringGridに入れTStringGridの枠を消すのはどうでしょうか


スコピョン  2008-08-19 22:44:03  No: 31565

単に文字列処理を行いたいってだけでは???
「様」、「担当:」の文字列をデリミタにしてスプリットしてスペースを付加して戻す。ってな感じでどうでしょう。
顧客名に「様」の文字があるならもう一工夫要るけど。


表裏 未里  URL  2008-08-20 10:50:41  No: 31566

Ru様,monaa様,ttt様,3k様,スコピョン様。ご意見ありがとうございます!
凄い助かります!  皆さんの意見を参考にやってみようと思います!
等幅フォントのことですが、MS Pゴシックではまずかったでしょうか?
PCを買ってすぐに入っているデフォルトのフォントが解りません。
等幅フォントでどのPCでも使えるフォントがあれば教えてください。
よろしくお願いします。


ワケ  2008-08-20 16:48:47  No: 31567

真琴:「このような場合は TListViewを使うのが普通じゃない? ハルコさん」
春子:「まぁネ、でもナニかTListBoxを使いたい特別なワケがあるのかも、それで…」

const
  MAX_TAB = 5;
  TABCODE = #9;
type
  TTabArray = array[0..MAX_TAB-1] of Integer;
  TMultiStrings = class;
  TListBox = class(StdCtrls.TListBox)
  private
    FMultiItems: TMultiStrings;
    procedure SetMultiItems(Value: TMultiStrings);
  published
    property MultiItems: TMultiStrings read FMultiItems write SetMultiItems;
  public
    Tabulator: TTabArray;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure CreateWnd; override;
  end;
  TMultiStrings = class(TStrings)
  private
    ListBox: TListBox;
  public
    function Add(const S1, S2, S3: string): Integer; overload;
    function Add(Value: array of string): Integer; overload;
  end;
type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ........

implementation

uses Consts;

function TMultiStrings.Add(const S1, S2, S3: string): Integer;
var
  S: string;
begin
  with ListBox do begin
   SendMessage(Handle, LB_SETTABSTOPS, MAX_TAB, Longint(@Tabulator));
   S := S1 + TABCODE + S2 + TABCODE + S3;
   Result := SendMessage(Handle, LB_ADDSTRING, 0, Longint(PChar(S)));
   if Result < 0 then raise EOutOfResources.Create(SInsertLineError);
  end;
end;

function TMultiStrings.Add(Value: array of string): Integer;
var
  S: string;
  i: Integer;
begin
  with ListBox do begin
   SendMessage(Handle, LB_SETTABSTOPS, MAX_TAB, Longint(@Tabulator));
   S := Value[0];
   for i:=1 to Length(Value)-1 do begin
    if i >= MAX_TAB then break;
    S := S + TABCODE + Value[i];
   end;
   Result := SendMessage(Handle, LB_ADDSTRING, 0, Longint(PChar(S)));
   if Result < 0 then raise EOutOfResources.Create(SInsertLineError);
  end;
end;

constructor TListBox.Create(AOwner: TComponent);
begin
  inherited;
//TabWidth := 1;
  TabWidth := (GetDialogBaseUnits and $FFFF) div 4;
  FMultiItems := TMultiStrings.Create;
  FMultiItems.ListBox := Self;
  Tabulator[0] := 60;
  Tabulator[1] := 130;
  Tabulator[2] := 190;
  Tabulator[3] := 250;
  Tabulator[4] := 310;
end;

procedure TListBox.CreateWnd;
begin
  inherited;
//SendMessage(Handle, LB_SETTABSTOPS, MAX_TABS, Longint(@Tabulator));
  SendMessage(Handle, LB_SETHORIZONTALEXTENT, 1000 + GetSystemMetrics(SM_CXFRAME), 0);
end;

destructor TListBox.Destroy;
begin
  inherited;
  FMultiItems.Free;
end;

procedure TListBox.SetMultiItems(Value: TMultiStrings);
begin
  Items.Assign(Value);
end;

{TForm1}
procedure TForm1.Button1Click(Sender: TObject);
begin
  with ListBox1 do begin
   MultiItems.Add(['Name','Operation','Person in charge','Reservation day','Charge']);
   Items.Add(StringOfChar('-', 80));
   MultiItems.Add(['田中一郎   様','カット','担当:鈴木次郎','8月25日','\3,500']);
   MultiItems.Add(['','パーマ','担当:田中四郎']);
   MultiItems.Add('','シャンプー&ブロー','担当:田中四郎');
   MultiItems.Add(['伊集院峰弘 様','パーマ','担当:佐藤三郎','8月27日','\2,000']);
  end;
end;

真琴:「ハルコさん、これはタブ設定だから等幅フォントでなくてもOKなの?」
春子:「そうよ、マコト、でも最大文字数がもっと増えたらタブ幅も調整しないと」
真琴:「これも便利、オープン配列コンストラクタって言うのネ?」
春子:「そういうワケ」
真琴:「だけど、この水平スクロールバーは無くてもイイんじゃない?」
春子:「それはオマケ、…しっかし、暦の上では秋なのに相変わらず暑いね〜」
真琴:「うん、それに昨日は三歳の男の子が迷子になっちゃって大変だったの」
春子:「えっ、迷子に? それでその子は見つかったの? マコト」
真琴:「大丈夫、見つかった、…海でおぼれたんじゃないかって皆心配したけど」
春子:「そっか、とにかく良かったね、無事で」
真琴:「ねぇ、ハルコさん、この前の夢の話なんだけど…」
春子:「ン? マコトが迷子になったって夢のコト?」
真琴:「そう、あの時ハルコさんは言ってくれたよね、これに懲りずに挑戦しろって」
春子:「えっ? そんなコトは…」
真琴:「また迷子になっても何度でも助けてあげるからって、アタシを励まして…」
春子:「違う違う、マコト、もうアタシは助けられないって言ったでしょ」
真琴:「そうよ、確かにそう言ったの、ハルコさんは…、やっぱりあれは夢じゃなかったんだね」
春子:「…マコト、アタシをひっかけた?」


表裏 未里  URL  2008-08-20 17:36:32  No: 31568

ワケ様ご意見ありがとうございます!  大変勉強になりますv
結局はスコピョン様の意見の方法で解決しました!  ありがとうございました!
フォントはMS ゴシックを使うことにしました。


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

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






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