max. Zeilenzahl im EditorGadget begrenzen.

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

max. Zeilenzahl im EditorGadget begrenzen.

Beitrag 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:
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: max. Zeilenzahl im EditorGadget begrenzen.

Beitrag 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
a²+b²=mc²
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 »

5 einzeilige StringGadgets reichen nicht?
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: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.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Andreas
ToolbarKönig
Beiträge: 142
Registriert: 08.09.2004 08:33

Beitrag 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 
Gruss Andreas
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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' ;-)
a²+b²=mc²
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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 
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von Thorsten1867 am 27.01.2006 19:56, insgesamt 1-mal geändert.
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Benutzeravatar
hardfalcon
Beiträge: 3447
Registriert: 29.08.2004 20:46

Beitrag 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... <)
Benutzeravatar
Thorsten1867
Beiträge: 1360
Registriert: 04.02.2005 15:40
Computerausstattung: [Windows 10 x64] [PB V5.7x]
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag 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:
Download of PureBasic - Module
Download of PureBasic - Programmes

[Windows 11 x64] [PB V6]

Bild
Antworten