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
Formdesigner für Daten
Formdesigner für Daten
Win-10, PB 5.31 (Windows - x86)
Re: Formdesigner für Daten
Hallo,
ich habe folgende Code geschrieben:
Wie kann ich den Mauszeiger als Kreuzdarstellen ?
Gruß
MarcelX
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
Gruß
MarcelX
Win-10, PB 5.31 (Windows - x86)
Re: Formdesigner für Daten
Win11 x64 | PB 6.20
Re: Formdesigner für Daten
Der verlinkte Code verändert den Mauscursor global und systemweit.
Lieber so:
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
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
Win-10, PB 5.31 (Windows - x86)
Re: Formdesigner für Daten
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
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
Danke RSBasic für die Erläuterung.
So funktioniert
So funktioniert
Win-10, PB 5.31 (Windows - x86)