Das Forentreffen 2018 findet am 20./21. April in Dresden statt. Weitere Infos hier
Zur Homepage des Deutschsprachige Xbase-Entwickler e. V.
Xbase++-Wiki des Deutschsprachige Xbase-Entwickler e. V.

XbpBrowse() aufbrezeln

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

XbpBrowse() aufbrezeln

Beitrag von Jan » Fr, 21. Jul 2017 19:47

Hallo,

in einem XbpBrowse() zeige ich ja normalerweise Daten aus einer dbf oder einem Array an, aber eben immer nur Sätze aus einer einzigen Quelle. Gibt es die Möglichkeit, diese Anzeige virtuell zu erweitern? Mir geht es dabei um fogendes: Ich browse da eine dbf. Möchte aber aus funktionalen Gründen gerne ein oder zwei "Sätze" zusätzlich am Anfang anzeigen und auswählbar machen. Geht sowas überhaupt?

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13596
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Martin Altmann » Fr, 21. Jul 2017 20:58

Klar,
indem du (z. B.) die Sätze in ein Array schreibst, erweiterst/ergänzt und dieses dann im Xbp_Browse anzeigst.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Jan » Fr, 21. Jul 2017 21:46

Hallo Martin,

das ist ja das Problem - die Daten aus der dbf in ein Array schreiben wird eher nicht möglich sein. Anonsten wär das ja einfach.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 13596
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Martin Altmann » Fr, 21. Jul 2017 23:23

Warum sollte das nicht möglich sein :?:
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpBrowse() aufbrezeln

Beitrag von AUGE_OHR » Sa, 22. Jul 2017 0:43

Jan hat geschrieben:
Fr, 21. Jul 2017 19:47
Möchte aber aus funktionalen Gründen gerne ein oder zwei "Sätze" zusätzlich am Anfang anzeigen und auswählbar machen. Geht sowas überhaupt?
ich denke Nein denn bedingt durch den "Skipper" kannst du nur das anzeigen was die Datenquelle hergibt.

Frage : was willst du den zusätzlich anzeigen ? wie wäre denn ein Tooltip ?
gruss by OHR
Jimmy

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Jan » Sa, 22. Jul 2017 6:13

Martin,

weil das Array zu groß werden würde. Klar könnte ich die dbf immer stückchenweise in den Browse laden. Aber das ist halt alles nicht ganz sooo smpel. U. a. auch deswegen, weil der Browse durch Klick auf die Header-Spalten umsortiert werden kann. Das Ganze wird also etwas aufwändiger. Deshalb die Frage, ob das mit irgendwelchen Tricks nicht auch direkt möglich wäre.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Jan » Sa, 22. Jul 2017 6:15

Jimmy,

was soll denn ein Tooltip da bewirken können? Wenn ich dem Browse zusätzliche Sätze unterschieben möchte, dann brauch ich ja die Daten dort. Und nicht irgendwo her einen Tooltip.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2288
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Wolfgang Ciriack » Sa, 22. Jul 2017 8:03

Füge dir doch 2 Dummy-Datensätze in die Datenbank ein, die du nach deinem Bedarf vor dem Anzeigen beschreibst.
Anders wird das wohl sonst nicht möglich sein.
Viele Grüße
Wolfgang

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Jan » Sa, 22. Jul 2017 8:45

Moin Wolfgang,

hmm. Auch 'ne Idee. Muß ich mir mal näher durch den Kopf gehen lassen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6802
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Tom » Sa, 22. Jul 2017 8:52

Das kann man alles sehr lässig über die Navi-Codeblöcke erledigen. Ich habe Brwses, die mehrere Zeilen je Datensatz anzeigen, es gibt Tabellen mit Zwischenzeilen und vieles mehr. Das ist nicht trivial, aber hinzukriegen.
Herzlich,
Tom

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Jan » Sa, 22. Jul 2017 9:59

Moin Tom,

in welcher Richtung meinst Du das? Die dbf satzweise in ein gebrowstes Array übertragen? Oder im Browse Sätze "unterjubeln"? Mir würde es erstmal ja schon genügen, wenn ich eine einzelne Kopfzeile einbauen könnte.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1934
Registriert: Fr, 08. Feb 2008 21:29

Re: XbpBrowse() aufbrezeln

Beitrag von georg » Sa, 22. Jul 2017 11:43

Hallo, Jan -


Tom meinte, was er schrieb. Der Ansatzpunkt ist die Skip-Logik.

Schreibe eine eigene Funktion, die Du dem :skipBlock zuweist, und in dieser Funktion entscheidest Du, wie Du vorgehst.

Stellen wir uns vor, Du willst eine Auftragsdatei anzeigen - normalerweise zeigt man nur eine Zeile je Auftrag an. Du willst aber unterhalb der Zeile für den Auftrag (z.B. eingerückt) die Auftragspositionen ebenfalls anzeigen, jede Position in einer eigenen Zeile.

Beginnen wir mit Auftrag 1, der hat 2 Positionen, Auftrag 2 hat 3 Positionen, und Auftrag 3 hat eine Position:

Auftragskopf 1
- Position 1
- Position 2
Auftragskopf 2
- Position 1
- Position 2
- Position 3
Auftragskopf 3
- Position 1
Auftragskopf 4
...

Die Funktion, die von :skipBlock ausgeführt wird, muss feststellen, wieviele Positionen vorhanden sind und entsprechend handeln, z.B. beim ersten Satz im Browse wird der Auftragssatz 1 positioniert. Beim folgenden Skip wird ermittelt, dass man im Auftrag #1 ist, und noch keine Position angezeigt wird - also wird auf die Position 1 des ersten Auftrags positioniert. Beim nächsten Skip bleibt der Auftrag #1 stehen, und es wird auf Position 2 positioniert. Erst beim vierten Skip wechselt der Auftrag.

Und diese Logik ist eben nicht trivial, wie Tom schrieb. Dazu braucht es vielleicht auch ein wenig OwnerDrawing, um z.B. die Auftragskopfsätze von den Positionssätzen optisch abzugrenzen.

Dazu kommt (immer an meinem Beispiel hängend), dass die Anzeige nicht mit (alias)->(fieldget(3)) arbeiten kann, sondern sich die Logik mit der :skipBlock-Funktion teilen muss, denn die Anzeige eines Kopfsatzes ist anders als die eines Positionssatzes.

Ob die anderen Navigationsblöcke (goTopBlock etc.) betroffen sind, kann ich hier schlecht abschätzen. Aber zumindest für phyPosBlock wirst Du eine Anpassung analog zum :skipBlock implementieren müssen.

Aber es geht.
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6802
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Tom » Mo, 24. Jul 2017 13:30

Genau so, wie Georg es beschrieb. Alle Navigationscodeblöcke lassen sich ja überlagern bzw. bestücken, und damit hat man im Prinzip für jede Situation selbst die Entscheidung darüber, welche Daten angezeigt oder editiert werden können. Zusätzlich muss man dann natürlich auch in den Daten-Codeblöcken der Spalten auf so etwas reagieren. Zuweilen muss man mit dem Cargo oder anderen Objektvariablen ein bisschen hantieren, um die verschiedenen Möglichkeiten abzufangen, etwa, wenn man zwei Blindzeilen am Tabellenanfang hat, und dann je nachdem, ob man einen Direktsprung zu dieser Tabellenzeile hat oder auf andere Art dort ankommt. Neben "skipBlock" ist "goPosBlock" in diesem Zusammenhang ein wichtiger Slot. "posBlock" muss auch geändert werden, weil er z.B. für den Scrollbalken verwendet wird - er liefert relativ die Position in der Datenmenge. Und, und, und. Nicht trivial, aber es geht.

