最後だけ改行されない

解決


みずき  2006-02-23 20:35:29  No: 20171

みなさんこんにちわ。いつもお世話になっています。

新たな修正PGを「原因がわからないけどよろしく」と
丸投げされて半泣きの状態でございます;

現在、A画面にリッチテキスト(多分)があり、
(「多分」というのはオリジナル名称が入っていて元がわかりません
  ひょっとして元からあるオブジェクトではないのかもしれません)
そのテキスト部分に他ボタン等からコンボボックス等が
生成されるように出来ています。
生成後、A画面にある「確定」ボタンを押下すると、

B画面のリッチテキストに、A画面の内容を
文章で貼り付けるような形になっています。

現在の不具合は、A画面でスケジュールを作るのですが、
A画面には1日〜31日*2ヶ月分で62個のコンボボックスがあります。
並び方としては、7月1日〜31日まで縦一列
8月1日〜31日まで縦一列で横に二列という感じです。
A画面でみる並びではちゃんと横二列で表示されているのですが、

これをB画面に確定させると、
最後の行だけ改行されていません。

29日(水)  米  肉    29日(木)  米  魚
30日(木)  粥  豆    30日(金)  粥  魚31日(金)  米  肉    31日(土)  粥  肉

という感じです。それまでは綺麗に改行されているのですが
最後だけ改行出来ていない。というイメージです。
リッチテキストなので31日のところでEnterを押せば対応出来るのですが、
面倒なので改修して欲しい。との事で渡されました。

ここが原因ではないかと思われるプログラムを抜き出してみました。

  TabHanyo_Rx .Lines.BeginUpdate;

  CDataSet.First;
  while not CDataSet.Eof do begin
    BufWrds := {BufWrds + }CDataSet.FieldByName('コメント').AsString;
    if CDataSet.FieldByName('画像').IsNull = True then begin
      wColor := clBlack;
      if CDataSet.FieldByName('改行フラグ').AsInteger =1 then
        WriteWrds(TabHanyo_Rx, '', CON_DEFALT_FONT , [], wColor,0) ;
      WriteWrdsInsert(TabHanyo_Rx, BufWrds, CON_DEFALT_FONT, [], wColor,TabHanyo_Rx.SelStart{Length},0);
    end

改行フラグ?があったら、改行される。とあるようですが、
Bufの中がわからないので改行が実際にあるかどうかがわかりません。。。
どう質問していいのかもわかりませんが、

「ここが原因かも」等ありましたらご教授願います。。。
長文失礼しました。


ママん  2006-02-23 23:26:34  No: 20172

endの後に
BufWrds := '';
WriteWrdsInsert(TabHanyo_Rx, BufWrds, CON_DEFALT_FONT, [], wColor,TabHanyo_Rx.SelStart{Length},0);
ではないかと私のゴーストが囁いてます。
違ったらゴメンチャイ。


みずき  2006-02-24 00:16:07  No: 20173

ママんさんレスありがとうございます。
教えていただいた内容をendの後に入れましたが特に変化ありませんでした;

抜き出した一部なのでわかりにくいかもしれません。。。
このループを全て抜いてみました。

引き続き調査していきます。
何かわかるようでしたらご教授願いますm(_ _)m

  CDataSet.First;
  while not CDataSet.Eof do begin
    BufWrds := {BufWrds + }CDataSet.FieldByName('コメント').AsString;
    if CDataSet.FieldByName('画像').IsNull = True then begin
      wColor := clBlack;
      if CDataSet.FieldByName('改行フラグ').AsInteger =1 then
        WriteWrds(TabHanyo_Rx, '', CON_DEFALT_FONT , [], wColor,0) ;
      WriteWrdsInsert(TabHanyo_Rx, BufWrds, CON_DEFALT_FONT, [], wColor,TabHanyo_Rx.SelStart{Length},0);
    end
    else begin
      try
        if BufWrds <>'' then begin //画像の前のスペース
          i:=StrToInt(BufWrds);
          BufWrds:='';
          for j:=1 to i do
            BufWrds:=BufWrds+' ';
        end;
      except
        HCMessageDlg('',mtError,[mbOk],0,Self.Left);
      end;

      WriteWrdsInsert(TabHanyo_Rx, BufWrds, CON_DEFALT_FONT, [], clBlack,TabHanyo_Rx.SelStart,0);
      //GetRxImage(wRx, CDataSet.FieldByName('画像').AsString);

      BM := TBitmap.Create();       //Bmpイメージ用領域確保
      try
        BM.Assign(CDataSet.FieldByName('画像'));
        Clipboard.Assign(BM);

        //最後にカーソルを合わせる
        TabHanyo_Rx.SelStart := Length(TabHanyo_Rx.Lines.text);

        Sleep(500);
        //Size変更不可
        TabHanyo_Rx.InsertNonResizableBitmap;

        WriteWrds(TabHanyo_Rx, '', CON_DEFALT_FONT, [], clBlack,0);

      finally
        BM.Free;          //領域破棄
      end;
    end;
    CDataSet.Next ;
  end;

  TabHanyo_Rx.Lines.EndUpdate;


ちなみに  2006-02-24 01:31:23  No: 20174

データベースを使っているようですが、

フィールド「コメント」に
「30日(木)  粥  豆    30日(金)  粥  魚」と
「31日(金)  米  肉    31日(土)  粥  肉」の行できていますか?

「30日(木)  粥  豆    30日(金)  粥  魚31日(金)  米  肉    31日(土)  粥  肉」
になっていたりしませんか?

31日分の「改行フラグ」が0になっていませんか?

そもそも、A画面がどのように処理しているかわからない。
A画面が、B画面と同じように、データベースからデータを読み込んで表示しているのか、
それとも、A画面で表示(作成)したものを、データベースに書き込み
B画面に表示しているのか。

このへんを全部推測しないといけない。

WriteWrdsも、WriteWrdsInsertも「原因がわからないけどよろしく」などという
(暴言かもしれませんが)無責任発言をした人の作ったメソッドでしょう?
デバック作業をぶつけられても回答のしようがないと思うのですが。。。
中身がわかるのは、みずきさんと修正を丸投げした人(+その周辺の誰か?)くらいでしょう?
だからって、ここにソースを丸々投げられても困りますけど。

原点に立ち返って、データが正しいかという点を先に確かめたらどうですか?
それこそ、ブレークポイントで停止させることもできるはずだし。


みずき  2006-02-24 01:48:26  No: 20175

レスありがとうございます。

私見ですが、データベースというか、
レコードセットを用意してあって、そこにA画面で作成した内容を
保存してあるように見えます。

周りの人にも聞きましたが、このソースを作った人はもうおらず、
仕様書等も全く無い状況です。
現状動いているソース=最新情報
といったところでしょうか。
Delphiを始めて一週間も経ってないのに勘弁して欲しいです。
誰もわかってないのにどうしろと。。。;
(なのに今日中とか言われてホントに泣きそうです)

さて、原点に返ってという話があったのですが、
このソースをコンパイルするとDLLが作られます。
で、実行するとメインのEXEが起動して、ブレークポイントを設けても止まりません。。。

Delphiは使った事ないのでわからないのですが、
このような状況でも停止させて中身確認?みたいな事は出来ますでしょうか。。。


みずき  2006-02-24 02:16:20  No: 20176

とりあえず、デバッグで止める事には成功しました。
しばらく自分で調べてみます。


HOta  2006-02-24 02:28:25  No: 20177

そもそも、このソースがどちらのフォームにあるのか判らない。
また、WriteWrds(が何をするかも判らない。
データーベースに何が入っているかも判らない。
どうしようもないです。


みずき  2006-02-24 02:38:41  No: 20178

HOtaさんレスありがとうございます。

このソースはB画面にあります。
A画面で確定ボタン押下後、このソースが走るのを確認しました。

ちなみにさんが言われていた内容を調べてみました。
結果としては、30日と31日は別の行になっていて、
改行フラグには1が入っていて、判断はちゃんと通っているようです。

WriteWrdsは改行を入れているのかなぁというイメージですが
間違ってますでしょうか?
ヘルプで観ても英語ばかりでなんとなくしか意味がわかりません。。。

WriteWrdsInsertはBufの中身を出力しているのはわかるのですが。
それまで改行がちゃんと入っているのに最後だけ入らない理由がわかりません。

A画面に用意されている別のテンプレートでも同じような症状
が出るモノがあります(全てではありませんでした)
何か共通理由があるような気もします。

引き続き調べていきます。


ちなみに  2006-02-24 03:06:14  No: 20179

「ちなみに」さんになったので、このままいきます(笑)

差し支え名ければ、WriteWrdsのソース、できるだけいらないとこ削って貼り付け希望。
もしかして、なにかの開発キットのAPI(関数)とかで、中身不明だったりしますか?

DLLだったり、おなくなりになった開発者のメンテだったり、自分のちょい前の状況に近くて、妙に親近感が(^^ゞ


みずき  2006-02-24 03:13:51  No: 20180

ちなみにさんレス感謝します。

WriteWrdsのソースでBegin以下、使われている部分を添付します。

  try
    With TgtRE do begin
      n := SelStart;
      Lines.Add(TgtWrds);

      SS :=RightStr(TgtRE.Text,5);
      if SS = 'file:' then
        Lines.Add('');

      x := SelStart;
      SelStart := n;
      SelLength := x - n;//1;
      SelAttributes.Size := Fsize;
      SelAttributes.Style := FStyle;
      SelAttributes.Color := FColor;

上から5行目の中を見ると
「'29日(金)  粥  肉'#$D#DA」
となっていたりするので#$D#DAの部分が改行にあたるんですかね。。。
で、問題が発生している30日〜31日を追いかけてみたのですが、
どうやら、WriteWrdsの命令が飛ばされているようです。
デバッグで両方を止めたのですが、31日の時だけWriteWrdsを通りません。

以上が現在わかっている範囲です;

DelphiってVBと似ていて、VB開発者(私)としてはとっつき易いですが、
中身は難しいですね。。。オブジェクト指向が強いからでしょうか;


ちなみに  2006-02-24 03:21:57  No: 20181

> デバッグで両方を止めたのですが、31日の時だけWriteWrdsを通りません。
でも、31日も「改行フラグ=1」なんですよね?

> どうやら、WriteWrdsの命令が飛ばされているようです。

(改行フラグ≠1と判断され)WriteWrdsの中に入っていかないのか、

> if SS = 'file:' then

この行で False になっているか・・・あたりかな?


みずき  2006-02-24 03:22:52  No: 20182

自己解決しました。。。

原因はわからないままですが、今までのような現象は起きなくなりました。

if CDataSet.FieldByName('改行フラグ').AsInteger =1 then
    WriteWrds(TabHanyo_Rx, '', CON_DEFALT_FONT , [], wColor,0) ;        WriteWrdsInsert(TabHanyo_Rx, BufWrds, CON_DEFALT_FONT, [],wColor,TabHanyo_Rx.SelStart{Length},0);
end

この改行とレコードの中身をセットしている部分に、

if CDataSet.FieldByName('改行フラグ').AsInteger =1 then
    Sleep(10);
    WriteWrds(TabHanyo_Rx, '', CON_DEFALT_FONT , [], wColor,0) ;  

と一行入れてみたら直りました...
上の人から「原因は?」と聞かれたら答えれませんが、
とりあえず、今日は気持ちよく帰れそうです。

これからもいろいろお聞きしたりすると思いますが、
暖かい目で見守って頂けると幸いです。ありがとうございました。


ちなみに  2006-02-24 03:33:12  No: 20183

まて

> if CDataSet.FieldByName('改行フラグ').AsInteger =1 then
>     Sleep(10);
>     WriteWrds(TabHanyo_Rx, '', CON_DEFALT_FONT , [], wColor,0) ;  

これだと、改行フラグ=1のときにSleepするだけだぞ。

begin end; いれとけ。

ここに書き込む時のミスなら問題ない。


ちなみに  2006-02-24 03:44:36  No: 20184

しかし、実際に上記(begin〜endなし)で動作した場合、改行フラグ≠1 が濃厚になると思うのだが・・・。


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

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






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