Blocksatz Exportiern oder Exportierbar machen

Für allgemeine Fragen zur Programmierung mit PureBasic.
supra
Beiträge: 25
Registriert: 14.03.2006 20:13

Blocksatz Exportiern oder Exportierbar machen

Beitrag 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 ? :)
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
supra
Beiträge: 25
Registriert: 14.03.2006 20:13

Beitrag 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
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
supra
Beiträge: 25
Registriert: 14.03.2006 20:13

Beitrag von supra »

ah vielen dank der code funktioniert echt ganz gut :)
Antworten