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