2015-09-17 1 views
0

VB2010. Peut être un peu difficile à comprendre mais j'ai une liste de classes et un champ est un message de chaîne. Je publie ces messages dans un document RTF, mais je souhaite optimiser l'utilisation de l'espace horizontal. Je tente donc de créer dynamiquement une table et d'insérer autant de messages sur une ligne que possible, puis sur une autre ligne. Ceci pendant que je maintiens une largeur maximum possible pour une rangée. Alors que je parcoure les listes, je veux créer des lignes qui ne dépassent pas 45 caractères. Quelque chose comme:Diviser les chaînes en cellules de table RTF et largeur totale maximale

--------------------------------------------- 
|"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" |   | 
--------------------------------------------- 

* Notez que le message lui-même peut couvrir plus de 1 ligne avec LFS pour afficher un message sur plusieurs lignes

Je code zéro pour écrire le code RTF pour les tables et ont substitué faux messages avec plusieurs LF intégrés et la sortie semble bonne.

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") 

Cependant, je ne peux pas vraiment me demander comment commencer à le faire dynamiquement. Il semble que je devrais faire deux itérations. Un pour décomposer les messages en lignes puis un autre pour réellement écrire le code RTF. J'ai déjà un pseudo code mais j'ai besoin d'aide avec ma logique.

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 

Répondre

0

Sans connaître les propriétés de votre classe TripInfo, je vais devoir faire quelques hypothèses. Si une propriété que je suppose n'existe pas, vous pouvez la créer ou modifier le code pour obtenir le même effet.

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 
+0

Laissez-moi prendre le temps de digérer cela. La seule chose que je vois est que peut-être je n'ai pas fait un si bon travail de relais de mon idée que chaque case ci-dessus est en réalité une cellule dans la table. Laissez-moi voir si je peux travailler avec votre échantillon et ajuster si nécessaire. – sinDizzy