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
http://www.rsbasic.de/aktualisierung/wi ... A4ndern.pb

der gesuchte Cursor ist #IDC_SIZEALL.

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