今の現場、繁忙期と閑散期が顕著でここ暫くとても暇してます。
…となるとすこぶる手持ち無沙汰。
最初の方は端末を私仕様にするため色々整理してたんですが、いい加減整理するものもなくなって今は勝手にアプリを作ってます。
(急遽入れ替わった後輩が使ってた端末なので、後輩のあれやこれやが残りっぱなしだったのです。)
もちろん業務を効率化するためのものですよ。
お客さんと上のシステムとの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;