C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

文字列を改行したい /分かりません (20/02/07(Fri) 11:55) #93809
Re[1]: 文字列を改行したい /WebSurfer (20/02/07(Fri) 12:02) #93810
  ├ Re[2]: 文字列を改行したい /Hongliang (20/02/07(Fri) 12:38) #93811
  │└ Re[3]: 文字列を改行したい /分かりません (20/02/07(Fri) 13:08) #93812
  └ Re[2]: 文字列を改行したい /分かりません (20/02/07(Fri) 13:11) #93813
    ├ Re[3]: 文字列を改行したい /はまぐり (20/02/07(Fri) 13:37) #93814
    │├ Re[4]: 文字列を改行したい /Hongliang (20/02/07(Fri) 14:05) #93815
    ││└ Re[5]: 文字列を改行したい /分かりません (20/02/07(Fri) 14:25) #93816
    ││  └ Re[6]: 文字列を改行したい /Hongliang (20/02/07(Fri) 14:35) #93817
    ││    └ Re[7]: 文字列を改行したい /分かりません (20/02/07(Fri) 14:47) #93819
    │└ Re[4]: 文字列を改行したい /分かりません (20/02/07(Fri) 14:41) #93818
    │  └ Re[5]: 文字列を改行したい /分かりません (20/02/07(Fri) 15:06) #93820
    │    └ Re[6]: 文字列を改行したい /Hongliang (20/02/07(Fri) 15:26) #93822
    │      └ Re[7]: 文字列を改行したい /分かりません (20/02/07(Fri) 15:57) #93823 解決済み
    │        └ Re[8]: 文字列を改行したい /はまぐり (20/02/07(Fri) 16:11) #93824 解決済み
    │          └ Re[9]: 文字列を改行したい /分かりません (20/02/10(Mon) 10:23) #93838 解決済み
    └ Re[3]: 文字列を改行したい /WebSurfer (20/02/08(Sat) 10:19) #93829 解決済み
      └ Re[4]: 文字列を改行したい /分かりません (20/02/10(Mon) 10:31) #93839 解決済み
        └ Re[5]: 文字列を改行したい /WebSurfer (20/02/10(Mon) 10:44) #93841
          ├ Re[6]: 文字列を改行したい /WebSurfer (20/02/10(Mon) 10:45) #93842 解決済み
          └ Re[6]: 文字列を改行したい /分かりません (20/02/10(Mon) 15:22) #93847 解決済み


親記事 / ▼[ 93810 ]
■93809 / 親階層)  文字列を改行したい
□投稿者/ 分かりません (11回)-(2020/02/07(Fri) 11:55:25)

分類:[.NET 全般] 

2020/02/10(Mon) 10:24:56 編集(投稿者)
2020/02/07(Fri) 13:14:55 編集(投稿者)

<pre><pre>.Nat Framework 4
Windows10
MicrosoftVisualStudio2010
ASP.Net


Max文字数を指定して、データ文字がMax文字数に到達したら改行して続きを表示するということを実装したいと考えております。

下記URLを参考にしてみたのですが上手くいかず困っております。
https://dobon.net/vb/dotnet/string/newline.html

      'Max文字で改行
Dim Maxmoji As Short = 63

      'データの文字列が何文字か取得
Dim Datamoji As String = DtReport.Rows(0)("moji").ToString
Dim len As Short = Datamoji.Length
            
Dim Diverted As String
'Max文字数チェック
If Maxmoji <= len Then
Diverted = DtReport.Rows(0)("moji").ToString & vbCrLf
Maxmoji += 63
Y_DataAdd+=2
Else
Diverted = DtReport.Rows(0)("moji").ToString
End If

'表示用にデータセット
ObjPDF.DrawText(nRtnCode, pageNo, (Font_X) * pointX, (Font_Y + (-Y_DataAdd)) * pointY, TextWidth, TextHieght, Diverted, font)

宜しくお願い致します。
</pre></pre>
[ □ Tree ] 返信 編集キー/

▲[ 93809 ] / ▼[ 93811 ] ▼[ 93813 ]
■93810 / 1階層)  Re[1]: 文字列を改行したい
□投稿者/ WebSurfer (2015回)-(2020/02/07(Fri) 12:02:32)
No93809 (分かりません さん) に返信

ブラウザ画面に表示する html ソースで改行は <br /> です。

html として書きだす際、HtmlEncode されないように注意。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93810 ] / ▼[ 93812 ]
■93811 / 2階層)  Re[2]: 文字列を改行したい
□投稿者/ Hongliang (953回)-(2020/02/07(Fri) 12:38:12)
> Dim Datamoji As String = DtReport.Rows(0)("moji").ToString
> Diverted = DtReport.Rows(0)("CONTENTS").ToString & vbCrLf
文字数を測るデータと実際に出力するデータが違うようですが?

あいうえおかきくけこ

という文字列を、最大4文字とすると

あいうえ
おかきく
けこ

にしたい、という仕様であってますか?

ObjPDFという名前からの推測ですが、出力先はPDFでしょうか?
このObjPDFというのの素性が分からないと、正しい改行方法もわかりません。
使用しているライブラリなどの情報をお願いします。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93811 ] / 返信無し
■93812 / 3階層)  Re[3]: 文字列を改行したい
□投稿者/ 分かりません (12回)-(2020/02/07(Fri) 13:08:30)
2020/02/07(Fri) 13:16:00 編集(投稿者)

No93811 (Hongliang さん) に返信
>>Dim Datamoji As String = DtReport.Rows(0)("moji").ToString
>>Diverted = DtReport.Rows(0)("CONTENTS").ToString & vbCrLf
> 文字数を測るデータと実際に出力するデータが違うようですが?

すみません。間違っていました(-_-;)正しくはDtReport.Rows(0)("moji").ToStringです。
編集しました。

> あいうえおかきくけこ
>
> という文字列を、最大4文字とすると
>
> あいうえ
> おかきく
> けこ
>
> にしたい、という仕様であってますか?

そういう事です!

> ObjPDFという名前からの推測ですが、出力先はPDFでしょうか?
> このObjPDFというのの素性が分からないと、正しい改行方法もわかりません。
> 使用しているライブラリなどの情報をお願いします。

出力先はPDFです。
PdfGeneratorNetFree
PdfGeneratorNetFree.PgnStyle
PdfGeneratorNetFree.PdfContentItem
System.Drawing

これを使用しています。




[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93810 ] / ▼[ 93814 ] ▼[ 93829 ]
■93813 / 2階層)  Re[2]: 文字列を改行したい
□投稿者/ 分かりません (13回)-(2020/02/07(Fri) 13:11:28)
No93810 (WebSurfer さん) に返信
> ブラウザ画面に表示する html ソースで改行は <br /> です。
>
> html として書きだす際、HtmlEncode されないように注意。

すみません、表示という表現が正しくありませんでしたね(-_-;)

正しくはPDFに出力する際に持ってきたデータの文字数をHongliangさんがおっしゃっていた通り
の感じで出力したいと考えておりました。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93813 ] / ▼[ 93815 ] ▼[ 93818 ]
■93814 / 3階層)  Re[3]: 文字列を改行したい
□投稿者/ はまぐり (84回)-(2020/02/07(Fri) 13:37:27)
No93813 (分かりません さん) に返信

文字列の改行はこんな感じのロジックが良いですよ
https://paiza.io/projects/LvisYdfG6l050tt3Di6ouQ
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93814 ] / ▼[ 93816 ]
■93815 / 4階層)  Re[4]: 文字列を改行したい
□投稿者/ Hongliang (954回)-(2020/02/07(Fri) 14:05:18)
http://pdfgeneratornetfree.web.fc2.com/index.html
PDF Generator Net Freeというのはこれでしょうか。
最新版(1.1.0.0)はダウンロードできず、安定版(1.0.0.0)にはDrawTextなるメソッドを使用できるクラスが存在しないようですが。

考える必要がなければ構わないですが、
・1文字の横幅が同じとは限らない
・最近は1文字の定義がややこしい。Lengthが2以上を返すStringだけど表示上は1文字分とか(絵文字が代表的)
などの問題もあります。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93815 ] / ▼[ 93817 ]
■93816 / 5階層)  Re[5]: 文字列を改行したい
□投稿者/ 分かりません (14回)-(2020/02/07(Fri) 14:25:39)
No93815 (Hongliang さん) に返信
> http://pdfgeneratornetfree.web.fc2.com/index.html
> PDF Generator Net Freeというのはこれでしょうか。
> 最新版(1.1.0.0)はダウンロードできず、安定版(1.0.0.0)にはDrawTextなるメソッドを使用できるクラスが存在しないようですが。

説明不足でした。DrawTextは自分で関数を作ったやつなので、中身としては

        '*** 文字列描画
        ''' <param name="nRtnCode">リターンコード</param>
        ''' <param name="PageName">ページ名</param>
        ''' <param name="PointX">X座標</param>
        ''' <param name="PointY">Y座標</param>
        ''' <param name="Width">幅</param>
        ''' <param name="Height">高さ</param>
        ''' <param name="Text">文字列</param>
        ''' <param name="Font">フォント</param>
        Public Sub DrawText(ByRef nRtnCode As Integer, ByVal PageName As String,
                            ByVal PointX As Single, ByVal PointY As Single, ByVal Width As Single, ByVal Height As Single,
                            ByVal Text As String, Optional ByVal Font As TextStyle = Nothing)
            nRtnCode = -1
            Try
                If Font Is Nothing Then
                    Font = Me.GetFontR(nRtnCode)
                    If nRtnCode <> 0 Then Exit Try
                End If
                If Text IsNot Nothing AndAlso Text.Length > 0 Then
                    Dim content() As AbstractPdfContentItem = {New Text(PointX, PointY, Width, Height, Text, Font)}
                    Call doc.AddContent(PageName, content)
                End If
                nRtnCode = 0
            Catch ex As Exception
                nRtnCode = -1
            End Try
        End Sub

こんな感じです。
ちなみに1.0.0.0です。

> 考える必要がなければ構わないですが、
> ・1文字の横幅が同じとは限らない
> ・最近は1文字の定義がややこしい。Lengthが2以上を返すStringだけど表示上は1文字分とか(絵文字が代表的)
> などの問題もあります。

フォントサイズは指定しているのですが、それでも変わりますか?

[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93816 ] / ▼[ 93819 ]
■93817 / 6階層)  Re[6]: 文字列を改行したい
□投稿者/ Hongliang (955回)-(2020/02/07(Fri) 14:35:10)
少しいじった感じ、このライブラリは各種改行文字を改行として認識しないようですね。
No93814などによってList(Of String)に分割した後、自分でY座標をずらしながら1行ずつ文字列を置いていくしかなさそうです。

> フォントサイズは指定しているのですが、それでも変わりますか?
プロポーショナルフォントもあります。
等幅フォントであっても、いわゆる半角文字と全角文字の違いもあります(フォントによって半角分に描画するか全角分に描画するか異なる文字もあります)し、Boldによって幅が変わる等幅フォントなどもあります。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93817 ] / 返信無し
■93819 / 7階層)  Re[7]: 文字列を改行したい
□投稿者/ 分かりません (16回)-(2020/02/07(Fri) 14:47:36)
2020/02/07(Fri) 14:55:53 編集(投稿者)
2020/02/07(Fri) 14:53:19 編集(投稿者)

No93817 (Hongliang さん) に返信
> 少しいじった感じ、このライブラリは各種改行文字を改行として認識しないようですね。
> No93814などによってList(Of String)に分割した後、自分でY座標をずらしながら1行ずつ文字列を置いていくしかなさそうです。

なるほど…複雑で難しいです。

文字列の改行ははまぐりさんのおかげで実装はできたので、後はY座標をずらしながらやってみたいと思います。
少々時間がかかりそうです。

...どのようにしたらいいでしょうか泣

> プロポーショナルフォントもあります。
> 等幅フォントであっても、いわゆる半角文字と全角文字の違いもあります(フォントによって半角分に描画するか全角分に描画するか異なる文字もあります)し、Boldによって幅が変わる等幅フォントなどもあります。

フォントにも色々とあるのですね。
これもまた複雑…。
勉強になりました!ありがとうございます。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93814 ] / ▼[ 93820 ]
■93818 / 4階層)  Re[4]: 文字列を改行したい
□投稿者/ 分かりません (15回)-(2020/02/07(Fri) 14:41:19)
No93814 (はまぐり さん) に返信
> 文字列の改行はこんな感じのロジックが良いですよ
> https://paiza.io/projects/LvisYdfG6l050tt3Di6ouQ

文字列の改行はできました!
ありがとうございます。

ただ、
 'ObjPDF.DrawText(nRtnCode, pageNo, (Font_X) * pointX, (Font_Y + (-Y_DataAdd)) * pointY, TextWidth, TextHieght, Val, font)
に入れるとなると難しいようです(-_-;)

[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93818 ] / ▼[ 93822 ]
■93820 / 5階層)  Re[5]: 文字列を改行したい
□投稿者/ 分かりません (17回)-(2020/02/07(Fri) 15:06:11)
Dim Maxmoji As Short = 63
Dim Datamoji As String = DtReport.Rows(0)("moji").ToString
Dim List As New List(Of String)()

For i As Integer = 0 To Datamoji.Length Step Maxmoji
Dim len As Integer = If(i + Maxmoji < Datamoji.Length, Maxmoji, Datamoji.Length - i)
List.Add(Datamoji.Substring(i, len))
Dim Val As String = String.Join(vbCrLf, List)

ObjPDF.DrawText(nRtnCode, pageNo, (Font_X) * pointX, (Font_Y + (-Y_DataAdd)) * pointY, TextWidth, TextHieght, String.Join(vbCrLf, List), font)
Next

とりあえずこんな感じで入れてみました。
出力されたPDFを確認すると、*********************□****となっていて改行の部分が四角になっていました。
Y座標をプラスしてやってみたんですが、うまくいきませんでした。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93820 ] / ▼[ 93823 ]
■93822 / 6階層)  Re[6]: 文字列を改行したい
□投稿者/ Hongliang (956回)-(2020/02/07(Fri) 15:26:22)
2020/02/07(Fri) 15:27:20 編集(投稿者)

改行文字は改行として出力されないので、Joinしてはいけません。
Substringした文字列をそのままDrawTextしていくといいでしょう。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93822 ] / ▼[ 93824 ]
■93823 / 7階層)  Re[7]: 文字列を改行したい
□投稿者/ 分かりません (18回)-(2020/02/07(Fri) 15:57:15)
No93822 (Hongliang さん) に返信
> 改行文字は改行として出力されないので、Joinしてはいけません。
> Substringした文字列をそのままDrawTextしていくといいでしょう。

Dim Maxmoji As Short = 63
Dim Datamoji As String = DtReport.Rows(0)("moji").ToString
Dim List As New List(Of String)()

For i As Integer = 0 To Datamoji.Length Step Maxmoji
Dim len As Integer = If(i + Maxmoji < Datamoji.Length, Maxmoji, Datamoji.Length - i)
ObjPDF.DrawText(nRtnCode, pageNo, (Font_X) * pointX, (Font_Y + (-Y_DataAdd)) * pointY, TextWidth, TextHieght, Datamoji.Substring(i, len), font)

Y_DataAdd += 5
Next

これでいけました!
的確なアドバイスありがとうございました。(*^-^*)

解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93823 ] / ▼[ 93838 ]
■93824 / 8階層)  Re[8]: 文字列を改行したい
□投稿者/ はまぐり (85回)-(2020/02/07(Fri) 16:11:15)
No93823 (分かりません さん) に返信

やばいバグってたー

> For i As Integer = 0 To Datamoji.Length Step Maxmoji

これ↓こうしたが良いです!

For i As Integer = 0 To Datamoji.Length - 1 Step Maxmoji
解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93824 ] / 返信無し
■93838 / 9階層)  Re[9]: 文字列を改行したい
□投稿者/ 分かりません (22回)-(2020/02/10(Mon) 10:23:41)
No93824 (はまぐり さん) に返信
>>For i As Integer = 0 To Datamoji.Length Step Maxmoji
>
> これ↓こうしたが良いです!
>
> For i As Integer = 0 To Datamoji.Length - 1 Step Maxmoji

気づきませんでした(*_*;
ありがとうございます!
解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93813 ] / ▼[ 93839 ]
■93829 / 3階層)  Re[3]: 文字列を改行したい
□投稿者/ WebSurfer (2017回)-(2020/02/08(Sat) 10:19:38)
No93813 (分かりません さん) に返信

> 正しくはPDFに出力する際に持ってきたデータの文字数をHongliangさんがおっしゃっていた通り
> の感じで出力したいと考えておりました。

ということは「分類:[ASP.NET (VB)]」となってましたが ASP.NET は関係なかった(少なくとも
直接の)ようですね。直せるなら直してください。
解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93829 ] / ▼[ 93841 ]
■93839 / 4階層)  Re[4]: 文字列を改行したい
□投稿者/ 分かりません (23回)-(2020/02/10(Mon) 10:31:47)
No93829 (WebSurfer さん) に返信
> ということは「分類:[ASP.NET (VB)]」となってましたが ASP.NET は関係なかった(少なくとも
> 直接の)ようですね。直せるなら直してください。

何に変更していいのかわからなかったので.Net全般にしたんですが
WebFormはASP.NETじゃないんですか?
解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93839 ] / ▼[ 93842 ] ▼[ 93847 ]
■93841 / 5階層)  Re[5]: 文字列を改行したい
□投稿者/ WebSurfer (2019回)-(2020/02/10(Mon) 10:44:37)
No93839 (分かりません さん) に返信

> 何に変更していいのかわからなかったので.Net全般にしたんですが

ASP.NET よりは .NET 全般の方がよさそうです。

> WebFormはASP.NETじゃないんですか?

ASP.NET Web アプリで PDF を作成しているようですが、質問の核心部分は .NET で PDF
を作成ということで、ASP.NET とは少なくとも直接の関係はないですよね。

分類を ASP.NET としておくと、ASP.NET と密な関係があると思う(ぱっと見、私が誤解
したように html での改行の話と誤解するとか)人もいるでしょうし、逆に、ASP.NET と
いう文字を見ただけで質問を読まない人も多いと思います。

お互いのために、分類は適切に付けることをお勧めします。
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93841 ] / 返信無し
■93842 / 6階層)  Re[6]: 文字列を改行したい
□投稿者/ WebSurfer (2020回)-(2020/02/10(Mon) 10:45:22)
解決済みマークをつけ忘れました。すみません
解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/

▲[ 93841 ] / 返信無し
■93847 / 6階層)  Re[6]: 文字列を改行したい
□投稿者/ 分かりません (25回)-(2020/02/10(Mon) 15:22:12)
No93841 (WebSurfer さん) に返信

> お互いのために、分類は適切に付けることをお勧めします。

なるほどですね!ありがとうございます!
解決済み
[ 親 93809 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -