Seite 1 von 2

max. Zeilenzahl im EditorGadget begrenzen.

Verfasst: 27.01.2006 15:27
von Thorsten1867
Ich suche einen Weg die maximale Zeilenzahl (nicht Zeichenzahl!) im EditorGadget zu begrenzen, so dass man nicht mehr Zeilen als erlaubt eingeben kann. Vielleicht kennt ja jemand einer dieser 'geheimnisvollen' API-Befehlen. :wink:

PS: Die Nutzer meines Programmes sind wenig computererfahren und lassen sich von Meldungen wie 'Auf keinen Fall mehr als 5 Zeilen eingeben' nicht davon abhalten 10 oder 15 Zeilen einzugeben und sich dann zu wundern, dass beim Ausdruck die Formularfelder gesprengt werden. :evil:

Re: max. Zeilenzahl im EditorGadget begrenzen.

Verfasst: 27.01.2006 15:41
von Kiffi
> Ich suche einen Weg die maximale Zeilenzahl (nicht Zeichenzahl!) im
> EditorGadget zu begrenzen

äh... ab und an kann man auch mal die Forumssuche bemühen:

http://forums.purebasic.com/german/viewtopic.php?t=6400

(Fast gleichlautender Betreff)

Grüße ... Kiffi

Verfasst: 27.01.2006 15:44
von ts-soft
5 einzeilige StringGadgets reichen nicht?

Verfasst: 27.01.2006 15:59
von Thorsten1867
ts-soft hat geschrieben:5 einzeilige StringGadgets reichen nicht?
Leider nein! Benötige den automatischen Zeilenumbruch!
kiffi hat geschrieben:äh... ab und an kann man auch mal die Forumssuche bemühen:
http://forums.purebasic.com/german/viewtopic.php?t=6400
Die Lösung scheint leider nicht zu funktionieren, habe es gerade noch mal getestet. Beim Erreichen der max. Zeile ist der Text blockiert und man kann nichts mehr eingeben.

Verfasst: 27.01.2006 16:40
von Andreas
Hi Thorsten,

sieh Dir das mal an, so kannst Du die Zeilenanzahl und die Zeichenzahl pro Zeile begrenzen.

Code: Alles auswählen

Global OldEditProc.l

Procedure NewEditProc(wnd,msg,wparam,lparam)
Select msg
    Case #WM_CHAR
       If SendMessage_(wnd,#EM_LINELENGTH,-1,0) > 14
           AddGadgetItem(0,-1,"")
       EndIf
       If SendMessage_(wnd,#EM_GETLINECOUNT,0,0) > 5
          ProcedureReturn 0
       EndIf      
EndSelect
ProcedureReturn CallWindowProc_(OldEditProc,wnd,msg,wparam,lparam)
EndProcedure

If OpenWindow(0,0,0,322,150,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Maximal 5 Zeilen") And CreateGadgetList(WindowID(0)) 
   Editor = EditorGadget(0,8,8,306,133) 
   OldEditProc = SetWindowLong_(Editor,#GWL_WNDPROC,@NewEditProc())
   SetFocus_(Editor)
   Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf 

Verfasst: 27.01.2006 16:57
von Kiffi
> Beim Erreichen der max. Zeile ist der Text blockiert und man kann nichts
> mehr eingeben.

meiner Meinung nach ist es sowieso besser, wenn ich als Anwender im
entsprechenden Gadget frei editieren kann und mit einer dezenten
Meldung darauf hingewiesen werde, wenn ich zuviele Zeilen eingegeben
habe.

Somit kann ich z.B. mit Copy & Paste einen grossen Text in das Gadget
einfügen und diesen dann solange bearbeiten, bist es passt.

Code: Alles auswählen

#frmMain = 0
#EditorGadget = 1
#Label = 2

OpenWindow(#frmMain,0,0,322,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"Maximal 5 Zeilen") 
CreateGadgetList(WindowID(#frmMain))
EditorGadget(#EditorGadget,8,8,306,133)
TextGadget(#Label,8, 150,306,20, "Maximal 5 Zeilen!", #PB_Text_Border | #PB_Text_Center)
 
HideGadget(#Label,1)
  
SetFocus_(GadgetID(#EditorGadget))
  
Repeat
  
  If SendMessage_(GadgetID(#EditorGadget),#EM_GETLINECOUNT,0,0) > 5 
    HideGadget(#Label,0)
  Else
    HideGadget(#Label,1)
  EndIf
  
Until WaitWindowEvent()=#PB_Event_CloseWindow
Grüße ... Kiffi

@Andreas: Deinen Code kann man mit Copy & Paste 'überlisten' ;-)

Verfasst: 27.01.2006 19:39
von edel
Thorsten1867 hat geschrieben:[...]
kiffi hat geschrieben:äh... ab und an kann man auch mal die Forumssuche bemühen:
http://forums.purebasic.com/german/viewtopic.php?t=6400
Die Lösung scheint leider nicht zu funktionieren, habe es gerade noch mal getestet. Beim Erreichen der max. Zeile ist der Text blockiert und man kann nichts mehr eingeben.
Die Loesung stand ganz unten.

Code: Alles auswählen

  Structure gettextlengthex
    flags.l
    CodePage.l
  EndStructure
    
  OpenWindow(0,0,0,500,500,1|#WS_SYSMENU,"")
    
  CreateGadgetList(WindowID())
  EditorGadget(0,10,10,300,355)
  TextGadget(1,315,10,40,20,"1")
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_Gadget
      
      If EventGadgetID() = 0
        
        SendMessage_(GadgetID(0), #EM_EXGETSEL, 0, chrg.CHARRANGE)
        line  = SendMessage_(GadgetID(0), #EM_EXLINEFROMCHAR, 0 , chrg\cpMin)
        
        SetGadgetText(1,Str(line)) 
        
        If line >= 11
          temp.gettextlengthex
          temp\CodePage = #CP_ACP
          bytes = SendMessage_(GadgetID(0),#EM_GETTEXTLENGTHEX,@temp,0)
          SendMessage_(GadgetID(0),#EM_EXLIMITTEXT,0,bytes)
        Else
          SendMessage_(GadgetID(0),#EM_EXLIMITTEXT,0,-1)
        EndIf
        
      EndIf
    ElseIf Event = #WM_KEYDOWN
      
      SendMessage_(GadgetID(0), #EM_EXGETSEL, 0, chrg.CHARRANGE)
      line  = SendMessage_(GadgetID(0), #EM_EXLINEFROMCHAR, 0 , chrg\cpMin)
      
      If line < 11
        SendMessage_(GadgetID(0),#EM_EXLIMITTEXT,0,-1)
      EndIf 
      
      
    EndIf
    
  Until Event = #WM_CLOSE 

Verfasst: 27.01.2006 19:50
von Thorsten1867
hallodri hat geschrieben:Die Loesung stand ganz unten.
Danke! Man kann den Text jetzt ändern, aber auch Zeilenumbrüche kann man nun einfügen und den Code so überlisten.

Ich denke ich werde wohl etwas aus allen Ideen zusammenbasteln. :wink:

Wenn ich eine Möglichkeit finde den Text des Editorgadgets zeilenweise samt Steuerzeichen (#LF$ und #CRLF$) auszulesen, habe ich so eine Idee, die vielleicht funktionieren könnte.

Verfasst: 27.01.2006 19:55
von hardfalcon
BTW: Man kann für Editorgadgets per WinAPI auch das "AutoWrap"-Feature, sprich den automatischen Zeilenumbruch am Ende der Zeile, ein- und ausschalten. Leider hab ich den Code nicht mehr, ich weiss nur noch, dass ich mir da mal zusammen mit zigapeda die Nacht um die Ohren geschlagen hatte, um so was zu finden... <)

Verfasst: 27.01.2006 20:06
von Thorsten1867

Code: Alles auswählen

eg = EditorGadget(#EditorGadget,8,8,306,133) 
SendMessage_(eg, #EM_SETTARGETDEVICE, 0, 0) ; automatischer Zeilenumbruch
Den Code habe ich, aber diese Zeilenumbrüche konnte ich bisher nicht auslesen (nur #CRLF$) und beim zeilenweisem Auslesen werden die #CRLF$ unterschlagen. :cry: