Dialog Fenster FormDataWindow

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Dialog Fenster FormDataWindow

Beitrag von mk-soft »

Aus einer Anfrage aus dem Forum habe ich mal angefangen ein automatisches Dialog Fenster zu erstellen

Der Inhalt des Dialoges wird aus einer DataSection oder aus Ladbare Textdatei oder XML Datei erstellt.
Die Übergabe der Daten erfolgt über ein Zeiger auf einer festen Struktur.

Die Aufteilung der Gadget erfolgt über Zeilenposition (Row) und Spaltenposition (Column). Die Größe der Gadget erfolgt über Zeilenanzahl (RowSize) und Spaltenanzahl (ColumnSize). Nicht in Pixel. Die erforderlicher Fenstergröße wird berechnet.
Der Startwert wird über "Contents" eingetragen und nach Eingabe (Button Ok) über "Retval" und "Value" zurückgegeben.

Die Übernahme der Daten wird mit dem Event "#MyEvent_FormDataOk" mitgeteilt. Die Quelle der Daten (Zeiger auf die Datenstruktur) erhält man mit EventData() und kann über die ID Kennungen zugewiesen werden.

Update v1.03.1
- Kompilerfehler x86 korrigiert
- Kennungen angepasst: DataID, FieldID
- Index FieldID (Map) für schnellen zu hinzugefügt
- SetFormDataContents hinzugefügt
- GetFormDataRetval und GetFormDataValue hinzugefügt
- TXT und XML Beispiel Datei angepasst

Update v1.04.0
- Anpassung Spaltenbreite
- Linux Anpassung erforderliche Gadget Größe

Update v1.04.1
- Hinzugefügt Type "Text"
- Hinzugefügt SetFormDataSelection(...)

Update v1.04.2
- Fix Tippfehler

FormDataWindow

Code: Alles auswählen

;-TOP

; Comment : FormDataWindow
; Author  : mk-soft
; Version : v1.04.2
; Create  : 12.03.2021
; Update  : 14.03.2021

; Link    : https://www.purebasic.fr/german/viewtopic.php?f=8&t=32303

; ********************

EnableExplicit

; Ereignis Events von FormDataWindow definieren
Enumeration #PB_Event_FirstCustomValue
  #MyEvent_FormDataOk
  #MyEvent_FormDataCancel
EndEnumeration

; Strukturen

Structure udtFormHeaderData
  DataID.s        ; Daten Tabellen Kennung (z.B. SQL Tabellen Name)
  Caption.s       ; Titel
  Database.s      ; SQL Datebank
  Table.s         ; SQL Tabelle
EndStructure

Structure udtFormFieldData
  ; Daten
  FieldID.s       ; Daten Feld Kennung (z.B. SQL Feld Name)
  Type.s          ; EA Type
  Caption.s       ; Beschriftung
  Contents.s      ; Startwert (z.B. SQL aus SQL Abfrage)
  Retval.s        ; Rückgabewert aus Formular (String)
  Value.i         ; Rückgabewert aus Formular (Integer)
  ; Position und breite 
  Row.i           ; Zeile
  RowSize.i       ; Anzahl Zeilen
  Column.i        ; Spalte
  ColumnSize.i    ; Anzahl Spalten
  ; Combobox Inhalt
  List Selection.s()
  ; Intern Gadgets
  CaptionGadget.i ; EA Feld Beschreibung
  EAGadget.i      ; EA Feld
EndStructure

Structure udtFormData
  ; Daten
  Header.udtFormHeaderData
  List FieldData.udtFormFieldData() ; EA Gadgets
  ; Index
  Map *FieldID.udtFormFieldData()   ; Schnellzugriff auf FieldData
  ; Intern Fenster
  Lock.i          ; Zugriffsperre
  Window.i        ; Fenster ID
  GadgetOk.i      ; Button Ok ID
  GadgetCancel.i  ; Button Abbruch ID
  ; SQL Zugriff Hilfsdaten
  DatabaseID.i
  RecID.i
EndStructure

; ----

Declare DoEventFormDataOk()
Declare DoEventFormDataCancel()
Declare DoEventFormDataCloseWindow()
Declare LoadFormData(List FormData.s(), *Data.udtFormData)

;- FormDataWindow Events

; ---- Ereignis Button Ok

Procedure DoEventFormDataOk()
  Protected Window = EventWindow()
  Protected *Data.udtFormData = GetWindowData(Window)
  
  ; Daten aus dem Gadgets übernehmen
  With *Data\FieldData()
    ForEach *Data\FieldData()
      Select GadgetType(\EAGadget)
        Case #PB_GadgetType_String, #PB_GadgetType_Editor
          \Retval = GetGadgetText(\EAGadget)
        Case #PB_GadgetType_ComboBox
          \Retval = GetGadgetText(\EAGadget)
          \Value = GetGadgetState(\EAGadget)
        Case #PB_GadgetType_CheckBox
          \Retval = Str(GetGadgetState(\EAGadget))
          \Value = GetGadgetState(\EAGadget)
        Case #PB_GadgetType_Date
          \Retval = GetGadgetText(\EAGadget)
          \Value = GetGadgetState(\EAGadget)
      EndSelect
    Next
  EndWith
  With *Data
    \Lock = #False
    UnbindGadgetEvent(\GadgetOk, @DoEventFormDataOk())
    UnbindGadgetEvent(\GadgetCancel, @DoEventFormDataCancel())
    UnbindEvent(\Window, @DoEventFormDataCloseWindow())
  EndWith
  PostEvent(#MyEvent_FormDataOk, 0, 0, 0, *Data)
  CloseWindow(Window)
EndProcedure

; ---- Ereignis Button Abbruch

Procedure DoEventFormDataCancel()
  Protected Window = EventWindow()
  Protected *Data.udtFormData = GetWindowData(Window)
  With *Data
    \Lock = #False
    UnbindGadgetEvent(\GadgetOk, @DoEventFormDataOk())
    UnbindGadgetEvent(\GadgetCancel, @DoEventFormDataCancel())
    UnbindEvent(\Window, @DoEventFormDataCloseWindow())
  EndWith
  PostEvent(#MyEvent_FormDataCancel, 0, 0, 0, *Data)
  CloseWindow(Window)
EndProcedure

; ---- Ereignis Fenster schließen

Procedure DoEventFormDataCloseWindow()
  Protected r1
  Protected Window = EventWindow()
  Protected *Data.udtFormData = GetWindowData(Window)
  With *Data
    r1 = MessageRequester(\Header\Caption, 
                          "Schließen ohne zu speichern?", 
                          #PB_MessageRequester_YesNo | #PB_MessageRequester_Warning)
    If r1 = #PB_MessageRequester_Yes
      \Lock = #False
      UnbindGadgetEvent(\GadgetOk, @DoEventFormDataOk())
      UnbindGadgetEvent(\GadgetCancel, @DoEventFormDataCancel())
      UnbindEvent(\Window, @DoEventFormDataCloseWindow())
      PostEvent(#MyEvent_FormDataCancel, 0, 0, 0, *Data)
      CloseWindow(Window)
    EndIf
  EndWith
EndProcedure

; ----

;- FormDataWindow erstellen

Procedure OpenFormDataWindow(x, y, Titel.s, *Data.udtFormData, ParendID = 0)
  Protected Window, Width, Height
  Protected max_rows, max_columns 
  Protected row_height, row_top, row_bottom
  Protected column_width, column_left, column_right
  Protected gd_caption_x, gd_caption_y, gd_caption_height
  Protected gd_x, gd_y, gd_height, gd_width, gd_count
  
  ; Doppelte öffnen verhindern
  If *Data\Lock
    ProcedureReturn 0
  Else
    *Data\Lock = #True
  EndIf
  
  ; Basis breiten und höhen
  row_top = 8
  row_bottom = 4
  row_height = 56
  
  column_left = 8
  column_right = 8
  column_width = 128
  
  gd_count = ListSize(*Data\FieldData())
  
  With *Data\FieldData()
    
    ; Anzahl Zeilen und Spalten übernehmen
    ForEach *Data\FieldData()
      If max_rows < \Row + \RowSize - 1
        max_rows = \Row + \RowSize - 1
      EndIf
      If max_columns < \Column + \ColumnSize - 1
        max_columns = \Column + \ColumnSize - 1
      EndIf
    Next
    
    ; Fenstergröße berechnen
    Width = column_left + (column_width + column_right) * max_columns 
    If Width < 248
      Width = 248
    EndIf
    Height = row_height * max_rows + 48
    
    ; Fenster öffnen
    Window = OpenWindow(#PB_Any, x, y, Width, Height, Titel, #PB_Window_SystemMenu, ParendID)
    If Window
      ; Gadget anlegen
      ForEach *Data\FieldData()
        ; Gadget Breite berechnen
        If \ColumnSize = 1
          gd_width = column_width
        Else
          gd_width = (column_width * \ColumnSize) + (column_right * (\ColumnSize - 1))
        EndIf
        ; Gadget Caption Position und Höhe berechnen
        gd_caption_x = column_left + (column_width + column_right) * (\Column - 1)
        gd_caption_y = row_top + row_height * (\Row - 1)
        gd_caption_height = row_height / 2 - row_top
        ; Gadget EA Position und Höhe berechnen
        gd_x = gd_caption_x
        gd_y = gd_caption_y + (row_height / 2) - row_bottom
        gd_height = (row_height * \RowSize) - (row_height / 2) - row_bottom
        ; Gadget nach Type anlegen
        Select UCase(\Type)
          Case "TEXT"
            \CaptionGadget = TextGadget(#PB_Any, gd_caption_x, gd_caption_y, gd_width, gd_caption_height, \Caption)
            ContainerGadget(#PB_Any, gd_x, gd_y, gd_width, gd_height, #PB_Container_Flat)
            \EAGadget = TextGadget(#PB_Any, 2, 2, gd_width - 4, gd_height - 4, \Contents)
            CloseGadgetList()
          Case "STRING"
            \CaptionGadget = TextGadget(#PB_Any, gd_caption_x, gd_caption_y, gd_width, gd_caption_height, \Caption)
            \EAGadget = StringGadget(#PB_Any, gd_x, gd_y, gd_width, gd_height, \Contents)
            
          Case "EDITOR"
            \CaptionGadget = TextGadget(#PB_Any, gd_caption_x, gd_caption_y, gd_width, gd_caption_height, \Caption)
            \EAGadget = EditorGadget(#PB_Any, gd_x, gd_y, gd_width, gd_height)
            SetGadgetText(\EAGadget, \Contents)
            
          Case "COMBOBOX"
            \CaptionGadget = TextGadget(#PB_Any, gd_caption_x, gd_caption_y, gd_width, gd_caption_height, \Caption)
            \EAGadget = ComboBoxGadget(#PB_Any, gd_x, gd_y, gd_width, gd_height);, #PB_ComboBox_Editable)
            CompilerIf #PB_Compiler_OS = #PB_OS_Linux
              ResizeGadget(\EAGadget, #PB_Ignore, #PB_Ignore, #PB_Ignore, GadgetHeight(\EAGadget, #PB_Gadget_RequiredSize))
            CompilerEndIf

            ForEach \Selection()
              AddGadgetItem(\EAGadget, -1, \Selection())
            Next
            SetGadgetText(\EAGadget, \Contents)
            
          Case "CHECKBOX"
            \CaptionGadget = TextGadget(#PB_Any, gd_caption_x, gd_caption_y, gd_width, gd_caption_height, "")
            \EAGadget = CheckBoxGadget(#PB_Any, gd_x, gd_y, gd_width, gd_height, \Caption)
            SetGadgetState(\EAGadget, Val(\Contents))
            
          Case "DATE"
            \CaptionGadget = TextGadget(#PB_Any, gd_caption_x, gd_caption_y, gd_width, gd_caption_height, \Caption)
            \EAGadget = DateGadget(#PB_Any, gd_x, gd_y, gd_width, gd_height, "%dd.%mm.%yyyy", Val(\Contents))
            CompilerIf #PB_Compiler_OS = #PB_OS_Linux
              ResizeGadget(\EAGadget, #PB_Ignore, #PB_Ignore, gd_width * 0.9, GadgetHeight(\EAGadget, #PB_Gadget_RequiredSize))
            CompilerEndIf
            
        EndSelect
      Next
      
      ; Daten Zeiger im Fenster speichern
      SetWindowData(Window, *Data)
      
      ; Buttons anlegen
      *Data\GadgetOk = ButtonGadget(#PB_Any, Width - 212, Height - 40, 96, 32, "Ok")
      *Data\GadgetCancel = ButtonGadget(#PB_Any, Width - 104, Height - 40, 96, 32, "Abbruch")
      
      ; Events zuweisen
      BindGadgetEvent(*Data\GadgetOk, @DoEventFormDataOk())
      BindGadgetEvent(*Data\GadgetCancel, @DoEventFormDataCancel())
      BindEvent(#PB_Event_CloseWindow, @DoEventFormDataCloseWindow(), Window)
      
    EndIf
  EndWith
  
EndProcedure

; ----

;- Form Daten laden

Procedure LoadFormDataFromDataSection(*FormDataSection, *Data.udtFormData)
  Protected text.s 
  Protected NewList FormData.s()
  
  ; Trick Restore Label über Parameter
  CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
    !MOV    rax,qword [p.p_FormDataSection]
    !MOV    qword [PB_DataPointer],rax
  CompilerElse
    !MOV    eax,dword [p.p_FormDataSection]
    !MOV    dword [PB_DataPointer],eax
  CompilerEndIf
  
  Repeat
    Read.s text
    If text = #ETX$
      Break
    Else
      AddElement(FormData())
      FormData() = text
    EndIf
  ForEver
  If ListSize(FormData())
    ProcedureReturn LoadFormData(FormData(), *Data)
  Else
    ProcedureReturn 0
  EndIf
  
EndProcedure

; ----

Procedure LoadFormDataFromTextFile(FileName.s, *Data.udtFormData)
  Protected file, bom, text.s 
  Protected NewList FormData.s()
  
  file = ReadFile(#PB_Any, FileName)
  If Not file
    ProcedureReturn 0
  EndIf
  
  bom = ReadStringFormat(file)
  While Not Eof(file)
    text = Trim(ReadString(file, bom))
    If Bool(text)
      AddElement(FormData())
      FormData() = text
    EndIf
  Wend
  CloseFile(file)
  
  If ListSize(FormData())
    ProcedureReturn LoadFormData(FormData(), *Data)
  Else
    ProcedureReturn 0
  EndIf
  
EndProcedure

; ----

Procedure LoadFormDataFromXMLFile(FileName.s, *Data.udtFormData)
  Protected xml
  
  If FileSize(FileName) > 0
    xml = LoadXML(#PB_Any, FileName)
    If xml And XMLStatus(xml) = #PB_XML_Success
      ExtractXMLStructure(MainXMLNode(xml), *Data, udtFormData, #PB_XML_NoCase)
      FreeXML(xml)
      ; Validierung Gadget Daten
      With *Data\FieldData()
        ForEach *Data\FieldData()
          If \Row <= 0
            \Row = 1
          EndIf
          If \RowSize <= 0
            \RowSize = 1
          EndIf
          If \Column <= 0
            \Column = 1
          EndIf
          If \ColumnSize <= 0
            \ColumnSize = 1
          EndIf
        Next
      EndWith
      ; Index erstellen
      ForEach *Data\FieldData()
        AddMapElement(*Data\FieldID(), UCase(*Data\FieldData()\FieldID))
        *Data\FieldID() = *Data\FieldData()
      Next
      
      ProcedureReturn #True
    EndIf
  EndIf
  ProcedureReturn #False
EndProcedure

; ----

Procedure LoadFormData(List FormData.s(), *Data.udtFormData)
  Protected text.s, utext.s, feld.s, wert.s, header, fields, selection
  
  ClearList(*Data\FieldData())
  
  ForEach FormData()
    text = FormData()
    
    utext = UCase(text)
    If utext = "BEGINHEADER"
      header = #True
      fields = #False
      selection = #False
      Continue
    EndIf
    
    If utext = "ENDHEADER"
      header = #False
      fields = #False
      selection = #False
      Continue
    EndIf
    
    If utext = "BEGINFIELDS"
      header = #False
      fields = #True
      selection = #False
      Continue
    EndIf
    
    If utext = "ENDFIELDS"
      header = #False
      fields = #False
      selection = #False
      Continue
    EndIf
    
    If fields And utext = "BEGINSELECTION"
      selection = #True
      Continue
    EndIf
    
    If fields And utext = "ENDSELECTION"
      selection = #False
      Continue
    EndIf
    
    If header
      feld = UCase(StringField(text, 1, "="))
      wert = StringField(text, 2, "=")
      Select feld
        Case "DATAID"
          *Data\Header\DataID = wert
        Case "CAPTION"
          *Data\Header\Caption = wert
        Case "DATABASE"
          *Data\Header\Database = wert
        Case "TABLE"
          *Data\Header\Table = wert
      EndSelect
    EndIf
    
    If fields
      With *Data\FieldData()
        If Not selection
          feld = UCase(StringField(text, 1, "="))
          wert = StringField(text, 2, "=")
          Select feld
            Case "FIELDID"
              AddElement(*Data\FieldData())
              \FieldID = wert
            Case "TYPE"
              \Type = wert
              
            Case "CAPTION"
              \Caption = wert
              
            Case "CONTENTS"
              \Contents = wert
              
            Case "ROW"
              \Row = Val(wert)
              
            Case "ROWSIZE"
              \RowSize = Val(wert)
              
            Case "COLUMN"
              \Column = Val(wert)
              
            Case "COLUMNSIZE"
              \ColumnSize = Val(wert)
              
          EndSelect
        Else
          AddElement(\Selection())
          \Selection() = text
        EndIf
      EndWith
    EndIf
    
  Next
  
  ; Validierung Gadget Daten
  With *Data\FieldData()
    ForEach *Data\FieldData()
      If \Row <= 0
        \Row = 1
      EndIf
      If \RowSize <= 0
        \RowSize = 1
      EndIf
      If \Column <= 0
        \Column = 1
      EndIf
      If \ColumnSize <= 0
        \ColumnSize = 1
      EndIf
    Next
  EndWith
  
  ; Index erstellen
  ForEach *Data\FieldData()
    AddMapElement(*Data\FieldID(), UCase(*Data\FieldData()\FieldID))
    *Data\FieldID() = *Data\FieldData()
  Next
  
  ProcedureReturn #True
  
EndProcedure

; ----

;- Form Daten Zugriff über FieldID

Procedure SetFormDataContents(*Data.udtFormData, FieldID.s, Contents.s)
  If FindMapElement(*Data\FieldID(), UCase(FieldID))
    *Data\FieldID()\Contents = Contents
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure SetFormDataSelection(*Data.udtFormData, FieldID.s, List Selection.s())
  
  If FindMapElement(*Data\FieldID(), UCase(FieldID))
    ClearList(*Data\FieldID()\Selection())
    ForEach Selection()  
      AddElement(*Data\FieldID()\Selection())
      *Data\FieldID()\Selection() = Selection()
    Next
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure.s GetFormDataRetval(*Data.udtFormData, FieldID.s)
  If FindMapElement(*Data\FieldID(), UCase(FieldID))
    ProcedureReturn *Data\FieldID()\Retval
  EndIf
EndProcedure

Procedure.i GetFormDataValue(*Data.udtFormData, FieldID.s)
  If FindMapElement(*Data\FieldID(), UCase(FieldID))
    ProcedureReturn *Data\FieldID()\Value
  EndIf
EndProcedure

; ----

;- Vorlage Form Daten auswerten

Procedure GetFormData_Template(*Data.udtFormData)
  ; Hier kommen von allen FormDataWindow bei Button Ok die Daten an
  ; Über die Datentabellen Kennung werden die Daten zuwiesen
  
  Select UCase(*Data\Header\DataID)
    Case "NameOfDataID"
      ;TODO
      
    Default
      Debug "Datentabellen Kennung: " + *Data\Header\DataID
      ForEach *Data\FieldData()
        Debug "FieldID = " + *Data\FieldData()\FieldID + " / Retval = " + *Data\FieldData()\Retval + " / Value = " + *Data\FieldData()\Value
      Next
  EndSelect
  
EndProcedure

; ********

CompilerIf #PB_Compiler_IsMainFile
  
  ;-Beispiel
  
  Define *Data.udtFormData, filename.s, index
  Define NewList MySelection.s()
  
  Global MyData1.udtFormData
  Global MyData2.udtFormData
  Global MyDataTXT.udtFormData
  Global MyDataXML.udtFormData
  
  Procedure GetFormData(*Data.udtFormData)
    ; Hier kommen von allen FormDataWindow bei Button Ok die Daten an
    ; Über die Datentabellen Kennung werden die Daten zuwiesen
    
    Select UCase(*Data\Header\DataID)
      Case "TABELLE1"
        Debug "Daten von "+ *Data\Header\DataID
        Debug "Text = " + GetFormDataRetval(*Data, "Info")
        Debug "Datum = " + GetFormDataRetval(*Data, "Datum")
        Debug "Uhrzeit = " + GetFormDataRetval(*Data, "Uhrzeit") + " / Index = " + GetFormDataValue(*Data, "Uhrzeit")
        ; etc
        
      Default
        Debug "Datentabellen Kennung: " + *Data\Header\DataID
        ForEach *Data\FieldData()
          Debug "FieldID = " + *Data\FieldData()\FieldID + " / Retval = " + *Data\FieldData()\Retval + " / Value = " + *Data\FieldData()\Value
        Next
    EndSelect
    
  EndProcedure

  LoadFormDataFromDataSection(?FormData1, @MyData1)
  LoadFormDataFromDataSection(?FormData2, @MyData2)
  
  ; Eigene Selection erstellen
  AddElement(MySelection())
  MySelection() = "Auswahl"
  For index = 0 To 23  
    AddElement(MySelection())
    MySelection() = RSet(Str(index), 2, "0") + ":00"
    AddElement(MySelection())
    MySelection() = RSet(Str(index), 2, "0") + ":30"
  Next
  
  If OpenWindow(1, #PB_Ignore, #PB_Ignore, 600, 400, "Test FormData", #PB_Window_SystemMenu)
    CreateMenu(0, WindowID(1))
    MenuTitle("Ablage")
    MenuItem(1, "Daten 1")
    MenuItem(2, "Daten 2")
    MenuBar()
    MenuItem(3, "Lade Form (txt)")
    MenuItem(4, "Lade Form (xml)")
    
    Repeat
      Select WaitWindowEvent()
        Case #PB_Event_CloseWindow
          Select EventWindow()
            Case 1
              Break
              
          EndSelect
          
        Case #PB_Event_Menu
          Select EventMenu()
            Case 1
              ; Daten füllen
              SetFormDataContents(MyData1, "Textfeld", "Hallo Welt")
              ; ComboBox nachträglich füllen
              SetFormDataSelection(MyData1, "Uhrzeit", MySelection())
              ; Form öffnen
              OpenFormDataWindow(#PB_Ignore, #PB_Ignore, MyData1\Header\Caption, @MyData1, WindowID(1))
              
            Case 2
              OpenFormDataWindow(#PB_Ignore, #PB_Ignore, MyData2\Header\Caption, @MyData2, WindowID(1))
              
            Case 3
              filename = OpenFileRequester("Lade Form TextFile", "", "Textfile|*.txt", 1)
              If filename
                If LoadFormDataFromTextFile(filename, MyDataTXT)
                  OpenFormDataWindow(#PB_Ignore, #PB_Ignore, MyDataTXT\Header\Caption, @MyDataTXT, WindowID(1))
                EndIf
              EndIf
              
            Case 4
              filename = OpenFileRequester("Lade Form XMLFile", "", "XMLFile|*.XML", 1)
              If filename
                If LoadFormDataFromXMLFile(filename, MyDataXML)
                  OpenFormDataWindow(#PB_Ignore, #PB_Ignore, MyDataXML\Header\Caption, @MyDataXML, WindowID(1))
                EndIf
              EndIf
            
          EndSelect
          
        Case #MyEvent_FormDataOk
          *Data = EventData()
          GetFormData(*Data)
          
        Case #MyEvent_FormDataCancel
          Debug "Abbruch"
          
      EndSelect
      
    ForEver
    
  EndIf
  
  ; ----
  
  DataSection
    
    ;- Form Daten Fenster 1
    FormData1:
    Data.s "BeginHeader"
    
    Data.s "DataID=Tabelle1"
    Data.s "Caption=Formular Beispiel 1"
    
    Data.s "EndHeader"
    
    Data.s "BeginFields"
    
    Data.s "FieldID=Info" ; FieldID muss immer als erstes stehen
    Data.s "Type=String"
    Data.s "Caption=Information"
    Data.s "Contents=Startwert"
    Data.s "Row=1"
    Data.s "RowSize=1"
    Data.s "Column=1"
    Data.s "ColumnSize=3"
    
    Data.s "FieldID=Datum"
    Data.s "Type=Date"
    Data.s "Caption=Datum"
    Data.s "Contents=0"
    Data.s "Row=2"
    Data.s "RowSize=1"
    Data.s "Column=1"
    Data.s "ColumnSize=1"
    
    Data.s "FieldID=Uhrzeit"
    Data.s "Type=ComboBox"
    Data.s "Caption=Uhrzeit"
    Data.s "Contents=Auswahl"
    Data.s "Row=2"
    Data.s "RowSize=1"
    Data.s "Column=2"
    Data.s "ColumnSize=1"
    Data.s "BeginSelection"
    Data.s "Keine"
    Data.s "EndSelection"
    
    Data.s "FieldID=Aktiv"
    Data.s "Type=CheckBox"
    Data.s "Caption=Aktivieren"
    Data.s "Contents=0"
    Data.s "Row=2"
    Data.s "RowSize=1"
    Data.s "Column=3"
    Data.s "ColumnSize=1"
    
    Data.s "FieldID=Kommentar"
    Data.s "Type=Editor"
    Data.s "Caption=Kommentar"
    Data.s "Row=3"
    Data.s "RowSize=4"
    Data.s "Column=1"
    Data.s "ColumnSize=3"
    
    Data.s "EndFields"
    Data.s #ETX$
    Data.i 0
    
    ;- Form Daten Fenster 2
    FormData2:
    Data.s "BeginHeader"
    
    Data.s "DataID=Tabelle2"
    Data.s "Caption=Formular Beispiel 2"
    
    Data.s "EndHeader"
    
    Data.s "BeginFields"
    
    Data.s "FieldID=Nachname"
    Data.s "Type=String"
    Data.s "Caption=Nachname"
    Data.s "Contents=Mustermann"
    Data.s "Row=1"
    Data.s "RowSize=1"
    Data.s "Column=1"
    Data.s "ColumnSize=2"
    
    Data.s "FieldID=Vorname"
    Data.s "Type=String"
    Data.s "Caption=Vorname"
    Data.s "Contents=Peter"
    Data.s "Row=1"
    Data.s "RowSize=1"
    Data.s "Column=3"
    Data.s "ColumnSize=2"
    
    Data.s "FieldID=Anrede"
    Data.s "Type=ComboBox"
    Data.s "Caption=Anrede"
    Data.s "Contents=Wählen"
    Data.s "BeginSelection"
    Data.s "Wählen"
    Data.s "Herr"
    Data.s "Frau"
    Data.s "EndSelection"
    Data.s "Row=2"
    Data.s "RowSize=1"
    Data.s "Column=1"
    Data.s "ColumnSize=1"
    
    Data.s "FieldID=Stand"
    Data.s "Type=ComboBox"
    Data.s "Caption=Stand"
    Data.s "Contents=Wählen"
    Data.s "Row=2"
    Data.s "RowSize=1"
    Data.s "Column=2"
    Data.s "ColumnSize=2"
    Data.s "BeginSelection"
    Data.s "Wählen"
    Data.s "Single"
    Data.s "Partnerschaft"
    Data.s "Verheiratet"
    Data.s "EndSelection"
    
    Data.s "FieldID=Datum"
    Data.s "Type=Date"
    Data.s "Caption=Geburtsdatum"
    Data.s "Contents=0"
    Data.s "Row=2"
    Data.s "RowSize=1"
    Data.s "Column=4"
    Data.s "ColumnSize=1"
    
    Data.s "FieldID=Kommentar"
    Data.s "Type=Editor"
    Data.s "Caption=Kommentar"
    Data.s "Row=3"
    Data.s "RowSize=4"
    Data.s "Column=1"
    Data.s "ColumnSize=4"
    
    Data.s "EndFields"
    Data.s #ETX$
    Data.i 0
    
  EndDataSection
  
CompilerEndIf
Zuletzt geändert von mk-soft am 14.03.2021 18:26, insgesamt 11-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dialog Fenster FormDataWindow

Beitrag von mk-soft »

Beispiele Form Textdatei

Code: Alles auswählen

BeginHeader
  DataID=DatenTXT
  Caption=Kontakt Daten
EndHeader
    
BeginFields
  FieldID=Daten Feld Kennung 1
  Type=String
  Caption=Name (Klient)
  Contents=
  Row=1
  RowSize=1
  Column=1
  ColumnSize=2
  
  FieldID=Daten Feld Kennung 2
  Type=String
  Caption=VorName (Klient)
  Contents=
  Row=2
  RowSize=1
  Column=1
  ColumnSize=2
  
  FieldID=Daten Feld Kennung 3
  Type=Date
  Caption=Geburtsdatum
  Contents=
  Row=3
  RowSize=1
  Column=1
  ColumnSize=2
  
  FieldID=Daten Feld Kennung 4
  Type=ComboBox
  Caption=Geschlecht
  Contents=Wählen
  Row=4
  RowSize=1
  Column=1
  ColumnSize=1
  BeginSelection
    Wählen
    Männlich
    Weiblich
    Unbestimmt
  EndSelection
  
  FieldID=Daten Feld Kennung 5
  Type=String
  Caption=Strasse und Nummer
  Contents=
  Row=5
  RowSize=1
  Column=1
  ColumnSize=2
EndFields
Beispiel Form XML Datei

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>

<udtFormData>
  <Header>
    <DataID>DatenXML</DataID>
    <Caption>Kontakt Daten</Caption>
    <Database/>
    <Table/>
  </Header>
  <FieldData>
    <element>
      <FieldID>Daten Feld Kennung 1</FieldID>
      <Type>String</Type>
      <Caption>Eingabe</Caption>
      <Contents>Startwert 1</Contents>
      <Row>1</Row>
      <RowSize>1</RowSize>
      <Column>1</Column>
      <ColumnSize>3</ColumnSize>
      <Selection/>
    </element>
    <element>
      <FieldID>Daten Feld Kennung 2</FieldID>
      <Type>ComboBox</Type>
      <Caption>Auswahl 1</Caption>
      <Contents>Keine</Contents>
      <Row>2</Row>
      <RowSize>1</RowSize>
      <Column>1</Column>
      <ColumnSize>1</ColumnSize>
      <Selection>
        <element>Keine</element>
        <element>Auswahl 1</element>
        <element>Auswahl 2</element>
        <element>Auswahl 3</element>
        <element>Auswahl 4</element>
        <element>Auswahl 5</element>
      </Selection>
    </element>
    <element>
      <FieldID>Daten Feld Kennung 2</FieldID>
      <Type>ComboBox</Type>
      <Caption>Auswahl 2</Caption>
      <Contents>Auswahl 5</Contents>
      <Row>2</Row>
      <RowSize>1</RowSize>
      <Column>2</Column>
      <ColumnSize>2</ColumnSize>
      <Selection>
        <element>Keine</element>
        <element>Auswahl 1</element>
        <element>Auswahl 2</element>
        <element>Auswahl 3</element>
        <element>Auswahl 4</element>
        <element>Auswahl 5</element>
      </Selection>
    </element>
    <element>
      <FieldID>Daten Feld Kennung 3</FieldID>
      <Type>Editor</Type>
      <Caption>Kommentar</Caption>
      <Contents/>
      <Row>3</Row>
      <RowSize>6</RowSize>
      <Column>1</Column>
      <ColumnSize>3</ColumnSize>
      <Selection/>
    </element>
  </FieldData>
</udtFormData>
Zuletzt geändert von mk-soft am 14.03.2021 13:31, insgesamt 2-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Lord
Beiträge: 313
Registriert: 21.01.2008 19:11

Re: Dialog Fenster FormDataWindow

Beitrag von Lord »

First impression:
---------------------------
PureBasic - Assembler error
---------------------------
PureBasic.asm [2986]:

MOV rax,dword [p.p_FormDataSection]

error: operand sizes do not match.


---------------------------
OK
---------------------------
x64 only?
Bild
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dialog Fenster FormDataWindow

Beitrag von mk-soft »

Update v1.03.1
- Kompilerfehler x86 korrigiert
- Kennungen angepasst: DataID, FieldID
- Index FieldID (Map) für schnellen zu hinzugefügt
- SetFormDataContents hinzugefügt
- GetFormDataRetval und GetFormDataValue hinzugefügt
- TXT und XML Beispiel Datei angepasst

@Lord
habe vergessen in LoadFormDataFromDataSetion den ASM Code von rax nach eax zu ändern.

Danke für den Hinweis :wink:

Nur ein schöneres Beispiel für die Verwendung von FormDataWindow fehlt noch :cry:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Dialog Fenster FormDataWindow

Beitrag von HeX0R »

Ich verstehe leider nicht wirklich wofür das benötigt wird, ist das jetzt eine alternative zu Dialogen aber inklusive der Möglichkeit Gadgets mit Inhalten zu versehen?
Auf welchen Forumbeitrag beziehst Du Dich denn hier, vielleicht hilft das ja zu verstehen, um was es hier eigentlich geht.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dialog Fenster FormDataWindow

Beitrag von mk-soft »

Update v1.04.0
- Anpassung Spaltenbreite
- Linux Anpassung erforderliche Gadget Größe

Die Idee hatte ich schon länger. Angefangen habe ich nach der Anfrage von Brigitte (PHP in PureBasic integrieren),
um das Erstellen der Eingabemasken über Konfigurations-Dateien oder DataSection zu vereinfachen.
Somit kann man die Eingabemasken in Dateien Anpassen, ohne das Programm neu zu erstellen.

Es fehlen aber noch einige Hilfsfunktionen.
Zum Beispiel um die Eingabemasken mit Datensätze einer Datenbank zu binden.

P.S.
Hier sieht man auch das die Verwendung #PB_Any für Windows und Gadgets richtig sinn macht
und mit Bind[Gadget]Event gut ausgewertet werden kann.
Zuletzt geändert von mk-soft am 14.03.2021 16:59, insgesamt 1-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dialog Fenster FormDataWindow

Beitrag von mk-soft »

Update v1.04.1
- Hinzugefügt Type "Text"
- Hinzugefügt SetFormDataSelection(...)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Axolotl
Beiträge: 146
Registriert: 31.12.2008 16:34

Re: Dialog Fenster FormDataWindow

Beitrag von Axolotl »

Hi mk-soft,

coole Idee.
Ich habe den code mal überflogen ...
Hat sich in Zeile 277 ein Schreibfehler eingeschlichen? :oops:

Code: Alles auswählen

Procedure LoadFormDataFromDateSection(*FormDataSection, *Data.udtFormData)
Vielleicht sollte es besser heißen:

Code: Alles auswählen

Procedure LoadFormDataFromDataSection(*FormDataSection, *Data.udtFormData)
Meine Idee ging hier in Richtung Resource Script ohne Compiler... (konnte mich aber nicht zum Start durchringen)
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Dialog Fenster FormDataWindow

Beitrag von mk-soft »

Update v1.04.2
- Fix Schreibfehler

Danke Axolotl,
Gleich korrigiert ... :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten