喫茶XRAYトップページ

[▲前のスレッド]

[49] plTackPrintにおけるデータの加工返信 削除
2004/12/10 (金) 00:01:46 yumapa
Mr.XRAYさん こんにちは、yumapaです。
いつもplシリーズを愛用させて頂き、感謝しております。

以前もplTackPrintについて、本掲示板にて質問させて頂きましたが
plTackPrevには移行せず、未だplTackPrintを利用させて頂いている
状況です。

さて、本題ですが
「封筒印刷プログラム」においてplTackPrintに
  plTackPrint1.Columns[1] 〒
  plTackPrint1.Columns[2]  住所
  plTackPrint1.Columns[3] 氏名
としています。
この時、plTackPrint1.Columns[2]の住所データが
Length > 40 となったら、41以降を2行目に表示したいと考えておりますが
その筋道が立たず悩んでおります。
是非、アドバイス頂きたいと存じます。

自分としては、住所の部分だけはplTackPrintではなく、plPrevにおいて
自前で描画させるしかないのかなぁ?と考えておりますが・・・

よろしくお願い致しますm(_ _)m

[50] Re:plTackPrintにおけるデータの加工返信 削除
2004/12/10 (金) 18:27:52 Mr.XRAY
▼ yumapaさん

> この時、plTackPrint1.Columns[2]の住所データが
> Length > 40 となったら、41以降を2行目に表示したいと考えておりますが


どうしても住所を入力する方が長くしてしまうことがありますので,
私もこれをやっています.私の場合,ある指定の文字数を越える場合,
最初に全角か半角の空白がきたらそこで別の文字列にして2行にして
います.本当は,最初から2行に分けて住所を入力してあればベター
なんですけどね.

ちょっと待って下さい.
自分の使っているコードをみて確認してから...

[51] Re2:plTackPrintにおけるデータの加工返信 削除
2004/12/10 (金) 22:22:42 Mr.XRAY
▼ yumapaさん

大変お待たせしました.

> 自分の使っているコードをみて確認してから...

だったのですが,私の場合,
http://homepage2.nifty.com/Mr_XRAY/Delphi/plTackPrev/T_Envelope.htm

のページのように,各カラムの描画設定ではなく,全てこの
OnBerorePageDrawに書く方式でした.yumapaさんがどんな方法を使用し
ているかわかりませんので,もしかしたら,各データ描画前のイベント
であるOnBeforeDataDrawイベントを利用するのがいいかも知れません.
このイベントの引数のTextを変更すると,描画する文字列を変更できま
す.

つまり,このTextに最初の41文字以内を渡し,のこりは,Canvasで位置を
指定して描画するという方式です.
もちろん,Text:='' にしてしまって,全てplPrevのCanvasに描画しても
いいと思います.
(plTackPrevの場合はplTackPrev.Canvasですが,plTackPrintの場合は
plPrev.Canvasを使用することになりまね)

どうでしょう.また不明な・#95;がありましたらどうぞ.

[52] Re3:plTackPrintにおけるデータの加工返信 削除
2004/12/10 (金) 23:08:46 yumapa
▼ Mr.XRAYさん
こんにちは、yumapaです。

> のページのように,各カラムの描画設定ではなく,全てこの
> OnBerorePageDrawに書く方式でした.yumapaさんがどんな方法を使用し
> ているかわかりませんので,もしかしたら,各データ描画前のイベント
> であるOnBeforeDataDraweイベントを利用するのがいいかも知れません.
> このイベントの引数のTextを変更すると,描画する文字列を変更できま
> す.


    plTackPrint1.Columns[1] 〒
  plTackPrint1.Columns[2]  住所
  plTackPrint1.Columns[3] 氏名
    plTackPrint1.Columns[4]

というように、住所が2列目に表示される場合があることを想定して
plTackPrint1.Columns[4] 空のカラムをおいています。

--------------------------------------------------
------------------
procedure TForm1.plTackPrint1BeforePageDraw(Sneder: TObject; DataNo,
  Page: Integer);
var s,s1,s2:string;
begin
  s:=Query1.FieldByName('住所').AsString;
 if Length(s) < 31 then
    plTackPrint1.Columns[1].Text:=s
  else
  begin
    s1:=Copy(s,1,30);
    s2:=Copy(s,31,Length(s)-30);
    plTackPrint1.Columns[1].Text:=s1;
    plTackPrint1.Columns[4].Text:=s2;
  end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  plTackPrint1.Excute;
  plPrev1.Title:='封筒印刷';
  plPrev1.ShowModal;
end;
--------------------------------------------------
------------------

急に遠くへ出かけることになり、今出先からです。
Delphiの環境がないのですが、確かかこのように書いたつもりで(^^;
 plTackPrint1.Columns[1].Text:=s1;
  plTackPrint1.Columns[4].Text:=s2;
のデータが変更されなかったように記憶しています。
月曜日以降、再度挑戦してみたいと思います。


[53] Re4:plTackPrintにおけるデータの加工返信 削除
2004/12/10 (金) 23:13:49 Mr.XRAY
▼ yumapaさん

> というように、住所が2列目に表示される場合があることを想定して
> plTackPrint1.Columns[4] 空のカラムをおいています。


グッドアイディアですね.

> Delphiの環境がないのですが、確かかこのように書いたつもりで(^^;
>  plTackPrint1.Columns[1].Text:=s1;
>   plTackPrint1.Columns[4].Text:=s2;
> のデータが変更されなかったように記憶しています。


描画位置はカラムの設定でしてあるというわけですね.
了解しました.調査してみます.

[54] Re5:plTackPrintにおけるデータの加工返信 削除
2004/12/10 (金) 23:23:07 Mr.XRAY
▼ yumapaさん
> 了解しました.調査してみます.

今,plTackPrint Ver3.0で確認したところ,
封筒のテストプログラムで空のカラムを作成し
(項目エディタの3行目に 2- という空の項目ができる)
plTackPrint1BeforePageDrawの一番下に

plTackPrint1.Columns[2].Text:='AAA';

追加して実行したところ,封筒の左上に'AAA'という文字列が表示され
ました.環境は WindowsXP(SP2) + Delphi5(UP1)です.

[55] Re6:plTackPrintにおけるデータの加工返信 削除
2004/12/11 (土) 22:17:23 yumapa
▼ Mr.XRAYさん
こんにちはyumapaです。
早速のご指導ありがとうございます。
 
> 今,plTackPrint Ver3.0で確認したところ,
> 封筒のテストプログラムで空のカラムを作成し
> (項目エディタの3行目に 2- という空の項目ができる)
> plTackPrint1BeforePageDrawの一番下に
> plTackPrint1.Columns[2].Text:='AAA';
> 追加して実行したところ,封筒の左上に'AAA'という文字列が表示され

〉ました.環境は WindowsXP(SP2) + Delphi5(UP1)です.

まだ出先からですが(^^;
確かこの場合に、ページ送りしても一番最初の描画データが
そのまま引き継がれてしまったように記憶しています。

つまり、
 1番目 AAA
  2番目 BBB
  3番目 CCC というデータの場合に
1番目はAAAと表示されたのですが、その後BBB、CCCと変更しなければ
ならいはずのところ、2ページ目以降ページ送りしても、
 plTackPrint1.Columns[2].Text はAAAのままだったように思います。
明日、以降自宅に戻り次第確認してみます。


[56] Re7:plTackPrintにおけるデータの加工返信 削除
2004/12/12 (日) 18:34:33 Mr.XRAY
▼ yumapaさん

> まだ出先からですが(^^;

大変ですね.出先の仕事が私のコンポのバグが原因でないことを祈っ
ています.

>  plTackPrint1.Columns[2].Text はAAAのままだったように思います。

plTackPrint1.Columns[2].Text:=IntToStr(Page);

としても頁番号が表示されるので,この機能そのものは動作してい
いるのではないかと思います.引き続き調査してみます.
また何かポカしているのかな.


[57] Re8:plTackPrintにおけるデータの加工返信 削除
2004/12/12 (日) 23:58:11 yumapa
▼ Mr.XRAYさん
こんにちは、yumapaです。色々ご面倒お掛けして済みませんm(_ _)m

> 大変ですね.出先の仕事が私のコンポのバグが原因でないことを祈っ
> ています.

ご心配ありません。ただのド素人が趣味で始めたものの、面白くて
ハマッテしまい、そのうちに欲が出てきました。て、自分の仕事でも
使いたいと思いやっと簡単なことをするようになってきたレベルです(^^;
やっと自宅に戻って来ましたので、早速、試してみましたところ。


OnBerorePageDraw、若しくはOnBeforeDataDrawの何れに
plTackPrint1.Columns[2].Text:=IntToStr(Page); を記載しても、
頁番号は表示されます。

但し、plTackPrintのカラム設定で指定したQueryの住所データの後に
頁番号が表示されます。
例えば、住所データが「名古屋市東区葵1丁目1番1号」だとした場合に
plTackPrint1.Columns[2].Text:=IntToStr(Page); を記述し、実行すると
「名古屋市東区葵1丁目1番1号1」「名古屋市東区葵1丁目1番1号2」
つまり、Mr.XRAYさんがホームページ上でご解説されているとおり
%の後に追加表示される形でしか表示されません。


[58] Re9:plTackPrintにおけるデータの加工返信 削除
2004/12/13 (月) 00:14:36 yumapa
▼ Mr.XRAYさん
すみません。誤って途中で送信してしまいましたm(_ _)m

あと一点ですが、[52]において

>というように、住所が2列目に表示される場合があることを想定して
>plTackPrint1.Columns[4] 空のカラムをおいています。


と書きましたが、今、同様に試すと
'Query1:項目''が見つかりません'
とエラーになります。

カラムの設定は
 0-Query1.〒
  1-Query1.住所
  2-Query1.氏名
  3-Query1.担当
  4-

というようにしていますが、恐らくColumns[4]のことかと思うのですが、
DataSetに指定したQuery内のFieldを必ず指定しないと、即ち、空の
カラムを置くことはマズイのでしょうか?


[59] Re10:plTackPrintにおけるデータの加工返信 削除
2004/12/13 (月) 09:54:36 Mr.XRAY
▼ yumapaさん
> DataSetに指定したQuery内のFieldを必ず指定しないと、即ち、空の
> カラムを置くことはマズイのでしょうか?


いえそんなことはありません.というより,空の項目を作成できるの
が特徴となっています.yumapaさんとどこが違うのでしょう.う〜む.
再度,TplTackPrint Ver3.1(TplPrevは4.53)のテストプログラム
Envelopeで試してみました.
今度は,以下のようにしてみました.Columns[2]が追加した項目です.
項目を追加したままの状態で,オブジェクトインスペクタには一切手を
加えていません.

//動作確認に必要ないコードを削除してテスト
procedure TForm1.plTackPrint1BeforePageDraw(Sneder: TObject; DataNo,
  Page: Integer);
var
   AddrStr : String;
begin
     plForm:=TplPrevForm(plPrev1.Form);
     AddrStr:=Query1.FieldByName('Addr1').AsString;
     plTackPrint1.Columns[2].Text:=Copy(AddrStr,1,6);
end;

>plTackPrint1.Columns[2].Text:=IntToStr(Page); を記述し、実行すると
>「名古屋市東区葵1丁目1番1号1」「名古屋市東区葵1丁目1番1号2」


すると,ここで設定したTextの前に別の項目の文字列が印刷されてしまう
わけですね.
(゜-゜).? もう少し調査してみます.


[60] Re11:plTackPrintにおけるデータの加工返信 削除
2004/12/13 (月) 10:21:55 yumapa
▼ Mr.XRAYさん
こんにちは、yumapaです。

> いえそんなことはありません.というより,空の項目を作成できるの
> が特徴となっています.yumapaさんとどこが違うのでしょう.う〜む.


おっしゃる通りです。大変失礼致しましたm(_ _)m
以下のようにして対応出来ました。
--------------------------------------------------
-----------------
 0-Query1.〒
  1-
  2-
  3-Query1.氏名
  4-Query1.担当
というように、カラム1&2は
Queryを参照しない空のカラムにしておき、
--------------------------------------------------
-----------------
OnBeforePageDrawイベントの中で

var s,s1,s2:string;
begin
  s:=Query1.FieldByName('住所').AsString;
 if Length(s) < 31 then
  begin
    plTackPrint1.Columns[1].Text:=s;
    plTackPrint1.Columns[2].Text:=''; //空に戻す
  end
  else
  begin
    s1:=Copy(s,1,30);
    s2:=Copy(s,31,Length(s)-30);
    plTackPrint1.Columns[1].Text:=s1;
    plTackPrint1.Columns[2].Text:=s2;
  end;
end;
--------------------------------------------------
-----------------
としてやることでOKでした。

私の勘違いから、色々ご迷惑をお掛けし誠に申し訳ありませんでした。
また、いつもの如く迅速かつ丁寧なご指導に感謝しております。
ありがとうございましたm(_ _)m


[61] Re12:plTackPrintにおけるデータの加工返信 削除
2004/12/13 (月) 11:50:06 Mr.XRAY
▼ yumapaさん
>     plTackPrint1.Columns[2].Text:=''; //空に戻す

なるほど.そうですか.わかりました.この場合Columns[2]に前に
設定した値か何か残っているようですね.後で修正しておきます.
バグだ〜(いやっ,仕様です!!).

私のしたテストでは,いつもこのTextに値がありましたが,yumapaさん
の場合,空の場合があるということを忘れていました.

> 私の勘違いから、色々ご迷惑をお掛けし誠に申し訳ありませんでした。

とんでもありません.こちらこそ,yumapaさんには,いくつもバグを発
見してもらっています.感謝です.


[62] Re13:plTackPrintにおけるデータの加工返信 削除
2004/12/13 (月) 11:58:27 Mr.XRAY
▼ yumapaさん
> 設定した値か何か残っているようですね.後で修正しておきます.
> バグだ〜(いやっ,仕様です!!).


すみません.修正するのは,TplTackPrevの方になりますので,申し訳
ありせんが,TplTackPrintの方は,yumapaさんのコードでお願いします.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82