Da man in einem Browse aber sowieso machen kann, was man will, kann man auch ein simples Array browsen, das einfach nur alle Datensatznummern enthält - oder so viele Zeilen, wie es Datensätze gibt. So ein Array ist auch bei größeren Tabellen schnell bestückt. Und in der ersten Spalte, die tatsächlich Tabellendaten referenziert, setzt man dann im Datalink den Tabellenzeiger, abhängig davon, in welcher Arrayzeile man ist. Spezielle Kennungen oder Nummern liefern Auskunft darüber, dass man sich in Blind-, Zwischensummen- oder Zusatzzeilen befindet, und da reagieren die Codeblöcke dann anders. Auf diese Weise lässt sich auch Georgs Beispiel sehr schön umsetzen, also ein Browse, das z.B. Aufträge anzeigt und auf Wunsch die Positionen dazu. Eine zweite Spalte im Array würde in diesem Fall via TRUE/FALSE mitteilen, ob sich die Datensatznummer in Spalte 1 auf die Auftragsköpfe oder die Positionen bezieht. Dann verändert man die Darstellung einfach etwas, wofür man nicht einmal unbedingt mit Ownerdrawing arbeiten muss, denn manchmal reichen Marlett oder Wingdings, um in einer Spalte anzuzeigen, dass man gerade auf- oder eingeklappte Aufträge sieht. Der Fantasie sind da keine Grenzen gesetzt - man muss sich nur von dem Gedanken lösen, dass Browses dafür da sind, alle Zeilen genau einer Tabelle oder genau eines Arrays anzuzeigen. Sind sie nicht.
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpBrowse() aufbrezeln

Beitrag von AUGE_OHR » Mo, 24. Jul 2017 19:50

das leidige Thema von TBrowse / XbpBrowse was beides keine "echten" Windows Controls sind :roll:
bei dem von Jan gestellten Problem stellt sich also für mich die Frage ob man das mit einem XbPart "so" lösen sollte was nicht dem Windows Design entspricht.

wenn ich mir das Beispiel von Georg ansehe frage ich mich ob man die Positionen des Auftrag "on-fly" verbergen (Collaps) könnte ...
das in einem "Skipper" zu implementieren wäre schon ein gewaltiger Aufwand ähnlich dem Wunsch von Jan.

solange Jan aber nicht exakt beschreibt "warum" er "was" machen will ist es schwierig eine Alternative anzubieten.

btw. "was" ich in einem Control "machen" kann steht beim mir im Pop-Up Menu
---

das Beispiel von Georg würde ich mit einem Listview im "Groupview" Modes lösen.
der "Auftragskopf" steht direkt in der Zeile während die "Positionen" beim "aufklappen" (expand) erscheinen.

den "Groupview" Modus könnte man auch mit einem Treeview (links) und einer "gekoppelten" Anzeige einer Liste simulieren. das ist mit Listview kein Problem da der Aufbaut praktisch identisch ist (Treeview-Item entspricht einem Listview-Item)

wie man das mit einem TBrowse() / XbpBrowse lösen kann ... nur mit viel (umständlichen) Code.
gruss by OHR
Jimmy

georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1934
Registriert: Fr, 08. Feb 2008 21:29

Re: XbpBrowse() aufbrezeln

Beitrag von georg » Mo, 24. Jul 2017 20:52

Hallo, Jimmy -


es mag sein, dass bei meinem Beispiel ein XbpTreeView helfen könnte. Es kommt aber auch immer darauf an, ob ein Kunde eine solche Umsetzung akzeptieren würde. Aber wir verlaufen uns hier thematisch.

Mir ging es mehr darum, anhand eines konkreten Beispiels die erforderlichen Schritte aufzuzeigen. Dass dieses Beispiel von ganz weit weg an seinen Haaren hierher gezerrt wurde, das solltest Du nicht übersehen.

Aber ich kann auch Jan verstehen, dass er die Fragestellung nicht konkretisieren kann: man hat ja manchmal so eine halbgare Idee im Hinterkopf, für die aber eine Umsetzungsmöglichkeit fehlt. Hat man die Umsetzungsmöglichkeit, dann kann man auch die Idee konkretisieren (oder feststellen: es geht nicht).

Insgesamt (siehe auch Tom's Statement) denke ich, dass man mit den Xbase-Controls eine ganze Menge reissen kann, wenn man nur willens ist, mal ein wenig Zeit in das Erforschen neuer Dinge (OwnerDrawing, um eines zu nennen) zu stecken.

Und auch den Abstand zu gewinnen von dem "1 Satz in der Datei = 1 Zeile im Browse, 1 Zeile im Browse = 1 Satz in der Datei".

Eine eigene Skipper-Funktion kann z.B. helfen, bei komplexen Filterbedingungen den Filter selbst abzubilden. Man kann viel machen, aber man muss einfach auch mal die Frage stellen dürfen "geht so etwas"?
Liebe Grüsse aus der Eifel,

Georg

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 6802
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Tom » Mo, 24. Jul 2017 21:27

Übrigens ist der Quellcode von XbpBrowse in der Professional Subscription enthalten - geschrieben in Xbase++. Und er ist verständlich. Man kann also direkt an der Quelle bohren, wenn man möchte.
Herzlich,
Tom

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpBrowse() aufbrezeln

Beitrag von AUGE_OHR » Di, 25. Jul 2017 2:22

georg hat geschrieben:
Mo, 24. Jul 2017 20:52
Eine eigene Skipper-Funktion kann z.B. helfen, bei komplexen Filterbedingungen den Filter selbst abzubilden.
würdest du das mit SQL auch so machen ?
ich würde also vorher alle Bedingungen wie Index,SCOPE,FILTER setzen um möglichst wenig zu "skippen"
georg hat geschrieben:man hat ja manchmal so eine halbgare Idee im Hinterkopf, für die aber eine Umsetzungsmöglichkeit fehlt
es geht doch um die "Funktion" welche die Idee erfüllen soll was "mir" nicht klar ist.

@Jan : warum möchtest du "im" Browse eine weiter "Anzeige" ?

evtl. haben wir einen Tip oder eine andere Idee um an das Problem anzugehen.
man könnte z.b. ja ein weiteres (kleines) Browse oberhalb des Hauptbrowse einblenden mit einer "RELATION" ...
gruss by OHR
Jimmy

Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
Beiträge: 12309
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Kontaktdaten:

Re: XbpBrowse() aufbrezeln

Beitrag von Jan » Di, 25. Jul 2017 5:48

Moin alle zusammen,

da ist ja so richtig was zusammen gekommen über Nacht! Danke für Eure vielen Ideen und Gedanken.

Zunächst einmal grundsätzlich: Das hier ist die Fortsetzung eines anderen Themas von mir. Ich hatte da früher mal eine XbpComboBox() stehen. Das ging aber nicht mehr - jedenfalls nicht mehr so. Weil das einfach zu lmage gedauert hatte, das Listelement zu füllen. Und teilweise sogar zu groß wurde, da hat sich Xbase++ dann verabschiedet. Deswegen habe ich mir das aus einem XbpSle und einem XbpBrowse selber zusammen gebastelt. Weil ich dann mit dem Browse direkt auf die dbf gehen kann. Anzeige ohne Verzögerung, keine Größenbeschränkung im Inhalt. Das Ganze natürlich nicht als Klasse, Ihr kennt mich ja in der Beziehung. Aber trotzdem klappt das wirklich gut.

Leider hatte ich damals einen Punkt übersehen: Ich brauche als erste Zeile ein "Lösche mir alles aus dem SLE raus". Klar, das geht auch anders. Man kann das auch manuell im SLE machen (so ist es im aktuellen Zustand). Ich könnte da auch einen Button neben bauen, der das erledigen könnte. Aber die Kunden sind halt den Aufbau mit em Punkt in der Liste gewohnt, und das ist auch recht elegant. Von daher wäre es halt schön, wenn das wieder ginge.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 10580
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: XbpBrowse() aufbrezeln

Beitrag von AUGE_OHR » Mi, 26. Jul 2017 5:39

Jan hat geschrieben:
Di, 25. Jul 2017 5:48
Deswegen habe ich mir das aus einem XbpSle und einem XbpBrowse selber zusammen gebastelt.
...
Leider hatte ich damals einen Punkt übersehen: Ich brauche als erste Zeile ein "Lösche mir alles aus dem SLE raus".
hm ... aber warum willst du eine "Anzeige" für eine Aktion wenn es eine "definierte" Aktion sein soll.

Frage : hast du den oBrowse:Keyboard Slot belegt ?

ich gehe doch mal davon aus das du kaum was "aus" dem Browse löschen willst also könnte man K_DEL für eine andere Aktion benutzten z.b. "Lösche mir alles aus dem SLE raus"
gruss by OHR
Jimmy

Antworten