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.
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.

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!
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:[...]
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.
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.
