Seite 2 von 2

Verfasst: 04.04.2008 14:36
von Fluid Byte
Die angegebenen Codes funktionieren bei mir nicht.
Das wird auch so bleiben wenn du nicht präziser wirst.
Verwende PB 4.10 in Windows und Linux.Compiler kennt den "SendMessage"-Befehl nicht.
SendMessage_() ist ein API Befehl (zu erkennen am Unterstrich) und funktioniert natürlich nicht auf LINUX.

Verfasst: 04.04.2008 14:44
von ts-soft
Ergänzung: Unter Windows funktioniert SendMessage_ auch nur mit der Vollversion!

Verfasst: 04.04.2008 15:05
von Berti27
Hallo
1. Bitte entschuldigt mein Unwissen. Habe den Code tatsächlich bisher nur auf Linux ausprobiert.
2. Ich nehme an, dass ich die Vollversion habe. Habe sie seit meinen AMIGA-Zeiten, glaube V2.82 oder so ähnlich und hab damals an die 50 Mark dafür bezahlt!
3. Im Prinzip suche ich eine elegante Methode, die im Editor-Gadget am rechten Gadgetrand automatisch einen Zeilenumbruch einfügt, unabhängig von der Schriftart.
4. Bei mir läuft seit fünf Tagen PB-Linux auf dem EeePC
5. Suche dabei einen Code der möglichst auf beiden (Windows und Linux) funktioniert.

Hat jemand eine Idee?
Mit freundlichen Grüßen
Berti27

Verfasst: 04.04.2008 15:14
von Thorsten1867
Hier einen kleinen Arbeitscode, der sich nach einigen kleinen Änderungen theoretisch auch unter Linux verwenden lassen sollte.
Habe ihn ursprünglich dazu verwendet im Editorgadget den gleichen Zeilenumbruch (Höhe und Weite in mm) zu haben, wie in den erzeugten PDF-Dokumenten.
Wenn der Text weiter als die Vorgabe ist, wird ein Zeilenumbruch Chr(10) eingefügt. Ist der Text zu lang (Höhe), wird er abgeschnitten und in der Variablen "EGCut" gespeichert.

Code: Alles auswählen

;/ WordWrap4PDF
;/ basiert auf dem Zeilenumbruch bei PurePDF (Lucky Luke)
;/ Thorsten Hoepppner (Thorsten1867)

Global EGCut.s
#FontEG = 0

Structure EGFontStructure  
  Name.s
  Size.f
  mm.f
  FontID.l
  CharWidth.w[256]  
EndStructure
Global FontEG.EGFontStructure

Procedure Editor_SetCursorPos(GID.l, CharIdx.l) 
  Range.CHARRANGE 
  Range\cpMin = CharIdx 
  Range\cpMax = CharIdx
  SendMessage_(GadgetID(GID),#EM_EXSETSEL,0,Range) 
EndProcedure 

Procedure.l Editor_GetCursorPos(GID.l) 
  ; returns relative Position of Cursor 
  SendMessage_(GadgetID(GID),#EM_EXGETSEL,0,Range.CHARRANGE) 
  ProcedureReturn Range\cpMax 
EndProcedure


Procedure Editor_GetModify(GID) ; Editorgadget geändert?
  If IsGadget(GID)
    ProcedureReturn GetGadgetData(GID)
  EndIf
EndProcedure

Procedure Editor_SetModify(GID) ; Editorgadget geändert
  If IsGadget(GID)
    ProcedureReturn SetGadgetData(GID, #True)
  EndIf
EndProcedure


Procedure.l SetEditorFont(Font.s, Size.w) ; Zeichensatz für Editorfelder
  Protected vCharWidth.w
  FontEG\Size = Size
  FontEG\mm = Size/(72/25.4)
  Select Font
    Case "Arial", "Helvetica"
      FontEG\Name = "Arial"
      FontEG\FontID = LoadFont(#FontEG, "Arial", Size, 0)
      Restore Helvetica 
    Case "Times", "Times New Roman"
      FontEG\Name = "Times New Roman"
      FontEG\FontID = LoadFont(#FontEG, "Times New Roman", Size, 0)
      Restore Times
  EndSelect
  For j = 0 To 255
    Read vCharWidth
    FontEG\CharWidth[j] = vCharWidth
  Next
  ProcedureReturn FontEG\FontID
EndProcedure

Procedure GetMaxRows(height.f) ; max. Zeilenzahl im EditorGadget
  ProcedureReturn Round(height/(Round(FontEG\mm*10,1)/10),0)  
EndProcedure

SetEditorFont("Arial", 11)


Procedure.s SetEditorText(GID.l, text.s, w.f, h.f, Align.s="J", modify.b=#True) ; Text mit autom. Zeilenumbruch setzen
  
  If IsGadget(GID) ;{ modifiziert bzw. ungültig
    CharIdx.l = Editor_GetCursorPos(GID) ; Cursorposition
    If SendMessage_(GadgetID(GID) , #EM_GETMODIFY , 0 , 0) = #False And modify
      ProcedureReturn "|"
    EndIf
  Else
    ProcedureReturn "|" ; Ungültiges Gadget
  EndIf ;}
  
  Protected s.s, c.s, pdfWs.f = 0, Text$ = "", wMax.f, maxline.l = 0, part.s
  
  Editor_SetModify(GID)
  
  If h > 0
    maxline = Round(h/(Round(FontEG\mm*10,1)/10),0)
  Else
    maxline = 0
  EndIf
  
  wMax = (w-2)*1000/FontEG\mm
  
  s = ReplaceString(text, #CRLF$, " ")
  s = RemoveString(s, Chr(13)) : s = RemoveString(s, Chr(10))
  s = ReplaceString(s, Chr(10), Chr(182))
  nb  = Len(s) ; Textlänge
  sep = -1 : i = 1 : j = 0 : l = 0 : ns = 0 : nl = 1 : c.s = ""
  
  While ( i < nb ) 
    c = Mid(s,i,1) ; Nächstes Zeichen 
    Select c ; --- aktueller Buchstabe ---
      Case Chr(182) ; Zeilenumbruch
        If pdfWs > 0 : pdfWs = 0 : EndIf
        part = RemoveString(Mid(s,j,i-j), Chr(182))
        If nl = 1
          Text$ + RTrim(part) + Chr(182) + Chr(10)
        ElseIf Right(Trim(part),1) = "-"
          Text$ + Trim(part) + Chr(182) + Chr(10)
        Else
          Text$ + LTrim(part) + Chr(182) + Chr(10)
        EndIf
        i = i + 1 
        sep = -1 : j = i : l = 0 : ns = 0 
        nl= nl +1 
        Continue
      Case " " ; Leerzeichen
        sep = i : ls = l : ns=ns+1 
    EndSelect
    l = l + FontEG\CharWidth[Asc(c)]  ; aktuelle Textbreite
    If l > wMax ; Textzeile zu lang
      If sep = -1 ;{ automatischer Zeilenumbruch
        If i = j ; Anfang = Ende (Textzeile)
          i = i +1 
        EndIf  
        If pdfWs > 0 : pdfWs = 0 : EndIf
        part = Mid(s,j,i-j)
        If nl = 1
          Text$ + RTrim(part) + Chr(10)
        ElseIf Right(Trim(part),1) = "-"
          Text$ + Trim(part) + Chr(10)
        Else
          Text$ + LTrim(part) + Chr(10)
        EndIf
        ;}
      Else 
        If Align = "J" ;{ Blocksatz
          If ns > 1 
            pdfWs = (wMax-ls)/1000*FontEG\Size/(ns-1) 
          Else 
            pdfWs = 0 
          EndIf  
        EndIf ;}
        part = Mid(s,j,sep-j)
        If nl = 1
          Text$ + RTrim(part) + Chr(10)
        ElseIf Right(Trim(part),1) = "-"
          Text$ + Trim(part) + Chr(10)
        Else
          Text$ + LTrim(part) + Chr(10)
        EndIf
        i = sep + 1 
      EndIf 
      sep = -1 : j = i : l = 0 : ns = 0
      nl = nl + 1
      If maxline > 0 And nl > maxline ;{ max. Zeilen überschritten
        If Right(Text$, 1) = Chr(10) : Text$ = Left(Text$, Len(Text$)-1) : EndIf  ; Zeilenumbruch entfernen
        If Right(Text$, 1) = Chr(13) : Text$ = Left(Text$, Len(Text$)-1) : EndIf
        SetGadgetText(GID, Text$) ; Text -> EditorGadget
        Editor_SetCursorPos(GID, CharIdx) ; Cursor auf vorherige Position
        SendMessage_(GadgetID(GID) , #EM_SETMODIFY , 0 , 0) ; Flag (Modify) zurücksetzen
        EGCut = Right(s, Len(s)-i+1)+"|"+Str(maxline)
        ProcedureReturn Right(s, Len(s)-i+1)+"|"+Str(maxline)
      EndIf ;}
    Else 
      i = i + 1 
    EndIf
  Wend
  If pdfWs > 0 : pdfWs = 0 : EndIf ; Rest
  Text$ + LTrim(Mid(s,j,i-j + 1))
  If Right(Text$, 1) = Chr(10) : Text$ = Left(Text$, Len(Text$)-1) : EndIf ; Zeilenumbruch entfernen
  If Right(Text$, 1) = Chr(13) : Text$ = Left(Text$, Len(Text$)-1) : EndIf
  SetGadgetText(GID, Text$) ; Text -> EditorGadget
  Editor_SetCursorPos(GID, CharIdx) ; Cursor auf vorherige Position
  SendMessage_(GadgetID(GID) , #EM_SETMODIFY , 0 , 0) ; Flag (modify) zurücksetzen
  EGCut = "|"+Str(maxline)
  ProcedureReturn EGCut
EndProcedure

Procedure.s GetEditorText(GID.l) ; Text auslesen (autom. Zeilenumbruch entfernen)
  Text$ = ReplaceString(GetGadgetText(GID), #CRLF$, " ")
  ProcedureReturn Trim(ReplaceString(Text$, Chr(10)+" ", Chr(10)))
EndProcedure


;- ===== Fontdefinitionen (WordWrap) =====

DataSection
  Helvetica:
  Data.w  278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278
  Data.w  278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 355, 556
  Data.w  556, 889, 667, 191, 333, 333, 389, 584, 278, 333, 278, 278, 556, 556, 556, 556, 556, 556
  Data.w  556, 556, 556, 556, 278, 278, 584, 584, 584, 556,1015, 667, 667, 722, 722, 667, 611, 778
  Data.w  722, 278, 500, 667, 556, 833, 722, 778, 667, 778, 722, 667, 611, 722, 667, 944, 667, 667
  Data.w  611, 278, 278, 278, 469, 556, 333, 556, 556, 500, 556, 556, 278, 556, 556, 222, 222, 500
  Data.w  222, 833, 556, 556, 556, 556, 333, 500, 278, 556, 500, 722, 500, 500, 500, 334, 260, 334
  Data.w  584, 350, 556, 350, 222, 556, 333,1000, 556, 556, 333,1000, 667, 333,1000, 350, 611, 350
  Data.w  350, 222, 222, 333, 333, 350, 556,1000, 333,1000, 500, 333, 944, 350, 500, 667, 278, 333
  Data.w  556, 556, 556, 556, 260, 556, 333, 737, 370, 556, 584, 333, 737, 333, 400, 584, 333, 333
  Data.w  333, 556, 537, 278, 333, 333, 365, 556, 834, 834, 834, 611, 667, 667, 667, 667, 667, 667
  Data.w 1000, 722, 667, 667, 667, 667, 278, 278, 278, 278, 722, 722, 778, 778, 778, 778, 778, 584
  Data.w  778, 722, 722, 722, 722, 667, 667, 611, 556, 556, 556, 556, 556, 556, 889, 500, 556, 556
  Data.w  556, 556, 278, 278, 278, 278, 556, 556, 556, 556, 556, 556, 556, 584, 611, 556, 556, 556
  Data.w  556, 500, 556, 500
  Times:
  Data.w  250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250
  Data.w  250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 333, 408, 500
  Data.w  500, 833, 778, 180, 333, 333, 500, 564, 250, 333, 250, 278, 500, 500, 500, 500, 500, 500
  Data.w  500, 500, 500, 500, 278, 278, 564, 564, 564, 444, 921, 722, 667, 667, 722, 611, 556, 722
  Data.w  722, 333, 389, 722, 611, 889, 722, 722, 556, 722, 667, 556, 611, 722, 722, 944, 722, 722
  Data.w  611, 333, 278, 333, 469, 500, 333, 444, 500, 444, 500, 444, 333, 500, 500, 278, 278, 500
  Data.w  278, 778, 500, 500, 500, 500, 333, 389, 278, 500, 500, 722, 500, 500, 444, 480, 200, 480
  Data.w  541, 350, 500, 350, 333, 500, 444,1000, 500, 500, 333,1000, 556, 333, 889, 350, 611, 350
  Data.w  350, 333, 333, 444, 444, 350, 500,1000, 333, 980, 389, 333, 722, 350, 444, 722, 250, 333
  Data.w  500, 500, 500, 500, 200, 500, 333, 760, 276, 500, 564, 333, 760, 333, 400, 564, 300, 300
  Data.w  333, 500, 453, 250, 333, 300, 310, 500, 750, 750, 750, 444, 722, 722, 722, 722, 722, 722
  Data.w  889, 667, 611, 611, 611, 611, 333, 333, 333, 333, 722, 722, 722, 722, 722, 722, 722, 564
  Data.w  722, 722, 722, 722, 722, 722, 556, 500, 444, 444, 444, 444, 444, 444, 667, 444, 444, 444
  Data.w  444, 444, 278, 278, 278, 278, 500, 500, 500, 500, 500, 500, 500, 564, 500, 500, 500, 500
  Data.w  500, 500, 500, 500
EndDataSection

Verfasst: 04.04.2008 17:42
von Berti27
Hallo. Danke Thorsten1867
Werde mich gleich nachher mit dem Code befassen.
Habe aber noch ein kleines(?) Problem:
Im Editor-Gadget lässt sich z.B. durch Doppelklick ein Wort markieren.
Wie lässt sich dieser markierte Text auslesen oder durch einen anderen Text ersetzen? Habe im Forum dazu leider nichts gefunden.
Viele Grüße
Berti27

Verfasst: 04.04.2008 17:47
von Thorsten1867
Probiers mal hiermit, aber das funktioniert nur mit Windows:

Code: Alles auswählen

Procedure.l Editor_GetSelLength(GID) ; Länge selektierter Text
  If IsGadget(GID)
    sel.CHARRANGE 
    SendMessage_(GadgetID(GID),$0434,0, @sel) 
    ProcedureReturn sel\cpMax - sel\cpMin 
  EndIf
EndProcedure

Procedure.s Editor_GetSelText(GID) ; selektierten Text ermitteln
  If IsGadget(GID)
    Text$ = Space(Editor_GetSelLength(GID) + 1) 
    SendMessage_(GadgetID(GID), $043E, 0,@Text$) 
    ProcedureReturn Text$
  EndIf
EndProcedure

Code: Alles auswählen

Procedure Editor_Replace(GID, Text$)
  If IsGadget(GID)
    SendMessage_(GadgetID(GID),#EM_REPLACESEL,1,Text$)
  EndIf
EndProcedure