Mehrere Zeilen einrücken?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Mehrere Zeilen einrücken?

Beitrag von PureBasic4.0 »

Hi, Leute

Gibt es eine Art EditorGadget, mit der man mehrere Zeilen einrücken kann (so wie im PB-Editor)? Oder gibt's dafür ne Lib?
Habe mal auf PureArea geschaut und die Scintilla Gadget Library gefunden. Ist das zufällig was für mich? Ich kann es leider nicht ausprobieren (siehe Thread 'Wo bekomme ich die Gadget Extension her?'), weil mir die PureLibrary GadgetExtension fehlt.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

Verstehe ich dich recht das du Zeilen reservieren willst, dann hilft dir das:

Code: Alles auswählen

Procedure AddLines(Gadget,Lines)
 For k=0 To Lines-1
  AddGadgetItem(Gadget,k,"")
 Next
EndProcedure

OpenWindow(0,0,0,300,300,"Test",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
 CreateGadgetList(WindowID(0))
  EditorGadget(0,10,10,280,135)
   AddLines(0,2)
  StringGadget(1,10,155,280,135,"")

Repeat
 Event=WindowEvent()
  If Event=#PB_Event_CloseWindow
   Quit=1
  EndIf
Until Quit=1
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

Nein, das möchte ich nicht machen.

Wenn man mehrere Zeilen markiert und im normalen EditorGadget auf Tab drückt, werden alle Zeilen durch einen Tabstopp ersetzt. Ich möchte aber, dass alle Zeilen (so wie im PureBasic Editor) um einen Tabstopp nach hinten versetzt werden. Irgendwie wird das doch gehen, weil das im PBEditor auch funktioniert.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

Ist eigentlich nicht so schwer zu bewerkstellingen:

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",$C80001)
CreateGadgetList(WindowID(0))
EditorGadget(0,5,5,390,290)

SetGadgetFont(0,LoadFont(0,"Arial",9))

For i=0 To 15
   AddGadgetItem(0,-1,"Lorem ipsum dolor amet veniam quis exercitation")
Next

Global lpPrevFunc

Procedure RichEditProc(hWnd,uMsg,wParam,lParam)
	Select uMsg
		Case #WM_CHAR
		If wParam = #VK_TAB
			SendMessage_(GadgetID(0),#EM_GETSEL,@SelStart,@SelEnd)
			
			If SelEnd-SelStart > 0  
				LineStart = SendMessage_(GadgetID(0),#EM_LINEFROMCHAR,SelStart,0)
				LineEnd = SendMessage_(GadgetID(0),#EM_LINEFROMCHAR,SelEnd,0)
				
				For i=LineStart To LineEnd
					TextLine$ = GetGadgetItemText(0,i,0)
					SetGadgetItemText(0,i,#TAB$ + TextLine$,0)
				Next
				
				ProcedureReturn 0
			EndIf
		EndIf
	EndSelect
     
    ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)
EndProcedure

lpPrevFunc = SetWindowLong_(GadgetID(0),#GWL_WNDPROC,@RichEditProc())

While WaitWindowEvent() ! 16 : Wend
Ist jetzt nur ein Beispiel und kein kompletter Code aber sollte gut zeigen wie man es machen könnte.
Zuletzt geändert von Fluid Byte am 02.05.2007 18:27, insgesamt 2-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag von Andreas_S »

@Fluid Byte

Es hat noch einen kleinen Fehler, der letzte Eintrag bekommt auch einen Abstand nach hinten.
Aber sonst sehr gut!
Benutzeravatar
PureBasic4.0
Beiträge: 785
Registriert: 29.10.2006 17:26
Wohnort: 127.0.0.1

Beitrag von PureBasic4.0 »

wow, danke. ich wusste gar nicht, dass das so einfach geht.
PB 4.50 RC1 + Ubuntu 10.04 LTS + Windows 7 x64
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag von horst »

@Fluid Byte:

Anderes Problem: Gibt es eine Möglichkeit, die Tab-Taste zu "killen", so dass sie beim Editor nicht ankommt?

Nicht generell, sondern ich will, dass nur im EditorGadget, und nur wenn irgendwas markiert ist, nix passiert, sonst aber die Tab-Taste normal funktioniert.

Edit: es geht, wenn man den Editor auf read-only setzt (und dann wieder zurück), aber das ist mir unter verschiedenen Bedingungen zu unsicher.
horst
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

horst hat geschrieben:Gibt es eine Möglichkeit, die Tab-Taste zu "killen", so dass sie beim Editor nicht ankommt?

Nicht generell, sondern ich will, dass nur im EditorGadget, und nur wenn irgendwas markiert ist, nix passiert, sonst aber die Tab-Taste normal funktioniert.

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",$C80001)
CreateGadgetList(WindowID(0))
EditorGadget(0,5,5,390,290)

SetGadgetFont(0,LoadFont(0,"Arial",9))

For i=0 To 15
	AddGadgetItem(0,-1,"Lorem ipsum dolor amet veniam quis exercitation")
Next

Global lpPrevFunc

Procedure RichEditProc(hWnd,uMsg,wParam,lParam)
    Select uMsg
        Case #WM_CHAR
		If wParam = #VK_TAB
			SendMessage_(GadgetID(0),#EM_GETSEL,@SelStart,@SelEnd) 
			
			If SelEnd-SelStart > 0			 			
				ProcedureReturn #False
			EndIf
		EndIf
    EndSelect
     
    ProcedureReturn CallWindowProc_(lpPrevFunc,hWnd,uMsg,wParam,lParam)
EndProcedure

lpPrevFunc = SetWindowLong_(GadgetID(0),#GWL_WNDPROC,@RichEditProc())

While WaitWindowEvent() ! 16 : Wend
PBprogger hat geschrieben:Es hat noch einen kleinen Fehler, der letzte Eintrag bekommt auch einen Abstand nach hinten.
Aber sonst sehr gut!
Korrigiert.
Zuletzt geändert von Fluid Byte am 02.05.2007 18:58, insgesamt 3-mal geändert.
Windows 10 Pro, 64-Bit / Outtakes | Derek
horst
Beiträge: 70
Registriert: 08.09.2004 19:33
Wohnort: München
Kontaktdaten:

Beitrag von horst »

1000 Dank! Es funktioniert.

Wahrscheinlich brauche ich noch eine Stunde um rauszukriegen was da genau passiert...
horst
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

horst hat geschrieben:1000 Dank! Es funktioniert.

Wahrscheinlich brauche ich noch eine Stunde um rauszukriegen was da genau passiert...
Simpel. Du fängst die Nachricht #WM_CHAR mit dem Callback ab. Diese wird gesendet wenn du TAB oder eine andere Taste im Editor drückst. Steigst du nun aus der Prozedur mit "ProcedureReturn 0" aus findet keinerlei Eingabe statt. Benutzt du aber CallWindowProc_() wird die Nachricht an das EditorGadget weitergeleitet und standardmäßig bearbeitet.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Antworten