1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. XProfan
  5. Wettbewerb 2021

Haushaltsbuch

  • H.Brill
  • 1. Juni 2021 um 18:09
  • H.Brill
    Dauergast
    Reaktionen
    463
    Beiträge
    1.161
    • 1. Juni 2021 um 18:09
    • #1

    Da ich meinen Haushalt nun alleine mache, habe ich mir ein kleines Haushaltsbuch

    geschrieben, das die monatlichen Einkäufe sammelt und ausrechnet.

    Ist evtl. geeignet für den Wettbewerb. Ansonsten, vielleicht kann es ja wer brauchen.

    Ist zwar jetzt 6 KB, kleiner ging es aber nicht. Die Validierung des Betrages habe ich

    sogar noch weg gelassen.

    Ist auch eine Proc dabei, die mit Sortlist Datums sortiert.

    Code
    Declare Handle btn1, btn2, btn3, btn4, btn5, btn6, btn7, text1, text2, text3, text4, edit1, edit2, edit3, edit4
    Declare Handle grid, dll
    Declare Long pos, ende, save, knopf
    Declare String zeile, spalten, datei, Monat, Monate[]
    Monate[] = " ", "JANUAR", "FEBRUAR", "MÄRZ", "APRIL", "MAI", "JUNI", "JULI", "AUGUST", "SEPTEMBER", "OKTOBER", "NOVEMBER", "DEZEMBER"
    
    datei = $PROGDIR + Str$(dt("getMonth", !NOW)) + "-" + Str$(dt("GetYear", !NOW)) + ".txt"
    spalten = "DATUM;0;80;HÄNDLER;0;120;ZAHL.ART;0;100;BETRAG;2;80"
    save = 0
    Set("Decimals", 2)
    
    WindowTitle "Kleines Haushaltsbuch"
    Window 680, 450
    
    btn1  = Create("Button", %HWnd, "ENDE", 10, 10, 80, 25)
    btn2  = Create("Button", %HWnd, "Speichern", 110, 10, 80, 25)
    btn3  = Create("Button", %HWnd, "Übernehmen +", 210, 10, 100, 25)
    btn4  = Create("Button", %HWnd, "Ändern", 320, 10, 80, 25)
    btn5  = Create("Button", %HWnd, "Summe",  430, 10, 80, 25)
    btn6  = Create("Button", %HWnd, "Satz löschen", 530, 10, 100, 25)
    btn7  = Create("Button", %HWnd, "Drucken",      530, 180,100, 25)
    text1 = Create("Text",   %HWnd, "Datum", 10, 50, 100, 25)
    text2 = Create("Text",   %HWnd, "Händler/Ware", 230, 50, 100, 25)
    text3 = Create("Text",   %HWnd, "Zahlungsart", 10, 100, 100, 25)
    text4 = Create("Text",   %HWnd, "Betrag in €", 230, 100, 100, 25)
    edit1 = Create("Edit",   %HWnd, "", 120, 50, 80, 25)
    edit2 = Create("Edit",   %HWnd, "", 340, 50, 180, 25)
    edit3 = Create("Edit",   %HWnd, "", 120, 100, 80, 25)
    edit4 = Create("Edit",   %HWnd, "", 340, 100, 80, 25)
    grid  = Create("GridBox", %HWnd, spalten, 0, 10, 150, 400, 200)
    UserMessages $10
    ende = 0
    If FileExists(datei)
       Laden()
    Else
       MessageBox("Noch keine Datei angelegt.\nBitte erst Daten eingeben !", "Info", 0)
    EndIf
    
    WhileNot ende
      WaitInput
      If Clicked(btn1)
         ' Ende
         knopf = Messagebox("Vor Beenden Speichern ?", "Frage", 292)
         If knopf = 6
            Speichern()
         EndIf
         ende = 1
      ElseIf Clicked(btn2)
         ' Speichern
         Speichern()
         save = 1
      ElseIf Clicked(btn3)
         'Übernehmen
          zeile = GetText$(edit1) + "|" + Upper$(GetText$(edit2)) + "|" + Upper$(GetText$(edit3)) + "|" + GetText$(edit4)
          AddString(grid, zeile)
          SortiereDatum()
      ElseIf Clicked(btn4)
         ' Ändern
          pos = GetCurSel(grid)
          SetText grid, pos, 0, GetText$(edit1)
          SetText grid, pos, 1, Upper$(GetText$(edit2))
          SetText grid, pos, 2, Upper$(GetText$(edit3))
          SetText grid, pos, 3, GetText$(edit4)
          SortiereDatum()
      ElseIf Clicked(btn5)
          ' Summe
          Summieren()
      ElseIf Clicked(btn6)
          ' Zeile löschen
          pos = GetCurSel(grid)
          If pos > -1
             DeleteString(grid, pos)
          EndIf
      ElseIf Clicked(btn7)
           ' Drucken
           knopf = 0
           knopf = Messagebox("Mit Summe drucken ?", "Frage", 292)
           Drucken()
      ElseIf Clicked(grid)
         pos = GetCurSel(grid)
         If pos > -1  ' ungültige Zeile unterhalb des letzten Eintrages -< Fehlermeldung
            zeile = GetString$(grid, pos)
            SetText edit1, SubStr$(zeile, 1, "|")
            SetText edit2, SubStr$(zeile, 2, "|")
            SetText edit3, SubStr$(zeile, 3, "|")
            SetText edit4, SubStr$(zeile, 4, "|")
         EndIf
      EndIf
      If %UMESSAGE = $10
         knopf = Messagebox("Vor Beenden Speichern ?", "Frage", 292)
         If knopf = 6
            Speichern()
         EndIf
         ende = 1
      EndIf
    EndWhile
    
    Proc Laden
    Declare Long anzahl
      ClearList
      anzahl = Move("FileToList", datei)
      Move("ListToHandle", grid)
      MessageBox(Str$(anzahl) + " Datensätze geladen !", "Info", 0)
      Set("MoveListMode", 0)
    EndProc
    
    Proc Speichern
    Declare Long anzahl
      ClearList
      Move("HandleToList", grid)
      DeleteString(0, GetCount(0))
      anzahl = Move("ListToFile", datei)
      MessageBox(Str$(anzahl) + " Datensätze gespeichert !", "Info", 0)
      Set("MoveListMode", 0)
    EndProc
    
    Proc Summieren
    Declare Float s
     WhileLoop 0, GetCount(grid) - 1
        s = s + Val(GetText$(grid, &LOOP, 3))
     EndWhile
     MessageBox("Summe : " + Str$(s) + " € ausgegeben !", "Info", 0)
    EndProc
    
    Proc Drucken
    Declare Long x1, y1, Float s
    Declare String dat, hd, zahl, betr
    x1 = 100 : y1 = 140
    s = 0
    Monat = Monate[DT("GetMonth", !NOW)]
    StartPrint "*"
      DrawText 100, 30, "AUSGABEN     MONAT  " + Monat
      DrawText 100, 70, MKStr$("-", 200)
      DrawText x1, y1 - 20, "DATUM"
      DrawText x1 + 120, y1 - 20, "HÄNDLER"
      DrawText x1 + 250, y1 - 20, "ZAHL-ART"
      DrawText x1 + 380, y1 - 20, "BETRAG"
      WhileLoop 0, GetCount(grid) - 1
        zeile = GetString$(grid, &LOOP)
        dat  = SubStr$(zeile, 1, "|")
        hd   = SubStr$(zeile, 2, "|")
        Zahl = SubStr$(zeile, 3, "|")
        betr = SubStr$(zeile, 4, "|") + "  €"
        If InStr(",", betr)
           betr = Translate$(betr, ",", ".")
        EndIf
        s = s + Val(betr)
        DrawText x1, y1, dat
        DrawText x1 + 120, y1, hd
        DrawText x1 + 250, y1, zahl
        DrawText x1 + 380, y1, betr
        Inc y1, 20
      EndWhile
      If knopf = 6
        DrawText x1 + 380, y1 + 20, "------------"
        DrawText x1 + 250, y1 + 40, "SUMME : "
        DrawText x1 + 380, y1 + 40, Str$(s) + " €"
      EndIf
    EndPrint
    EndProc
    
    Proc SortiereDatum
    Declare String datum, Handle Liste
    Liste = Create("Grid", 4, 0)
    ClearList
    Move("HandleToList", grid)
    WhileLoop 0, GetCount(0) -1
       zeile = GetString$(0, &LOOP)
       datum = CTod$(SubStr$(zeile, 1, "|"))
       zeile = Translate$(zeile, SubStr$(zeile, 1, "|"), datum)
       AddString(Liste, zeile)
    EndWhile
    ClearList
    Move("HandleToList", Liste)
    SortList "|", 1, 5
    ClearList Liste
    WhileLoop 0, GetCount(0) - 1
       zeile = GetString$(0, &LOOP)
       datum = DToc$(SubStr$(zeile, 1, "|"))
       zeile = Translate$(zeile, SubStr$(zeile, 1, "|"), datum)
       AddString(Liste, zeile)
    EndWhile
    ClearList
    Move("HandleToList", Liste)
    ClearList grid
    Move("ListToHandle", grid)
    EndProc
    
    End
    Alles anzeigen

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    3 Mal editiert, zuletzt von H.Brill (1. Juni 2021 um 18:44)

  • Volkmar
    Moderator
    Reaktionen
    6.804
    Beiträge
    6.789
    • 1. Juni 2021 um 19:13
    • #2

    Schön, daß sich doch noch jemand gefunden hat. Aber leider: 4k sind ja 4 * 1024 = 4096 Bytes. Und Du kommst hier auf stolze 9410 Bytes :hmmm:

    Die NEdit.DLL müßten wir zur Größe auch dazu rechnen, da die nicht jeder automatisch hat. Die müßtest Du mit dem Programm weitergeben. Wenn sich der Code straffen ließe und dann ohne die DLL auskommt, wäre das sicher ein schöner Beitrag. Versuch es doch mal ...

    Gruß Volkmar

  • H.Brill
    Dauergast
    Reaktionen
    463
    Beiträge
    1.161
    • 2. Juni 2021 um 07:31
    • #3

    Hatte ich anfangs ja mit dem XDatengenerator gemacht.

    Habe obigen Code mal ausgewechselt, also ohne NEdit.dll und ohne Validierung

    des Betrages. Leider geht weniger nicht. :(

    Da sind nur noch wenige Bytes drin. Und so einen Code, wie P.Specht zeitweise

    reinstellt (lange Zeilen und die Befehle/Funktionen mit Doppelpunkt : verknüpft)

    ist nicht so mein Stil. Man soll ja auch alles richtig lesen und verstehen können.

    Und da sind Absätze und Einrückungen bei IF..EndIf und Schleifen ideal.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.804
    Beiträge
    6.789
    • 2. Juni 2021 um 08:55
    • #4

    Das verstehe ich schon. Ich mag das eigentlich auch nicht. Aber hier geht es ja darum, in die 4 K einen Code reinzuquetschen. Zur Erinnerung, mein erster Rechner hatte nur 16 K RAM. Und 10,5 K belegte der Basicinterpreter. Macht für Code und Daten nur noch 5,5 K :(;)

    Es ist kein Schönschreibwettbewerb. Das Schönschreiboriginal bleibt Dir ja :) . Nur eben für den Wettbewerb sollten die Bedingungen passen. Einrückungen, die vielen, für die Funktion nicht notwendigen Leerzeichen, Variablennamen und Prozedurnamen kürzen, das würde eine ganze Menge bringen. Notfalls kann man für den Wettbewerb auch eine Meldung "Bitte hier klicken" in "Klick" ändern :) . Wenn nur die Codelänge paßt.

    Gruß Volkmar

  • H.Brill
    Dauergast
    Reaktionen
    463
    Beiträge
    1.161
    • 2. Juni 2021 um 09:37
    • #5

    So, da ich ab Februar ja auch Rentner bin, habe ich ja auch etwas Zeit. Ich habe mal die Handles in Arrays gepackt

    und das Drucken, was nicht unbedingt nötig ist, weg gelassen. Das Sortieren des Datums habe ich bewusst drinnen

    gelassen, damit der ein oder andere sieht, wie sowas geht.

    Jetzt passt es :

    Code
    Declare Handle btn[], text[], edit[]
    Declare Handle grid
    Declare Long pos, ende, knopf
    Declare String zeile, spalten, datei
    datei = $PROGDIR + Str$(dt("getMonth", !NOW)) + "-" + Str$(dt("GetYear", !NOW)) + ".txt"
    spalten = "DATUM;0;80;HÄNDLER;0;120;ZAHL.ART;0;100;BETRAG;2;80"
    Set("Decimals", 2)
    
    Window 680, 450
    
    btn[0]  = Create("Button", %HWnd, "ENDE", 10, 10, 80, 25)
    btn[1]  = Create("Button", %HWnd, "Speichern", 110, 10, 80, 25)
    btn[2]  = Create("Button", %HWnd, "Übernehmen +", 210, 10, 100, 25)
    btn[3]  = Create("Button", %HWnd, "Ändern", 320, 10, 80, 25)
    btn[4]  = Create("Button", %HWnd, "Summe",  430, 10, 80, 25)
    btn[5]  = Create("Button", %HWnd, "Satz löschen", 530, 10, 100, 25)
    text[0] = Create("Text",   %HWnd, "Datum", 10, 50, 100, 25)
    text[1] = Create("Text",   %HWnd, "Händler/Ware", 230, 50, 100, 25)
    text[2] = Create("Text",   %HWnd, "Zahlungsart", 10, 100, 100, 25)
    text[3] = Create("Text",   %HWnd, "Betrag in €", 230, 100, 100, 25)
    edit[0] = Create("Edit",   %HWnd, "", 120, 50, 80, 25)
    edit[1] = Create("Edit",   %HWnd, "", 340, 50, 180, 25)
    edit[2] = Create("Edit",   %HWnd, "", 120, 100, 80, 25)
    edit[3] = Create("Edit",   %HWnd, "", 340, 100, 80, 25)
    
    grid  = Create("GridBox", %HWnd, spalten, 0, 10, 150, 400, 200)
    UserMessages $10
    ende = 0
    If FileExists(datei)
       Laden()
    Else
       MessageBox("Keine Datei angelegt.\nBitte erst Daten eingeben !", "Info", 0)
    EndIf
    
    WhileNot ende
      WaitInput
      If Clicked(btn[0])
         ' Ende
         knopf = Messagebox("Vor Beenden Speichern ?", "Frage", 292)
         If knopf = 6
            Speichern()
         EndIf
         ende = 1
      ElseIf Clicked(btn[1])
         ' Speichern
         Speichern()
      ElseIf Clicked(btn[2])
         'Übernehmen
          zeile = GetText$(edit[0]) + "|" + Upper$(GetText$(edit[1])) + "|" + Upper$(GetText$(edit[2])) + "|" + GetText$(edit[3])
          AddString(grid, zeile)
          SortiereDatum()
      ElseIf Clicked(btn[3])
         ' Ändern
          pos = GetCurSel(grid)
          WhileLoop 0, 3
             SetText grid, pos, &LOOP, Upper$(GetText$(edit[&LOOP]))
          Endwhile
          SortiereDatum()
      ElseIf Clicked(btn[4])
          ' Summe
          Summieren()
      ElseIf Clicked(btn[5])
          ' Zeile löschen
          pos = GetCurSel(grid)
          If pos > -1
             DeleteString(grid, pos)
          EndIf
      ElseIf Clicked(grid)
         pos = GetCurSel(grid)
         If pos > -1 
            zeile = GetString$(grid, pos)
            WhileLoop 0, 3
              SetText edit[&LOOP], SubStr$(zeile, &LOOP + 1, "|")
            EndWhile  
         EndIf
      EndIf
      If %UMESSAGE = $10
         knopf = Messagebox("Vor Beenden Speichern ?", "Frage", 292)
         If knopf = 6
            Speichern()
         EndIf
         ende = 1
      EndIf
    EndWhile
    Proc Laden
    Declare Long anzahl
      ClearList
      anzahl = Move("FileToList", datei)
      Move("ListToHandle", grid)
      MessageBox(Str$(anzahl) + " Datensätze geladen !", "Info", 0)
      Set("MoveListMode", 0)
    EndProc
    Proc Speichern
    Declare Long anzahl
      ClearList
      Move("HandleToList", grid)
      DeleteString(0, GetCount(0))
      anzahl = Move("ListToFile", datei)
      MessageBox(Str$(anzahl) + " Datensätze gespeichert !", "Info", 0)
      Set("MoveListMode", 0)
    EndProc
    Proc Summieren
    Declare Float s
     WhileLoop 0, GetCount(grid) - 1
        s = s + Val(GetText$(grid, &LOOP, 3))
     EndWhile
     MessageBox("Summe : " + Str$(s) + " € ausgegeben !", "Info", 0)
    EndProc
    Proc SortiereDatum
    Declare String datum, Handle Liste
    Liste = Create("Grid", 4, 0)
    ClearList
    Move("HandleToList", grid)
    WhileLoop 0, GetCount(0) -1
       zeile = GetString$(0, &LOOP)
       datum = CTod$(SubStr$(zeile, 1, "|"))
       zeile = Translate$(zeile, SubStr$(zeile, 1, "|"), datum)
       AddString(Liste, zeile)
    EndWhile
    ClearList
    Move("HandleToList", Liste)
    SortList "|", 1, 5
    ClearList Liste
    WhileLoop 0, GetCount(0) - 1
       zeile = GetString$(0, &LOOP)
       datum = DToc$(SubStr$(zeile, 1, "|"))
       zeile = Translate$(zeile, SubStr$(zeile, 1, "|"), datum)
       AddString(Liste, zeile)
    EndWhile
    ClearList
    Move("HandleToList", Liste)
    ClearList grid
    Move("ListToHandle", grid)
    EndProc
    End
    Alles anzeigen

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.804
    Beiträge
    6.789
    • 2. Juni 2021 um 09:41
    • #6

    Super! Das paßt. Und trotzdem noch in "Schönschrift" :top:

    Gruß Volkmar

  • H.Brill
    Dauergast
    Reaktionen
    463
    Beiträge
    1.161
    • 2. Juni 2021 um 10:02
    • #7

    Ja, genau 4.091 Bytes , also noch 5 Bytes weniger :top:

    So, heute Mittag bin ich nicht da, da mein Bruder und

    ich meine verstorbene Mutter (88) beerdigen.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Volkmar
    Moderator
    Reaktionen
    6.804
    Beiträge
    6.789
    • 2. Juni 2021 um 10:06
    • #8

    Mein aufrichtiges Beileid

    Gruß Volkmar

  • H.Brill
    Dauergast
    Reaktionen
    463
    Beiträge
    1.161
    • 2. Juni 2021 um 10:20
    • #9

    Danke !

    Gruß Heinz

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • p. specht
    Premium-Mitglied
    Reaktionen
    986
    Beiträge
    5.665
    • 2. Juni 2021 um 21:01
    • #10

    Möchte mich den Kondulenzen anschließen, Heinz.

    HP255G7:Win10pro2.004,4*AMD Ryzen3200U@2.60GHz,6+2GB-RadeonVega/237GBSSD:intlDVDRW,3xUSB3 ext4TB-HDX,XProfanX3+Xasm/Xpse

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Windows 11

  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™