喫茶XRAYトップページ


[5151] 等幅フォント(plPrev)返信 削除
2011/8/26 (金) 10:00:25 Syake
マスターこんいちは
夏の甲子園も終わり(紙面では終わってないようですが・・・)
そろそろ秋の訪れを感じる今日この頃でございます。

コードを2007からXEに移行中に、等幅フォント(MS ゴシック)
等幅にならないと言いましょうか、2行描画した場合に描画位置
がずれる現象があるようす。
試行錯誤しましたが、FontNameで指定した場合とFont.Nameで指
定した場合に動作が異なるようです。
2行目が異なったフォントで描画されてるような??

{サンプル的コード}
for i := 1 to 10
begin
  if i in [1,2] then
  begin
    FontName('・・・・');
    ・・・・
  end else if i in [7,8] then
  begin
  FontName('MS ゴシック'); //←Font.Name := 'MS ゴシック';
  FontStyle([]);
    FontSize(10);
    case i of
      7: StrTxt := '000000000000000000000000000000000';
      8: StrTxt := '000000000000000000000000000000000';
    end;
    TextRectLC(X1,X2,Y1,Y2,StrTxt);
  end else begin
    FontName('・・・・');
  ・・・・
  end;
end;
上記のような感じでしょうか。

DelphiXE Win7 TplPrev(9.02)

過去のコンポーネントで開発したプログラムでは正常に描画できていたの
で問題ないようです(たぶん)ので、Ver9.00以降の問題なのでしょうか?

お手数ですがよろしくお願いします。 m(_ _)m




[5152] Re:等幅フォント(plPrev)返信 削除
2011/8/26 (金) 10:42:45 Mr.XRAY
▼ Syakeさん,こんにちは.

> 試行錯誤しましたが、FontNameで指定した場合とFont.Nameで指
> 定した場合に動作が異なるようです。
> 2行目が異なったフォントで描画されてるような??


う〜む.またまた...
お手数かけています.
これもすごいバグですね.
喜んで調査させていただきます.

>で問題ないようです(たぶん)ので、Ver9.00以降の問題なのでしょうか?

変えた記憶はないのですが.
OSの仕様? (^^;


[5153] Re2:等幅フォント(plPrev)返信 削除
2011/8/26 (金) 11:27:45 Syake
▼ Mr.XRAYさん

> 変えた記憶はないのですが.
> OSの仕様? (^^;


よくわからんのですが plPrev.pas(2009/03/11)を使用したD2007開発の
アプリでは同環境(Win7上)でも正常に描画します。
OSの仕様でも無いような気が・・・。
D2009,2010,XE(UniCode!?) なんてことは・・・ないですよね (?_?)

[5154] Re3:等幅フォント(plPrev)返信 削除
2011/8/26 (金) 11:39:23 Mr.XRAY
▼ Syakeさん

> よくわからんのですが plPrev.pas(2009/03/11)を使用したD2007開発の
> アプリでは同環境(Win7上)でも正常に描画します。
> OSの仕様でも無いような気が・・・。


ハハハッ.何かいじってしまったのかも知れません.
記憶にないだけで(認知症の始まりか?)

> D2009,2010,XE(UniCode!?) なんてことは・・・ないですよね (?_?)

なるほど,そのあたりも注意して調査してみます(汗)
今日はこれからまたお出かけなので,また... スミマセンね.


[5158] Re:等幅フォント(plPrev)返信 削除
2011/8/27 (土) 08:34:39 Mr.XRAY
▼ Syakeさん,どうも

> 試行錯誤しましたが、FontNameで指定した場合とFont.Nameで指
> 定した場合に動作が異なるようです。


この現象,フォントサイズを大きくすると,どうなるでしょう?
テストしていただけますか?
StrTxtの長さを短くしないと比較できないかも知れませんが...
後,フォントサイズの

FontSize(10)を FontSize(10.0)
にしてみるとか(悪あがきか?)

ちょっとやってみたんですが,原因は,今のところ分かりません.


[5159] Re2:等幅フォント(plPrev)返信 削除
2011/8/27 (土) 09:04:19 Mr.XRAY
▼ Syakeさん,どうも

こちらでは,現象を確認できるコードがまだできていません.
そこで,もう1つお願いしたいのですが.
plPrev.pasの中に
plAdjustFontという関数があります.
これを実行しないようにするとどうなるか確認していただければ
と思います.
今のところの予想では,フォントサイズの設定が正常に行われていない
可能性がある気がします.

procedure TCustomplPrev.plAdjustFont(Canvas: TCanvas);
var
  tm : TTextMetric;
  lf : TLogFont;
begin
  exit;   // 例えばこんな感じで...
  GetObject(Canvas.Font.Handle, SizeOf(lf), @lf);
  if lf.lfWidth = 0 then begin
    GetTextMetrics(Canvas.Handle, tm);
    lf.lfWidth := -lf.lfHeight * tm.tmAveCharWidth div tm.tmHeight;
    Canvas.Font.Handle := CreateFontIndirect(lf);
  end;
end;

フォントサイズをほんの少し(小数点以下)大きくすると下の行のようになる
プレビュー画面の拡大,縮小でも確認可能

[5160] 同様の現象を確認しました返信 削除
2011/8/27 (土) 21:58:18 Mr,XRAY
▼ Syakeさん,どうも

同様の現象を確認しました.
以下はテストコードです.

Windows XP(SP3) + Delphi 2010, XE,
Windows 7 U64 + Delphi 2010, XE
で発生しました.
plAdjustFontという関数を無効にすると発生しませんでした.
これから,OSとDelphiの各バージョンでテストしてみます.
どれが本当なのかも調べる必要があります.
とりあえず,plAdjustFontを無効にしてみてください.

しかし,Syakeさんに,またまた感謝ですね.
バグ発見功労者のトップかも知れません.
もちろん,いまいまでバグを発見して下さった方々にも感謝しております.

procedure TForm1.Button1Click(Sender: TObject);
var
  StrTxt : String;
  X1     : Integer;
  X2     : Integer;
  Y1     : Integer;
  Y2     : Integer;
  Yhigh  : Integer;
begin
  X1    := 200;
  X2    := 1700;
  Y1    := 400;
  Yhigh := 50;
  Y2    := Y1 + Yhigh;

  with plPrev1 do begin
    BeginDoc;

    FontName('MS ゴシック');
    FontStyle([]);
    FontSize(10);
    StrTxt := '000000000000000000';
    TextRectLC(X1, X2, Y1, Y2, StrTxt);

    Y1 := Y1 + 50;
    Y2 := Y1 + Yhigh;

    FontName('MS ゴシック');
    FontStyle([]);
    FontSize(10);

    StrTxt := '000000000000000000';
    TextRectLC(X1, X2, Y1, Y2, StrTxt);

    EndDoc;

    ShowModal;
  end;
end;



[5165] 修正版UPしました返信 削除
2011/8/28 (日) 17:41:39 Mr.XRAY
> とりあえず,plAdjustFontを無効にしてみてください.

これだと別の問題が発生するようです.前にありました.
で,Syakeさんの動作確認を待たずに,修正版UPしてしまいました.
多分大丈夫だと思います.

バグ修正の具体的な内容は,ソースコードに書いてありますが,
私の非常に簡単な,単純,思い違いのコーディングミスです.
深くも浅くも追及しないでくださいませ(大汗).お願いです (^^;
「勝てば官軍,動けば正義」ということにしておいてください m(_ _)m


[5166] Re:修正版UPしました返信 削除
2011/8/29 (月) 12:02:26 Syake
▼ Mr.XRAYさん
おはようございます、と言ってももう昼飯時分です。
お手数をお掛けいたしました。
私めは、日祝日は冬眠しておりまして返答無くすいません。
マスターはお休み無しですね。

早速確認してみます。




[5167] Re2:修正版UPしました返信 削除
2011/8/29 (月) 12:06:23 Mr.XRAY
▼ Syakeさん.どうも

>マスターはお休み無しですね。

いえ,休みだからやったんです(笑)
正義の味方に休みはないのだ!

> 早速確認してみます。

それで,誠に申し訳ありませんが,このバグ修正により,前のバージョンで
作成したアプリの文字列表示幅が変化してしまうかも知れません.
その場合は,各自で修正してください.
ホントに情けないバグでした.Syakeさんのこのスレッドがなかったら,
永久に気付かなかったかも知れません.


[5168] Re3:修正版UPしました返信 削除
2011/8/29 (月) 12:12:13 Syake
▼ Mr.XRAYさん

結果、完璧でございました。
ありがとうございました。m(_ _)m

> それで,誠に申し訳ありませんが,このバグ修正により,前のバージョンで
> 作成したアプリの文字列表示幅が変化してしまうかも知れません.
> その場合は,各自で修正してください.

了解です。


INCM/CMT
Cyclamen v3.82