Seite 1 von 1
Formdesigner für Daten
Verfasst: 05.08.2015 10:54
von marcelx
Hallo,
ich möchte ein "Formdesigner" realisieren für Windows, um Daten anzuzeigen und zum editieren (z.B. aus eine Datenbank).
Eine Art Masken.
Dazu benötige ich so was wie im PB-Form-Designer, wo ich Eingabefelder positionieren kann.
http://www.bilder-upload.eu/show.php?fi ... 792463.jpg
Wo finde ich Informationen darüber ?
Danke und viele Grüße
MarcelX
Re: Formdesigner für Daten
Verfasst: 08.08.2015 11:22
von marcelx
Hallo,
ich habe folgende Code geschrieben:
Code: Alles auswählen
Enumeration
#Window
EndEnumeration
Structure boxInp
x.i
y.i
dx.i
dy.i
id.i
txt.s
EndStructure
Global Dim boxData.boxinp(0)
Procedure newBox(x,y,dx,dy, txt.s, color=$000000)
a = ArraySize(boxData()) + 1 ; next
ReDim boxData(a)
boxData(a)\x=x
boxData(a)\y=y
boxData(a)\dx=dx
boxData(a)\dy=dy
boxData(a)\txt = txt
boxData(a)\id = a
boxData(a)\id = TextGadget(#PB_Any,x,y,dx,dy,txt,#PB_Text_Border|#PB_Text_Center)
EndProcedure
Procedure getBoxId()
winX = WindowMouseX(#Window)
winY = WindowMouseY(#Window)
For i=1 To ArraySize(boxData())
If winX>boxData(i)\x And winX<boxData(i)\x+boxData(i)\dx And winY>boxData(i)\y And winY<boxData(i)\y+boxData(i)\dy
ProcedureReturn i
EndIf
Next
ProcedureReturn -1
EndProcedure
CursorSizing = LoadCursor_(0, #IDC_SIZEALL)
CursorArrow = LoadCursor_(0, #IDC_ARROW)
OpenWindow(#Window, 0, 0, 512, 612, "Test Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
Global mouveBox.i
newBox(20,20,100,20, "Erste")
newBox(40,60,100,20, "Zweite")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #WM_LBUTTONDOWN
mouveBox = #False
nr = getBoxId()
If nr > -1
mouveBox = #True
;SetClassLong_(???,#GCL_HCURSOR,CursorSizing)
dx = WindowMouseX(#Window) - boxData(nr)\x
dy = WindowMouseY(#Window) - boxData(nr)\y
EndIf
Case #WM_MOUSEMOVE
If mouveBox
boxData(nr)\x = WindowMouseX(#Window) - dx
boxData(nr)\y = WindowMouseY(#Window) - dy
ResizeGadget(boxData(nr)\id, boxData(nr)\x,boxData(nr)\y,boxData(nr)\dx,boxData(nr)\dy)
EndIf
Case #WM_LBUTTONUP
mouveBox = #False
;SetClassLong_(???,#GCL_HCURSOR,CursorArrow)
nr=-1
EndSelect
ForEver
Wie kann ich den Mauszeiger als Kreuzdarstellen ?
Gruß
MarcelX
Re: Formdesigner für Daten
Verfasst: 08.08.2015 11:39
von Andesdaf
Re: Formdesigner für Daten
Verfasst: 08.08.2015 11:48
von RSBasic
Der verlinkte Code verändert den Mauscursor global und systemweit.
Lieber so:
Code: Alles auswählen
EnableExplicit
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(1, 10, 10, 100, 20, "Button", 0)
SetClassLongPtr_(GadgetID(1), #GCL_HCURSOR, LoadCursor_(0, #IDC_SIZEALL))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Re: Formdesigner für Daten
Verfasst: 08.08.2015 14:30
von marcelx
Ich habe es (SetClassLongPtr_) eingebaut und so funktioniert es nicht (RSBasic: dein code funktioniert):
Code: Alles auswählen
Enumeration
#Window
#ScrollArea
EndEnumeration
Structure boxInp
x.i
y.i
dx.i
dy.i
id.i
txt.s
EndStructure
Global Dim boxData.boxinp(0)
Procedure newBox(x,y,dx,dy, txt.s, color=$000000)
a = ArraySize(boxData()) + 1 ; next
ReDim boxData(a)
boxData(a)\x=x
boxData(a)\y=y
boxData(a)\dx=dx
boxData(a)\dy=dy
boxData(a)\txt = txt
boxData(a)\id = a
boxData(a)\id = TextGadget(#PB_Any,x,y,dx,dy,txt,#PB_Text_Border|#PB_Text_Center)
EndProcedure
Procedure getBoxId()
winX = WindowMouseX(#Window)
winY = WindowMouseY(#Window)
For i=1 To ArraySize(boxData())
If winX>boxData(i)\x And winX<boxData(i)\x+boxData(i)\dx And winY>boxData(i)\y And winY<boxData(i)\y+boxData(i)\dy
ProcedureReturn i
EndIf
Next
ProcedureReturn -1
EndProcedure
CursorSizing = LoadCursor_(0, #IDC_SIZEALL)
CursorArrow = LoadCursor_(0, #IDC_ARROW)
OpenWindow(#Window, 0, 0, 512, 612, "Test Fenster", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
Global mouveBox.i
newBox(20,20,100,20, "Erste")
newBox(40,60,100,20, "Zweite")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
End
Case #WM_LBUTTONDOWN
mouveBox = #False
nr = getBoxId()
If nr > -1
mouveBox = #True
SetClassLongPtr_(GadgetID(boxData(nr)\id), #GCL_HCURSOR, CursorSizing)
dx = WindowMouseX(#Window) - boxData(nr)\x
dy = WindowMouseY(#Window) - boxData(nr)\y
EndIf
Case #WM_MOUSEMOVE
If mouveBox
boxData(nr)\x = WindowMouseX(#Window) - dx
boxData(nr)\y = WindowMouseY(#Window) - dy
ResizeGadget(boxData(nr)\id, boxData(nr)\x,boxData(nr)\y,boxData(nr)\dx,boxData(nr)\dy)
EndIf
Case #WM_LBUTTONUP
mouveBox = #False
If nr > -1
SetClassLongPtr_(GadgetID(boxData(nr)\id), #GCL_HCURSOR, CursorArrow)
nr=-1
EndIf
EndSelect
ForEver
Re: Formdesigner für Daten
Verfasst: 08.08.2015 14:35
von RSBasic
Warum es nach dem Einbau von SetClassLongPtr_() bei dir nicht funktioniert, liegt daran, dass du TextGadget verwendest.
TextGadget löst standardmäßig keine Events bei Mouseover oder Click aus. Um diese Funktion aktivieren zu können, füge im Flag-Parameter deines TextGadgets die folgende WinAPI-Konstante hinzu: #SS_NOTIFY
Re: Formdesigner für Daten
Verfasst: 08.08.2015 14:51
von marcelx
Danke RSBasic für die Erläuterung.
So funktioniert