max. Zeilenzahl im EditorGadget begrenzen.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Thorsten1867 hat geschrieben: und beim zeilenweisem Auslesen werden die #CRLF$ unterschlagen. :cry:
Da wird nichts unterschlagen :wink:
Es sind ja keine Zeilenumbrüche vorhanden im Text, es wird nur ein Umbruch dargestellt, rein visuell
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

ts-soft hat geschrieben:Da wird nichts unterschlagen :wink:
Es sind ja keine Zeilenumbrüche vorhanden im Text, es wird nur ein Umbruch dargestellt, rein visuell
Wenn ich es mit GetGadgetText() auslese, sind die manuell eingefügten Zeilenumbrüche vorhanden, bei GetGadgetItemText() aber nicht ???
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von Thorsten1867 »

Ich teste gerade einen völlig anderen Ansatz. Ich fürchte, das ist eine sehr radikale Methode, aber vielleicht lässt sie sich ja noch verfeinern. :wink:

Code: Alles auswählen

#frmMain = 0 
#EditorGadget = 1 

Procedure LastLineEG(GID) 
  sel.CHARRANGE 
  sel\cpMin = SendMessage_(GadgetID(GID), #EM_LINEINDEX, LineStart, 0) + CharStart - 1 
  If LineEnd = -1 
    LineEnd = SendMessage_(GadgetID(GID), #EM_GETLINECOUNT, 0, 0)-1 
  EndIf 
  sel\cpMax = SendMessage_(GadgetID(GID), #EM_LINEINDEX, LineEnd, 0)  
  If CharEnd = -1 
    sel\cpMax + SendMessage_(GadgetID(GID), #EM_LINELENGTH, sel\cpMax, 0) 
  Else 
    sel\cpMax + CharEnd - 1 
  EndIf 
  SendMessage_(GadgetID(GID), #EM_EXSETSEL, 0, @sel) 
EndProcedure

Procedure LimitEGRows(GID.l, max.b)
  If IsGadget(GID)
    anz = CountGadgetItems(GID)
    zeile = -1
    For r = 0 To anz-1 ; Auf Leerzeilen testen
      zeile + 1
      If Trim(GetGadgetItemText(GID, zeile, #Null)) = ""
        RemoveGadgetItem(GID, zeile)
        zeile - 1
      EndIf
    Next 
    anz = CountGadgetItems(GID)
    If anz > max
      For r = anz-1 To max Step -1
        RemoveGadgetItem(GID, r)
      Next r
      text$ = GetGadgetText(GID)
      If Right(text$,2) = #CRLF$
        SetGadgetText(GID, Left(text$, Len(text$)-2))
      EndIf
      LastLineEG(GID) 
    EndIf
    SetFocus_(GadgetID(GID))
  EndIf
EndProcedure

OpenWindow(#frmMain,0,0,200,100,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Maximal 5 Zeilen") 
CreateGadgetList(WindowID(#frmMain)) 
eg = EditorGadget(#EditorGadget,8,8,184,84) 
SendMessage_(eg, #EM_SETTARGETDEVICE, 0, 0) ; automatischer Zeilenumbruch
SendMessage_(eg, #EM_SHOWSCROLLBAR, #SB_VERT, #False) ; kein Scrollbar
SetFocus_(eg) 
  
Repeat 
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadgetID()
        Case #EditorGadget
          If CountGadgetItems(#EditorGadget) > 5
            MessageRequester(" Zeilenzahl begrenzen", "Der Text ist zu lang!", #MB_OK|#MB_ICONWARNING)
            LimitEGRows(#EditorGadget, 5)
          EndIf
      EndSelect
    Case #PB_Event_CloseWindow
    quitWindow = 1 
  EndSelect
Until quitWindow
Zuletzt geändert von Thorsten1867 am 27.01.2006 22:13, insgesamt 2-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

ich meinte, wenn du dieses:

Code: Alles auswählen

SendMessage_(eg, #EM_SETTARGETDEVICE, 0, 0) ; automatischer Zeilenumbruch
verwendest, existiert der Zeilenumbruch nur in der Ansicht, aber nicht im Text, also nur visuell
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten