Delphiがいじめてくる

今の現場、繁忙期と閑散期が顕著でここ暫くとても暇してます。

…となるとすこぶる手持ち無沙汰。
最初の方は端末を私仕様にするため色々整理してたんですが、いい加減整理するものもなくなって今は勝手にアプリを作ってます。
(急遽入れ替わった後輩が使ってた端末なので、後輩のあれやこれやが残りっぱなしだったのです。)
もちろん業務を効率化するためのものですよ。
お客さんと上のシステムとのQA票をまとめて検索かけれるようにするとか、個人的によく開くドキュメントをアプリ化して調べやすくしたりとか。

で、長々と前置きを書きましたがそこでしばらくハマってました。
Delphiを使ってるのですが、TStringGridをTMemoみたく改行して表示させる処理のせいか、めちゃくちゃちらつくようになりました。
ちらつくどころかビガビガしてると思うぐらい。

先に解決方法を言うと「画面サイズ(グリッドサイズ)をデカくした」だけです。
違うんだよプログラム内で何とかしたいの!という方には申し訳ない。
ただ発生条件っぽいのがなんとなく分かった(気がする)のでお時間取れる方は以下をどうぞ。

まず前提の動きですが、取得したいテーブル情報を元にoracleとiniファイルからデータを引っ張り、oracle取得とini取得を突き合わせてグリッドに表示、という動き。
oracle取得を元にグリッドの行数を指定し、セルには’ ‘(半角スペース)だけを入れて、表示はOnDrawCellイベントで実施。
OnDrawCell内で改行判定用の別プロシージャを用意して実際に表示するテキストを成形していました。

なんかこう、ちょっと触って実行するとビガビガ、また触って実行すると何も起きない。
また触って実行するとビガビガ、みたいなことを何度か繰り返し、どうも桁数で改行したやつが3行以上になると発生してるっぽいです。

改行用のやり方は2種類用意していて、iniファイル内ですでに区切っているものをSplitで区切るやり方と桁数を確認して区切るやり方を実装しています。
Splitで区切った方は何行あっても問題なく、桁数で区切ってる方が3行以上なのがダメっぽい。

結局最後まで分からずに、あくまで私が勝手に作ってるものだから。とグリッドサイズを変更してしまったのでハマったけど解決したとは言えませんが、問題であろう区切り部分のコードは載せようと思います。
何かしら助けになれば幸いです。
コードの書き方が汚いとか非効率とかもっといい関数があるとか突っ込みどころはあると思いますが、今回はお見逃しを。

  //-------------------------------------------
  //  改行判定
  //-------------------------------------------
  procedure chkNewLine();
  const
    separator: string = '▼';

  var
    j: integer;
    k: Integer;
    str: TStringDynArray;
    wkStr: string;
    chk: string;

  begin
    j := 0;

    //区切り文字、文字幅の確認
    if (output.IndexOf(separator) < 0) and
       (Canvas.TextWidth(output) < grd.ColWidths[ACol]) then
    begin
      exit;
    end;

    //文字幅がセル幅より大きい場合
    if output.IndexOf(separator) < 0 then
    begin
      chk := string.Empty;
      //整形用配列を作成
      SetLength(str, (Canvas.TextWidth(output) div grd.ColWidths[ACol]) + 1);
      for k := 0 to Length(output) do
      begin

        //1文字ずつ増やして文字幅>セル幅になるところを確認
        chk := chk + output.Substring(k, 1);
        if Canvas.TextWidth(chk) > grd.ColWidths[ACol] then
        begin
          str[j] := chk.Substring(0, Length(chk) - 3);
          chk := RightStr(chk, 3);
          Inc(j);
        end;
      end;
      str[j] := chk;
    end
    else begin
      //区切り文字で分解
      str := SplitString(output, separator);
    end;

    j := 0;
    output := str[0];

    //改行コードを入れて結合
    for wkStr in str do
    begin
      if j > 0 then
      begin
        output := output + #13#10 + TrimRight(wkStr);
      end;

      Inc(j);
    end;

    //セルの高さ
    grd.RowHeights[ARow] := Trunc(wordHeight * (j + 1));
  end;

投稿者: motalenemy

切り絵とゲームを気まぐれで作る仮面ライダー好きな馬骨

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。