質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.33%

  • C#

    7716questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3997questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3777questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • オブジェクト指向

    298questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

MemoやRichEditで文字の位置が揃わない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 86

dem0nmichik0

score 4

実現したいこと

次のフォーマットでMemoやRichEditに文字列を表示したい.MemoやRichEditに表示する文字列の行数は20行,スクロールにより100行まで移動できる.
・何のコンポーネントを使ったらよいのか
・MemoやRichEditでよい場合,何のプロパティをいじればよいのか教えてください.

【フォーマット】
「No.番号1_年(1,000位,100位)年(10位,1位)/月/日_時:分:秒__No.番号2-番号3_故障名_状態」
番号1:3桁表示で右寄せ,0でパディング.
年,月,日,時,分,秒:2桁表示,0でパディング.
番号2:2桁表示で右寄せ,0でパディング.
番号3:1桁表示で右寄せ.
故障名:最大48文字まで
状態:全角2文字で"発生"または"回復"
_(アンダーバー)は半角2文字分のスペース

【実現したい例】
No.001  2018/12/05  23:09:09  No.01-1  Labelイベントハンドラ         発生
No.002  2018/12/05  23:09:09  No.01-1  Buttonイベントハンドラ       発生



No.019  2018/12/05  23:09:09  No.01-1  Label2イベントハンドラ        発生
No.020  2018/12/05  23:09:09  No.01-1  Button2イベントハンドラ      発生
スクロールにより,No.021からNo.100までも表示できる.

困っていること

上記,【実現したい例】のようにMemoやRichEditに文字列を表示したいのですが,下記【上手くいかない状況】のように"状態(発生/回復)"だけ,文字列の位置が合わない表示になってしまいます.
【上手くいかない状況】
No.001  2018/12/05  23:09:09  No.01-1  Labelイベントハンドラ         発生
No.002  2018/12/05  23:09:09  No.01-1  Buttonイベントハンドラ     発生



No.019  2018/12/05  23:09:09  No.01-1  Label2イベントハンドラ        発生
No.020  2018/12/05  23:09:09  No.01-1  Button2イベントハンドラ    発生

ソースコード

該当箇所を抜粋します.

// 構造体
typedef struct data
{
  byte yh;  // 年(1,000位,100位)
  byte yl;  // 年(10位,1位)
  byte m;  // 月
  byte d;  // 日
  byte h;  // 時
  byte m;  // 分
  byte s;  // 秒
  byte no1;
  byte no2;
  byte no3;
  char kosyo[48];
}DATA

------------------------------------------------------------------------------------------------------------------
// 変数宣言
char buff[100][100];
// 初期化
memset( &buff, 0, sizeof(buff) );

// 故障データの取得
for(byte i=0; i<100; i++)
{
   // 発生の時
   if( flg == 1 )
   {
      sprintf( buff[i],
            "No.%03d  %02d%02d/%02d/%02d  %02d:%02d:%02d  No.%02d-%d  %-36s  発生",
            Data[i].no1, Data[i].yh, Data[i].yl, Data[i].m, Data[i].d, Data[i].h, Data[i].m, Data[i].s, Data[i].no2, Data[i].no3, Data[i].kosyo);
   }
   // 回復の時
   else
   {
      sprintf( buff[i],
            "No.%03d  %02d%02d/%02d/%02d  %02d:%02d:%02d  No.%02d-%d  %-36s  回復",
            Data[i].no1, Data[i].yh, Data[i].yl, Data[i].m, Data[i].d, Data[i].h, Data[i].m, Data[i].s, Data[i].no2, Data[i].no3, Data[i].kosyo);
   }
}

AnsiString kosyoData;
// 故障データの表示
for(byte j=0; j<100; j++)
{
   // char型の配列をAnsiStringに変換
   kosyoData = StrPas(&buff[i][0]);
   // 100番目の場合
   if( j == 99 )
   {
     Memo1->Lines->Text = Memo1->Lines->Text + kosyoData;
   }
   // 1~99番目の場合
   {
     Memo1->Lines->Add(kosyoData);
   }
}

試したこと

1.文字列の連結を「sprintf」から+に変更してみたが,うまくいかない.
2.故障名の先頭位置はあって,状態の先頭位置が合わないことから,故障名を別の配列(50文字)に入れて,空き要素に半角スペースを設定してみたが,うまくいかない.
3.MemoやRichEditのフォントCharSetをいじってもうまくいかない.

【現状のMemoのプロパティ】
Font.Carset:SHIFTJIS_CHARSET
Font.Style:なし
ScrolBar:ssVertical

開発環境

OS:Windows7 32bit
Borland C++Builder 6

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2018/12/07 17:12

    C# というタグを見て C 言語の専門家が回答をスルーしている可能性があります。タグは正しくつけてください。

    キャンセル

回答 2

checkベストアンサー

+1

【上手くいかない状況】
No.001  2018/12/05  23:09:09  No.01-1  Labelイベントハンドラ         発生
No.002  2018/12/05  23:09:09  No.01-1  Buttonイベントハンドラ     発生

こちらの内容が、実際のデータからのコピーではなく、
「質問の意図を伝えるべくそれっぽく見せるために手動で調整したもの」であった場合…という条件つきですが

いじるべきはCharSetではなくて、フォントではないでしょうか?
プロポーショナルではないフォント(”P”のつかないMSゴシックなど)を設定してみてはいかかでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/07 23:02

    yominetさん.回答ありがとうございます.
    ご指摘のように位置がずれるときはFontのNameプロパティが”MS P ゴシック”で,それを”MS ゴシック”にしたら,位置が揃いました.Wordなどでも特に気にせず,MSゴシックを使っていましたが,今回「MSゴシック」と「MS P ゴシック」の違いに間隔調整があることを教えていただき,ありがとうございます.

    キャンセル

+1

可能性として

No.001  2018/12/05  23:09:09  No.01-1  Labelイベントハンドラ         発生
No.002  2018/12/05  23:09:09  No.01-1  Buttonイベントハンドラ     発生

「Labelイベントハンドラ       」は半角 5、全角 8、スペース 7 で 5 + 8 * 3 + 7 = 36 で計算が合います。しかし、「Buttonイベントハンドラ   」は半角 6、全角 8、スペース 3 で 6 + 8 * 3 + 3 = 33 で 3 バイト足りません。

Button の方に見えない全角文字が一文字入っていれば計算が合いますから、それが入っていないかどうか調べてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/07 23:08

    Zuishinさん,回答ありがとうございました.
    問題は,全角半角ではありませんでしたが,新しい知識(全角は2バイトではなく,全角が3バイト)を知ることができてよかったです.ありがとうございます.

    キャンセル

  • 2018/12/07 23:29

    こちらではフォントを変えても揃いませんがそちらでいいならそれで。

    キャンセル

同じタグがついた質問を見る

  • C#

    7716questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • C

    3997questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    3777questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • オブジェクト指向

    298questions

    オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。