Letzte eingegebene Zeile einer bereits gefüllten GridBox sichtbar machen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Letzte eingegebene Zeile einer bereits gefüllten GridBox sichtbar machen

      Hallo liebe Profaner,
      ich muß mal wieder um Rat und Mithilfe bitten.
      Mein Problem ist die Anzeige der letzten Zeile in einem XProfan-Grid, welches
      mit Create("GridBox",...) erstellt wurde.
      Ist das Grid mit Zeilen gefüllt, sind neu hinzugefügte Zeilen nicht sichtbar.
      Man müßte jedesmal nach unten scrollen, um sie sichtbar zu machen. Das ist
      aber ziemlich umständlich, weil die Zeile neu eingegebene Daten enthält, die ich
      per Sichtkontrolle auf Richtigkeit überprüfen möchte.
      Ich arbeite mit XProfan 4.

      Gibt es dafür eine Lösung oder hat jemand eine Idee?
      Im Prinzip funktioniert alles bis auf das o.a. Problem zufriedenstellend!

      Kurze Infos:
      Es handelt sich um einen Finanz- oder Kontenmanager, den ich für
      meine Einnahmen und Ausgaben programmieren will bzw. dran bin.

      Das ist das Fenster kind& auf %hWnd:
      kind& = Create("ChildWindow",%hWnd,"Buchungsfenster",0,0,Width(%hWnd,0),Height(%hWnd,0))
      SetStyle kind&,$94CF0000 ' sonst erhält das ChildWindow keinen Fokus
      ' nun folgt die Buchungszeile
      t1% = Create("Button",kind&,"Datum:", 170,630, 74,17)
      t2% = Create("Button",kind&,"Empfänger:",255,630,105,17)
      t3% = Create("Button",kind&,"Verwendungszweck:",405,630,105,17)
      t4% = Create("Button",kind&,"Kategorie:",585,630,105,17)
      t5% = Create("Button",kind&,"Soll:", 725,630, 54,17)
      t6% = Create("Button",kind&,"Haben:",800,630, 54,17)
      Ndat& = Create("DateEdit",kind&,d$, 170,650, 75,18)
      Nverwend& = Create("Edit",kind&,"", 405,650,170,17)
      Nsol& = Create("Edit",kind&,"0,00", 725,650, 55,17)
      Nhab& = Create("Edit",kind&,"0,00", 800,650, 55,17)
      ' Buttons unten rechts in der Buchungszeile
      rech& = Create("Button",kind&,"Rechner", 870,627,65,47)
      sp& = Create("DefButton",kind&,"speichern",945,627,75,47)
      ab& = Create("Button",kind&,"Abbruch", 1025,627,65,47)
      ' Buttons an linker Seite des Hauptfensters
      kobut& = Create("Button",kind&,"Bank/Kontoauswahl",8, 20,150,25)
      kabut& = Create("Button",kind&,"Kategorieauswahl", 8, 60,150,25)
      embut& = Create("Button",kind&,"Empfängerauswahl", 8,100,150,25)
      umbut& = Create("Button",kind&,"Umbuchung",8,160,150,25)
      ' Umrandung
      box1% = Create("GroupBox",kind&,"",3,10,162,500)
      box2% = Create("GroupBox",kind&,"",2,11,163,501)
      If first%
      abb& = Create("DefButton",kind&,"zum Hauptmenü >>>", 8,480,150,25)
      Else
      abb& = Create("Button",kind&,"Auswahl abbrechen >>>",8,480,150,25)
      Endif
      ...

      Das ist die Gridbox liste& auf kind&:
      ' die Spalten-Überschriften als 1. Zeile für die GridBox definieren
      a$ = "KZ;0;30;Datum;2;80;Soll;1;80;Haben;1;80;Stand;2;90;Empfänger;0;180;Kategorie;0;180;Zweck;0;180"
      liste& = Create("GRIDBOX",kind&,a$,0,170,20,920,605)
      ...

      Unterhalb der GridBox befindet sich eine Eingabezeile, die nach Klick auf speichern, der GridBox angehängt wird. Ist die GridBox bereits mit
      Zeilen der vorherigen Eingaben (kommen aus einer dBase-Tabelle) gefüllt, ist die neue Zeile nicht sichtbar.

      Nur zur Information, ich versuche den Finanzmanager von Lexware weitestgehend nachzubilden. Wobei ich mich nur mit Offline beschäftige
      und nicht mit automatischen Ausfüllen von Buchungen des Managers über das Girokonto per Online.
      Ich danke jetzt schon für die freundliche Unterstützung.
      Grüße von oberstleutnant
    • *hust* listview.inc *hust*
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Da reicht doch schon ein SetCurSel.

      Quellcode

      1. SetCurSel liste&, GetCount(liste&) - 1
      Funktioniert aber nur bei einer unsortierten Gridbox richtig.
      Hast du ja oben : liste& = Create("GRIDBOX",kind&,a$,0,170,20,920,605)
      Wenn es denn unbedingt sortiert sein muß, würde ich mit
      Move("HandleToList", ...) die Daten in die Listboxliste schieben,
      dort mit SortList sortieren, die Gridbox mit ClearList leeren und
      einfach wieder zurück moven mit Move("ListToHandle",...).
      Die int. Listboxliste muß natürlich vor jeder Aktion auch geleert
      werden.
    • Aber das markiert die Zeile auch. Das ist unter Umständen nicht erwünscht. Vor allem bei Multiselektionen.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Hallo Jac de Lad,
      danke für Deine Antwort.
      doch leider kann ich mir nichts damit vorstellen. Habe mal in der Listview.inc gestöbert, aber nichts gefunden!

      Hallo MaZz,
      Dein Tipp funktionierte. Danke dafür. Das war aber erst nur ein kleiner, erster Test. Bin gerade mal mit 2 Zeilen unter den unteren Rand gerutscht.

      Hallo H. Brill,
      leider ist die Grid sortiert. Nach Konto-Kennzeichen und Datum. Denn die dBase-Tabelle enthält sämtliche Buchungen aller Konten.
      Danke für Deine Bemühungen.
    • Listview("ShowItem",...) bzw. Listview.ShowItem(...) bei älteren XProfan-Versionen (vor X4). Macht am Ende aber auch nur einen API-Aufruf und funktioniert mit allen Listviews, nicht nur mit den durch die Inc erstellten.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • oberstleutnant schrieb:

      Hallo H. Brill,
      leider ist die Grid sortiert. Nach Konto-Kennzeichen und Datum
      Wenn ich aber dein Create und den 3. Parameter (0) so anschaue :
      Spoiler anzeigen
      liste& = Create("GRIDBOX",kind&,a$,0,170,20,920,605)

      aber nicht. Hab ihn extra rot gemacht. 0 steht für unsortiert.

      Davon ging ich halt aus. Wie das in deiner dBase-Tabelle ist, weiß ich
      ja nicht.

      PS: bei der automatischen Sortierung mußt du bei Zahlen aufpassen.
      Da kommt die z.B. 10 direkt hinter der 1 statt die 2,
      also
      1
      10
      11
      2
      usw.

      Für Namen usw. ist es ja ok. Das liegt aber an Windows.
    • H.Brill schrieb:

      Für Namen usw. ist es ja ok. Das liegt aber an Windows.
      Ist aber auch die einzig logische Sortierung, vor allem für Computer ;-)
      PS: Linux macht es auch nicht anders!
      Gruß Thomas

      "Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."
      ComputerInfo für PPF
    • Man kann jeder Zeiler eines Listviews einen LongInt-Wert zuordnen. Nach dem kann man dann numerisch sortieren. Vielleicht hilft das.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      TerraMaster F4-420 mit 16TB
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84)
      OnePlus 6 8GB/256GB
      jacdelad.bplaced.net
    • Hallo,
      meine Sortierung ist ein Index der dBase-Tabelle. Die Banken/Konten sind ja bei einer Privatperson nicht so viele. Also lasse ich das Programm Kennzeichen
      ( KZ ) automatisch vergeben. Fange bei 10 an und höre bei 99 auf. Das bedeutet 0 - 9 kommen für eine Sortierung nicht infrage. Somit kein Problem für das
      Sortieren.
      Das mögliche Löschen von Banken/Konten habe ich so geregelt, dass deren Eintrag einschl. der KZ gelöscht werden. Die KZ wird nicht mehr verwendet.
      Neue Banken/Konten erhalten die nächste freie KZ .

      Gruß Oberstleutnant
    • <senf on>Bin mit Listen nicht so sattelfest, habe mir vor Zeiten aber so beholfen: Die Sortierung erfolgt glaube ich nach dem 1. Listeneintrag. Den kann man mit Spaltenbreite 0 auf "nicht anzeigen" bringen, die Sortierung von Ziffern mit zB right$("0000"+str$(laufnr&),4) auf alphanumerisch bringen und so auch Zahlen korrekt sortieren.<senf off>
    • Vielleicht liegen wir auch ganz falsch, bezüglich was Oberstleutnant meint.
      Die Sortierung hat er ja, wie er sagt, in seiner dBase-Tabelle und seiner Indexdatei.
      Wenn er einen neuen Datensatz dort reinschreibt, sortiert in dBase ja automatisch,
      wenn eine Indexdatei vorliegt.

      Ich vermute mal, daß er die internen dBase - Befehle von XProfan nutzt
      und nun die Sortierung von der Indexdatei übernehmen möchte. Da hat
      Profan leider keine Möglichkeit, das zu übernehmen.

      Alternativ könnte man das auf SQL und einem dBase-Treiber umstellen.
      Mit db("SQLExec", ...) könnter er dann zumindest Abfragen tätigen und
      in der Gridbox anzeigen, wenn ihr Handle dort als letzter Parameter
      angegeben ist. Die Ergebnisse kommen dann ja sortiert an.

      Ich denke, daß dort die Problematik besteht.
    • Natürlich, geht auch.
      Dazu muß er halt bei jedem neuen Datensatz die dBasedatei
      satzweise neu einlesen und vorher natürlich das Grid löschen.

      Ist halt sehr umständlich.

      Da wäre eine Memory-DB, falls es sowas für dBase gibt,
      sehr hilfreich. Oder ein

      Quellcode

      1. Move("DbfToList",...)
      das auch den Index beachtet.
      Eine langsame Container-Version könnte er sich ja für seinen Fall selber bauen.
      Obwohl, mit der MoveListProc dürfte das schon einigermaßen schnell gehen,
      wenn er vorausgesetzt Version X4 hat.

      Aber mal abwarten, ob es überhaupt die Problemlösung für ihn ist.
    • Das was Volkmar geschrieben hat, mache ich. Jedesmal, wenn ein(e) Bank/Konto gefragt ist, schaut das Programm nach seinem Kennzeichen (KZ).
      Dann wird aus der Buchungstabelle , in der sämtliche Buchungen stehen und die nach KZ und Datum indexiert ist, jeder Datensatz - welcher das KZ enthält -
      ausgelesen und auf liste& angezeigt. Jeder neu eingegebene Datensatz wird durch indexieren, schließen der Tabelle, wieder öffnen und neu auf liste&
      angezeigt. Damit ist der Kontostand auch aktuell und wird entsprechend angezeigt.
      Scheint etwas umständlich zu sein, aber besser wusste ich es nicht.
      Gruß Oberstleutnant
    • Wenn Du alles so schön sortiert in der Liste hast und nur auf den letzten Eintrag springen möchtest, dann frage ich mich warum H.Brill's Vorschlag (#4) nicht funktioniert.

      SetCurSel liste&, GetCount(liste&) - 1

      Diese Zeile sollte doch funktionieren. Es wird die letzte Zeile im Grid als aktuelle Zeile gewählt und in den sichtbaren Bereich gescrollt.
      Aufgerufen wird dieser Befehl gleich nach dem Einfügen in die Gridbox. Damit wird dann die Eingabe auch gleich sichtbar.

      Da ist mir noch etwas aufgefallen:
      Deine Sortierung basiert auf KZ und Datum. Bei dBase wird Datum ja als "JJJJMMTT" in die Datenbank eingetragen und korrekt sortiert.

      Das Problem liegt wohl eher darin, das die Sortierung nicht vollständig ist.
      Du fügst ja mehrere Datensätze ein, die das gleiche Datum beinhalten können.
      Hier kann man sich auf verschiedene Art helfen. Entweder wird ein Zeiteintrag mit aufgenommen oder, was häufiger genutzt wird, es wird eine lange fortlaufende Nummer mitgeführt (Start z.B. bei 1000)
      Dadurch werden die Einträge dann in eine korrekte Sortierung gezwungen.

      SetCurSel ist übrigens in X4 gegen "SelectString(N1,N2,S)" zu ersetzen.

      Ein Sortierstring kann z.B. aus SortStr$ = Str$(kz) $ CToD$(datum) $ Str$(LfdNr) zusammengesetzt und als erste Spalte eingetragen werden. Dann ist SortStr$ in SelectString zum Ansteuern da.
      Und setzt man diesen Sortierstring dann an die erste Stelle und die Länge auf Null, dann wird der String nicht angezeigt aber zum Sortieren und anwählen genutzt ( hatte P.Specht in #13 schon genannt).
      Programmieren, das spannendste Detektivspiel der Welt.

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Michael Wodrich ()