Разделить строки на ячейки таблицы RTF и максимальную общую ширину

ВБ2010. Может быть немного сложно понять, но у меня есть список классов, и одно поле представляет собой строковое сообщение. Я вывожу эти сообщения в документ RTF, но хочу максимально использовать горизонтальное пространство, поэтому я пытаюсь динамически создать таблицу и разместить как можно больше сообщений в одной строке, а затем в другой строке. При этом я поддерживаю максимально возможную ширину строки.

Public Class TripInfo
    Public SysId As String = ""
    Public CreateDate As DateTime
    Public OutMessage As String = ""
    Public OutMessageWidth As Integer = 0 'the width of the message in char count up to first LF
End Class

Dim myTrips1 as New List(Of TripInfo)
Dim myTrips2 as New List(Of TripInfo)

Поэтому, когда я перебираю списки, я хочу создавать строки, длина которых не превышает 45 символов. Что-то вроде:

---------------------------------------------
|"Message1 |"Message2 |"Much longer message |
| Trip1   "| Trip2"   | with two lines"     |
---------------------------------------------
|"message is even longer than the others"   |
---------------------------------------------
|"trip is ok |"trip was cancelled due to CW |
| enroute"   | must log to system"          |
---------------------------------------------
|"Message3 |"Message4 |"Message5 |"Message6"|
| Trip3   "| Error"   | Stop"    |          |
---------------------------------------------

*Обратите внимание, что само сообщение может занимать более 1 строки с LF для отображения многострочного сообщения.

У меня есть временной код для написания RTF-кода для таблиц, и я заменил поддельные сообщения несколькими встроенными LF, и результат выглядит хорошо.

Dim sbTable As New StringBuilder
sbTable.Append("\pard \trowd\trql\trgaph108\trleft36\cellx1636\cellx3236\cellx4836\intbl R1C1\cell R1C2\cell R1C3\cell\row \pard")
sbTable.Append("\pard \trowd\trql\trgaph108\trleft36\cellx4642\intbl R1C1\cell\row \pard")
sbTable.Append("\pard \trowd\trql\trgaph0\trleft36\cellx4642\cellx5500\intbl R1C1\cell R1C2\cell\row \pard")

Однако я просто не могу понять, как даже начать это делать динамически. Кажется, мне может понадобиться сделать две итерации. Один для разбиения сообщений на строки, а другой для фактического написания кода RTF. У меня пока есть псевдокод, но мне нужна помощь с моей логикой.

dim v as integer = 0 'total width of current row
For each t as TripInfo in myTrips1 and myTrips2
    if (t.OutMessageWidth added to v) > 45 then
      start new row and append
    else
      append to current row
    endif
Next t

person sinDizzy    schedule 17.09.2015    source источник


Ответы (1)


Не зная свойств вашего класса TripInfo, мне придется сделать некоторые предположения. Если какое-либо свойство, как я предполагаю, не существует, вы можете либо создать его, либо изменить код, чтобы получить тот же эффект.

Dim t As TripInfo, AllTrips As New List(Of TripInfo)
For Each t In myTrips1
    AllTrips.Add(t)
Next
For Each t In myTrips2
    AllTrips.Add(t)
Next
If AllTrips.Count > 0 Then
    For Each t In AllTrips
        Dim NewRow() As String = t.Lines
        Dim w As Integer = t.OutMessageWidth
        Dim h As Integer = t.Lines.Count
        For ItemHeight As Integer = h To 1 Step -1
            For Each CompareTrip As TripInfo In AllTrips
                If AllTrips.IndexOf(t) <> AllTrips.IndexOf(CompareTrip) _
                And CompareTrip.Lines.Count = ItemHeight _
                And w + CompareTrip.OutMessageWidth <= 45 Then
                    w += CompareTrip.OutMessageWidth
                    For l As Integer = 0 To h -1
                        NewRow(l) = NewRow(l).PadRight(w) & CompareTrip.Lines(l)
                    Next
                    AllTrips.Remove(CompareTrip)
                End If
            Next
        Next
        AllTrips.Remove(t)
        'Write lines of NewRow to your RTF
    Next
End If
person Josh    schedule 18.09.2015
comment
Позвольте мне потратить некоторое время, чтобы переварить это. Единственное, что я вижу, это то, что, возможно, я не очень хорошо передал свою идею, поскольку каждое поле выше на самом деле является одной ячейкой в ​​таблице. Позвольте мне посмотреть, смогу ли я работать с вашим образцом и внести необходимые коррективы. - person sinDizzy; 18.09.2015