 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 27.05.2022, 18:00 Titel: |
|
|
danke, grindstone! Da hast du dir sehr viel Mühe gemacht!
Ich habe mir die Codes geholt und ausprobiert, es funktioniert fantastisch.
Ich werde allerdings einige Zeit brauchen, um zu verstehen was da alles drin ist und in meinem Alter geht das nicht mehr so schnell  _________________ Grüße
kilix |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1153 Wohnort: Ruhrpott
|
Verfasst am: 28.05.2022, 19:04 Titel: |
|
|
Freut mich, daß ich helfen konnte. Den Codeschnipsel kann ich bestimmt irgendwann auch selber einmal gebrauchen, deshalb auch das Bemühen, ihn möglichst einfach anpassen zu können. In diesem Sinne habe ich den UDT noch einmal optimiert und alle Werte und Bezeichner in einer übersichtlichen Tabelle zusammengefasst. Die Funktion ist ansonsten unverändert.
mitgliederlisteUDT.bi: Code: | #Macro meta(__funktion__)
#If __funktion__ = __decprop__
Static As ULong laenge(10) 'anzahl der datenfelder <<<<<<<<<<<< MUSS GESETZT WERDEN !
Static As ULong zeiger(UBound(tDatensatz.laenge))
#Define __declprop__ 'properties deklarieren
#ElseIf __funktion__ = __prop__
#Define __setprop__ 'properties setzen
#ElseIf __funktion__ = __tabelle__
Static As ULong tDatensatz.laenge(UBound(tDatensatz.laenge))
Static As ULong tDatensatz.zeiger(UBound(tDatensatz.laenge))
#Define __setlen__ 'längentabelle der datenfelder initialisieren
#EndIf
'tabelle der datenfelder
setzen(0, iNummer, 4, ULong)
setzen(1, sName, 35, String)
setzen(2, sVorname, 45, String)
setzen(3, sStand, 2, String)
setzen(4, iVerein, 4, ULong)
setzen(5, bInakt, 1, UByte)
setzen(6, sFktCd, 13, String)
setzen(7, sFkt, 18, String)
setzen(8, iAnzGes, 4, ULong)
setzen(9, iAnz, 4, ULong)
setzen(10, bSCd, 1, UByte)
' | | | |______datentyp des datenfeldes
' | | |__________länge des datenfeldes in bytes
' | |____________________name der property ( = pseudo-variable im programm)
' |________________________laufende nummer des datenfeldes
#Undef __declprop__
#Undef __setprop__
#Undef __setlen__
#EndMacro
'macro zum anlegen der properties
#Macro setzen(itemnummer, feldname, feldlaenge, typ)
#If Defined(__declprop__)
'property deklarieren
Declare Property feldname As typ 'zur ausgabe
Declare Property feldname(n As typ) 'zur eingabe
#ElseIf Defined(__setprop__)
Property tDatensatz.feldname As typ
#If typ = ULong
feldname = Cvl(textlesen(itemnummer)) '4 bytes aus datensatz lesen und in zahl umwandeln
#ElseIf typ = UByte
feldname = Asc(textlesen(itemnummer)) '1 byte aus datensatz lesen und in byte umwandeln
#Else
feldname = RTrim(textlesen(itemnummer)) 'text aus datensatz lesen und rechtsseitige leerzeichen entfernen
#EndIf
End Property
Property tDatensatz.feldname(s As typ)
#If typ = ULong
textschreiben(Mkl(s), itemnummer) 'zahl in 4 bytes umwandeln und in datensatz schreiben
#ElseIf typ = UByte
textschreiben(Chr(s), itemnummer) 'byte in character umwandeln und in datensatz schreiben
#Else
textschreiben(s, itemnummer) 'text in datensatz schreiben
#EndIf
End Property
#ElseIf Defined(__setlen__)
tDatensatz.laenge(itemnummer) = feldlaenge 'feldlängentabelle initialisieren
#EndIf
#EndMacro
Type tDatensatz
Static As ULong datensatzlaenge 'länge des datensatzes
As UByte Ptr daten 'pointer auf datensatz
Declare Constructor()
Declare Destructor()
Declare Sub textschreiben(text As String, item As ULong)
Declare Function textlesen(item As ULong) As String
meta(__decprop__) 'properties für datenfelder deklarieren
Declare Property datensatz As String 'zum schreiben
Declare Property datensatz(As String) 'zum lesen
End Type
'statische variablen deklarieren
Static As ULong tDatensatz.datensatzlaenge 'länge des datensatzes
meta(__tabelle__) 'tabellen für feldlängen und feldzeiger anlegen
Constructor tDatensatz
'gesamtlänge des datensatzes berechnen
datensatzlaenge = 0
For x As Integer = LBound(laenge) To UBound(laenge)
datensatzlaenge += laenge(x)
Next
'speicher für den datensatz reservieren
daten = Callocate(datensatzlaenge)
'zeiger auf den anfang jedes datenfeldes berechnen
zeiger(LBound(laenge)) = 0
For x As Integer = LBound(laenge) + 1 To UBound(laenge)
zeiger(x) = zeiger(x - 1) + laenge(x - 1)
Next
End Constructor
Destructor tDatensatz
'speicher des datensatzes freigeben
DeAllocate daten
End Destructor
Sub tDatensatz.textschreiben(g As String, item As ULong)
If daten = 0 Then Return
g = Left(g + String(laenge(item), " "), laenge(item)) 'text auf datenfeldlänge bringen und mit leerzeichen auffüllen
For x As Integer = 0 To Len(g) - 1 'text in datensatz schreiben
daten[zeiger(item) + x] = g[x]
Next
End Sub
Function tDatensatz.textlesen(item As ULong) As String
If daten = 0 Then Return ""
Dim As String g = String(laenge(item), " ") 'rückgabestring initialisieren
For x As Integer = 0 To laenge(item) - 1 'text aus datensatz extrahieren
g[x] = daten[zeiger(item) + x]
Next
Return g
End Function
meta(__prop__) 'properties für datenfelder anlegen
Property tDatensatz.datensatz As String 'datensatz als string ausgeben
If daten = 0 Then Return ""
Dim As String g = String(datensatzlaenge, " ") 'ausgabestring initialisieren
For x As Integer = 0 To datensatzlaenge - 1 'daten in ausgabestring übertragen
g[x] = daten[x]
Next
datensatz = g
End Property
Property tDatensatz.datensatz(g As String) 'datensatz aus string einlesen
If daten = 0 Then Return
g = Left(g + String(datensatzlaenge, " "), datensatzlaenge) 'eingabestring auf korrekte länge bringen
For x As Integer = 0 To datensatzlaenge - 1 'daten in speicherbereich übertragen
daten[x] = g[x]
Next
End Property
|
Und was die Lerngeschwindigkeit betrifft, die hat weniger mit dem Alter zu tun als mit der Übung.
"Das Gehirn ist eines der wenigen Dinge, die durch ständigen Gebrauch besser werden".
In diesem Sinne: Bleib neugierig!
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|