Seite 1 von 1

Blocksatz Exportiern oder Exportierbar machen

Verfasst: 22.09.2007 12:38
von supra
Moin Moin

Ich bin auf der Suche nach einer Lösung um einen beliebigen Text zu einem Blocksatz zu formatieren.
Ich habe natürlich ein wenig im Board nachgeforscht bin dabei aber leider nur bisher auf Beispiele gestoßen in denen erklärt wird wie beispielsweise das editor gadget so eingestellt wird das es den Text als Blocksatz anzeigt.
Leider verliert der text die Formatierung wenn man ihn ausliest und abspeichert.

Hat jemand evtl ein Beispiel oder eine Idee ? :)

Verfasst: 22.09.2007 13:13
von Scarabol
Hi,

das Problem am blocksatz ist, dass die Leerzeichen und Buchstaben so gedehnt werden, dass sie eben einen Block ergeben. Dies kann man natürlich nicht speichern.
Wie der Text angezeigt wird hängt allein von dem Programm am mit dem man ihn läd.
Währ also gut wenn du näher beschreibst was du mit dem Text genau vorhast...

Allgemein gesagt würde ich jetzt auf Textwidth(), deine Mathekenntnisse verweisen...

Gruß
Scarabol

Verfasst: 22.09.2007 13:26
von mk-soft
Selber berechnen.

Ist noch nicht ganz vollständig

Code: Alles auswählen

; Blocksatz

Define.s text, result
Define.f lenblock, countspace, countchar, newspace

text = "Hallo Welt, dies ist ein Satz im Block format"

lenblock = 80
countspace = CountString(text, " ")
countchar = Len(text) - countspace
newspace = (lenblock - countchar) / countspace
result = ReplaceString(text, " ", Space(newspace))
fehlspace = lenblock - Len(result)

Debug text
Debug result
Debug Len(result)

FF :wink:

Verfasst: 22.09.2007 13:49
von supra
@Scarabol

ich möchte einen Text auf eine bestimmte Anzahl von Zeichen pro Zeile
formatieren dabei müssen aber halt die Wörter so erhalten bleiben wie sie sind. Außerdem sollte jedes Zeilenende nicht mit einem Leerzeichen aufhören damit der Blocksatz auch gut aussieht ^^

mk-soft weiß glaube ich was ich meinte sieht zumindest schon von der Richtung her gut aus mal sehn ob ich darauf aufbauen kann :x

Verfasst: 22.09.2007 14:04
von Scarabol
@Mk-Soft

Dein Ansatz ist gut funktioniert aber so nicht einwandfrei, da du nicht die Buchstaben vergleichen kannst sondern nur die Textlänge.
Schon allein weil ein i nicht breit ist wie ein M.

Gruß
Scarabol

Verfasst: 24.09.2007 00:08
von hjbremer
Vielleicht hilft dir das weiter

Code: Alles auswählen

Declare Blocksatz(ab,bis,rest)

txt$="Ich bin auf der Suche nach einer Lösung um einen beliebigen Text zu einem Blocksatz zu formatieren. Ich habe natürlich ein wenig im Board nachgeforscht bin dabei aber leider nur bisher auf Beispiele gestoßen in denen erklärt wird wie beispielsweise das editor gadget so eingestellt wird das es den Text als Blocksatz anzeigt. Leider verliert der text die Formatierung wenn man ihn ausliest und abspeichert."

Structure Zeichenkette
wort.s
pixel.l
sp.l
ze.l
EndStructure

#imagenr=0
#breite=250
#linkerrand=25

If OpenWindow(0, 0, 0, 300, 260, "TextGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
   
    anzspace=CountString(txt$," ")
    anzworte=anzspace+1
    Dim text.zeichenkette(anzworte+1)    
   
    LoadFont(0, "Arial", 10)

    StartDrawing(WindowOutput(0))
    
    DrawingMode(#PB_2DDrawing_Transparent)

    DrawingFont(FontID(0)) 

    sp = 0
    ze = 0
    br = TextWidth(" ") 
    hh = TextHeight(txt$) 
    ab = 1
    bis= 1    
    
    For j=1 To anzworte

      text(j)\wort = StringField(txt$, j, " ")
      text(j)\pixel = TextWidth(text(j)\wort)     

      If sp+text(j)\pixel >= #breite-1
          rest=#breite-sp
          If rest
             bis=j-1
             Blocksatz(ab,bis,rest)
             ab=j
          EndIf
          sp=0
          ze+hh
      EndIf
    
      text(j)\sp=sp
      text(j)\ze=ze
    
      sp+text(j)\pixel+br

    Next    
    
    For j=1 To anzworte    
        DrawText(#linkerrand+text(j)\sp,text(j)\ze,text(j)\wort)        
    Next
        
    StopDrawing() 
    
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
    
  EndIf

Procedure Blocksatz(ab,bis,rest)

Shared text()

  leer=bis-ab
  pix=rest/leer
  If pix
    rest=rest-(pix*leer)
  EndIf

  For i=1 To pix
     k=0
     For j=ab To bis
       text(j)\sp+k
       k+1
     Next
  Next
  
  For j=1 To rest
      nr=bis-j+1      
      text(nr)\sp+rest-j+1            
  Next

EndProcedure
ist nicht 100% perfekt, es fehlen die IF Abfragen für die Sonderfälle in der Procedure BLOCKSATZ, aber funktioniert recht gut.
Und bevor einer meckert, ich weiß es gibt bessere Lösungen, aber diese ist recht einfach.

Verfasst: 28.09.2007 19:11
von supra
ah vielen dank der code funktioniert echt ganz gut :)