Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Datensatz als Array in Speicher laden
Gehe zu Seite Zurück  1, 2
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 27.05.2022, 18:00    Titel: Antworten mit Zitat

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 traurig
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 28.05.2022, 19:04    Titel: Antworten mit Zitat

Freut mich, daß ich helfen konnte. lächeln 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! zwinkern

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2
Seite 2 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz