Wir macht ihr das?
Vorgabewerte fest codiert im Quelltext und Browse anzeigen?
Danach benutzerdefinierte Werte suchen (Inidatei pro Benutzer oder Registry pro XbasePart)?
Browse neu aufbauen mit Benutzerwerten
Speichern der vom Benutzer veränderten Werte beim jeweiligen Resize des Column (welcher Slot und muss dann jedes Column einen belegten resize-Slot haben) oder beim Destroy des gesamten XbpBrowse (uneffektiv, weil in 99% der Destroys unnötig)?
Besserer Ansatz?
XbpBrowse und Spaltenbreiten speichern
Moderator: Moderatoren
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
XbpBrowse und Spaltenbreiten speichern
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Manfred
- Foren-Administrator
- Beiträge: 21189
- Registriert: Di, 29. Nov 2005 16:58
- Wohnort: Kreis Wesel
- Hat sich bedankt: 210 Mal
- Danksagung erhalten: 67 Mal
Re: XbpBrowse und Spaltenbreiten speichern
Hi,
ich schreibe die Werte in eine INI Datei und lese sie vor der Browserzeugung aus. Danach (Browse wird geschlossen) schreibe ich die dann aktuellen Werte (falls jemand die Masse geändert haben sollte) wieder in die INI Datei für den nächsten Browsevorgang. Die Ini Datei bekommt einen speziellen Namen, damit sie WS und/oder Benutzern zugeordnet werden kann. Somit hat jeder Benutzer immer seine Maße, die er haben wollte. Die INI Datei kann anfänglich vorgegeben werden, oder wird mit pauschalen Werte am Anfang erzeugt.
ich schreibe die Werte in eine INI Datei und lese sie vor der Browserzeugung aus. Danach (Browse wird geschlossen) schreibe ich die dann aktuellen Werte (falls jemand die Masse geändert haben sollte) wieder in die INI Datei für den nächsten Browsevorgang. Die Ini Datei bekommt einen speziellen Namen, damit sie WS und/oder Benutzern zugeordnet werden kann. Somit hat jeder Benutzer immer seine Maße, die er haben wollte. Die INI Datei kann anfänglich vorgegeben werden, oder wird mit pauschalen Werte am Anfang erzeugt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9361
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 101 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: XbpBrowse und Spaltenbreiten speichern
Ich mache das nicht selbst, kann aber darauf verweisen, wie Roger Donnay das in seiner eXpress++-Library macht, die ich verwende. Da wird einmalig eine Get-Set-Funktion "DC_AutoRestoreBrowse()" aufgerufen, die als Parameter einen Registry-Bereich erhält, in dem die Daten für die Spaltenbreiten gespeichert werden sollen. Sobald man dann Spalten in einem Browse verändert, wird ein Schlüssel erzeugt, dessen Name sich aus dem Namen der aufrufenden Funktion (in der das Browse erzeugt wird) und einer ID zusammensetzt, die man dem Browse geben kann. Nach meinem Dafürhalten handelt es sich um einen konkatinierten Hex-Wert, der jeweils die Spalten identifiziert und deren Breite enthält. Wird dieses Browse in dieser Funktion dann abermals erzeugt, wird vor dem jeweiligen AddColumn() und/oder beim Erzeugen des Browse-Objekts geprüft, ob in der Speicherung eine veränderte Spaltenbreite enthalten ist, und diese wird dann herangezogen. Für die Registry-Speicherung wähle ich CURRENT_USER -> Software -> <Name unserer Software > -> Initialen des Benutzers als Gruppe, so dass die Systematik benutzerbezogen arbeitet, auch in Terminal-Server-Umgebungen. Mein Aufwand: Einmalig die Funktion aufrufen und bei jedem Browse eine ID vergeben, feddisch. Zusätzlich gibt es eine (von mir programmierte) Funktionalität, die es erlaubt, all diese Speicherungen wieder zu löschen bzw. auf die Standardwerte zu setzen, was dasselbe ist. Notfalls kann das unser Support auch gezielt tun, weil leicht erkennbar ist, ob für bestimmte Browses solche Speicherungen vorliegen.
Herzlich,
Tom
Tom
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: XbpBrowse und Spaltenbreiten speichern
Danke.
Das hab ich mir gestern schon mal selber erarbeitet, die Überlegung war auch das alles in der Registrierung zu speichern, da dann der Benutzer und die jew. Hardware (= Auflösung) korrekt berücksichtigt wird:
Was mir hier halt nicht gefällt ist wie bei Manfred auch, das jedes Mal zu prüfen, also bei jedem destroy. Unnötiger Overhead.
Da ist der Ansatz über den column-Resize-Slot eleganter, wenn auch aufwändiger, weil ja jedes column dann einen Schreibvorgang auf die Registrierung auslöst und eine abgeleitete Klasse gemacht werden müsste. Die Lösung hier passt für meine bisherigen Xbase++-Programme besser.
Speichere auch immer im folgenden Schlüssel:
Das hab ich mir gestern schon mal selber erarbeitet, die Überlegung war auch das alles in der Registrierung zu speichern, da dann der Benutzer und die jew. Hardware (= Auflösung) korrekt berücksichtigt wird:
Code: Alles auswählen
Class MEIN_XbpBrowse from XbpBrowse
EXPORTED:
var cSpeichername, nGesamtbreite
INLINE METHOD Init(p1, p2, p3, p4, p5, p6 )
::XbpBrowse:Init( p1, p2, p3, p4, p5, p6 )
::cSpeichername := ""
::nGesamtbreite := 0
Return self
METHOD Destroy, Schreib_Reg, Lies_Reg
ENDCLASS
METHOD MEIN_XbpBrowse:Destroy
local i, nSpalten, aBreiten, nGesamt := 0
if .not. empty(::cSpeichername) // Spaltenbreiten speichern in Registry
nSpalten := ::colCount
aBreiten := array(nSpalten)
for i := 1 to nSpalten
aBreiten[i] := ::getColumn(i):currentsize()[1]
nGesamt += aBreiten[i]
next i
if ::nGesamtbreite <> nGesamt // nur dann in Registry speichern
::Schreib_Reg(aBreiten)
endif
endif
::XbpBrowse:destroy()
return self
METHOD MEIN_XbpBrowse:Schreib_Reg(aBreiten)
Da ist der Ansatz über den column-Resize-Slot eleganter, wenn auch aufwändiger, weil ja jedes column dann einen Schreibvorgang auf die Registrierung auslöst und eine abgeleitete Klasse gemacht werden müsste. Die Lösung hier passt für meine bisherigen Xbase++-Programme besser.
Speichere auch immer im folgenden Schlüssel:
und dann jeweils im Schlüssel cSpeichername für jedes Column einfach den Wert, also von 1-x.HKEY_CURRENT_USER\Software\Firmenname\Programmname
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>
- Werner_Bayern
- Der Entwickler von "Deep Thought"
- Beiträge: 2125
- Registriert: Sa, 30. Jan 2010 22:58
- Wohnort: Niederbayern
- Hat sich bedankt: 30 Mal
- Danksagung erhalten: 75 Mal
Re: XbpBrowse und Spaltenbreiten speichern
Scheint zu funktionieren:
Ist das Setzen der Spaltenbreite so effektiv?
Sind jetzt nur 2 Zeilen mehr im Code:
geändert am 13.11.2014, optimierter Code
Code: Alles auswählen
METHOD MEIN_XbpBrowse:Lies_Reg()
local i, oReg, nBreite, oXbpColumn
if .not. empty(::cSpeichername) // Spaltenbreiten lesen aus Registry
oReg := XbpReg():new(REGKEYSW)
If .not. oReg:Status()
return self
endif
oReg := XbpReg():new(REGKEYFIRMA)
if .not. oReg:Status() .or. .not. oReg:MoveDown(PROGRAMMNAME) .or. .not. oReg:MoveDown(::cSpeichername)
// noch keine Werte in der Registrierung
return self
endif
::nGesamtbreite := 0
for i := 1 to ::colCount
nBreite := oReg:GetValue(ltrim(str(i)))
if valtype(nBreite) == "N" .and. nBreite > 10
oXbpColumn := ::getColumn(i)
oXbpColumn:setSize({nBreite, oXbpColumn:currentsize()[2]})
::nGesamtbreite += nBreite
endif
next i
endif
return self
Sind jetzt nur 2 Zeilen mehr im Code:
Code: Alles auswählen
oBrowse:cSpeichername := "AdressenAuflistung" // z. B.
oBrowse:Lies_Reg()
es grüßt
Werner
<when the music is over, turn off the lights!>
Werner
<when the music is over, turn off the lights!>