XbpBrowse und Spaltenbreiten speichern

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

XbpBrowse und Spaltenbreiten speichern

Beitrag von Werner_Bayern »

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?
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: XbpBrowse und Spaltenbreiten speichern

Beitrag von Manfred »

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.
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!!
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: XbpBrowse und Spaltenbreiten speichern

Beitrag von Tom »

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
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

Re: XbpBrowse und Spaltenbreiten speichern

Beitrag von Werner_Bayern »

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:

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) 
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:
HKEY_CURRENT_USER\Software\Firmenname\Programmname
und dann jeweils im Schlüssel cSpeichername für jedes Column einfach den Wert, also von 1-x.
es grüßt

Werner

<when the music is over, turn off the lights!>
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2121
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 30 Mal
Danksagung erhalten: 72 Mal

Re: XbpBrowse und Spaltenbreiten speichern

Beitrag von Werner_Bayern »

Scheint zu funktionieren:

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
Ist das Setzen der Spaltenbreite so effektiv?

Sind jetzt nur 2 Zeilen mehr im Code:

Code: Alles auswählen

oBrowse:cSpeichername := "AdressenAuflistung"  // z. B.
oBrowse:Lies_Reg()
geändert am 13.11.2014, optimierter Code
es grüßt

Werner

<when the music is over, turn off the lights!>
Antworten