Formdesigner für Daten

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Formdesigner für Daten

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Formdesigner für Daten

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Formdesigner für Daten

Beitrag von Andesdaf »

http://www.rsbasic.de/aktualisierung/wi ... A4ndern.pb

der gesuchte Cursor ist #IDC_SIZEALL.
Win11 x64 | PB 6.20
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Formdesigner für Daten

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Formdesigner für Daten

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Formdesigner für Daten

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Formdesigner für Daten

Beitrag von marcelx »

Danke RSBasic für die Erläuterung.
So funktioniert
Win-10, PB 5.31 (Windows - x86)
Antworten