Seite 1 von 1

:lbdblclick [ERLEDIGT]

Verfasst: Mi, 21. Jul 2010 13:47
von Manfred
Ich habe im Moment ein Phänomen, das ich nicht wirklich nachvollziehen kann:

Code: Alles auswählen

DCBROWSECOL DATA {|| IF(! (oSekunden2Routen:nArea)->(Eof()), IF( (oSekunden2Routen:nArea)->gesperrt,"Ja","Nein"),NIL) };
                     EVAL {|x|x:dataArea:lbDblClick := {|a,b,o| IF(oBrowseBez:colPos=2,;
                                                                  (oSekunden2Routen:felderlesen(),;
                                                                  oSekunden2Routen:gesperrt := ! (oSekunden2Routen:nArea)->gesperrt,;
                                                                  oSekunden2Routen:felderschreiben(oSekunden2Routen),;
                                                                  dc_getrefresh(getlist) ),NIL);
                                                       };
                          };
Es passiert immer wieder, dass der Doppelklick nur einen Sprung in die Zeile darunter bewirkt, ohne den Status zu ändern von Ja auf Nein, oder umgekehrt. Zuerst dachte ich meine Maus wäre kaputt, aber jetzt nachdem der Kunde auch andauernd das Problem hat, frage ich mich, kann das an dem Codeblock lbDblClick liegen, oder wo müßte ich mal anfangen zu suchen?

Also direkt vorne weg, die Maus wurde schon gewechselt, das Mauspad wurde genommen, in anderen Programmen parallel wurde getestet. Daran liegt es also nicht.

Re: :lbdblclick

Verfasst: Mi, 21. Jul 2010 13:50
von Tom
DC_GetRefresh(GetList) refreshed Browses meistens nicht. Setz mal davor ein oBrowseBez:RefreshCurrent(). Wenn Du in der App außerdem irgendwo DC_GetWhenOnBrowseItemMarked(.T.) gesetzt hast, kannst Du das DC_GetRefresh() auch ganz weglassen, weil dann mit jedem Refresh eines Browses alle WHEN-Abhängigkeiten automatisch aktualisiert werden.

Re: :lbdblclick

Verfasst: Mi, 21. Jul 2010 14:24
von Manfred
Danke Tom,

das scheint es gewesen zu sein. refreshCurrent() hat erstmal das gegeben, was ich wollte.

Re: :lbdblclick [ERLEDIGT]

Verfasst: Mi, 21. Jul 2010 14:28
von Tom
Freut mich. :)

Wie gesagt, man sollte sich nicht darauf verlassen, dass DC_GetRefresh(GetList) auch für die Aktualisierung aller Browses sorgt. Eher sogar nicht - aus gutem Grund (weil Browses zuweilen ihrerseits wieder Objektabhängigkeiten haben usw.). Deshalb sind :RefreshAll() und :RefreshCurrent() in solchen Momenten die Methoden der Wahl. Mit der o.g. Get-/Set-Funktion erreichst Du, dass andere Objekte, deren WHEN-/EDITPROTECT-Klauseln abhängig von der aktuellen Browse-Zeile sind, immer automatisch aktualisiert werden:

Code: Alles auswählen

@ 1,1 DCBROWSE oBrowse DATA aMeineDaten ...
DCBROWSECOL ELEMENT 1..

@ 10,1 DCPUSHBUTTON CAPTION 'Ändern' ... WHEN {||aMeineDaten[DC_BrowseCol(oBrowse),2] = "ja"}
Wenn hier die Daten geändert werden und anschließend :RefreshCurrent() oder :RefreshAll() erfolgt, ändert sich auch die Verfügbarkeit des Buttons. Aber, wie gesagt: Nur, wenn DC_GetWhenOnBrowseItemMarked(.T.) irgendwo vorher gesetzt wurde.

Re: :lbdblclick [ERLEDIGT]

Verfasst: Mi, 21. Jul 2010 14:33
von Manfred
:thumbright:

wieder was dazu gelernt.

Re: :lbdblclick [ERLEDIGT]

Verfasst: Di, 23. Jan 2018 8:27
von Manfred
Das Problem ist immer noch nicht aus der Welt. Mal klappt es, und dann muß man wieder mehrmals doppelklicken.

Re: :lbdblclick [ERLEDIGT]

Verfasst: Di, 23. Jan 2018 9:08
von brandelh
das Konstrukt sieht ja richtig komplex aus, wenn du das in eine Funktion packen würdest und nur diese aufrufst, wäre das debuggen leichter ;-)

Re: :lbdblclick [ERLEDIGT]

Verfasst: Di, 23. Jan 2018 9:16
von Manfred
ja, hatte ich auch schon drüber nachgedacht, aber das ist ja ab und an mein Problem. Wenn ich es einfacher zu machen glaube, dann...... :badgrin:

Re: :lbdblclick [ERLEDIGT]

Verfasst: Di, 23. Jan 2018 9:30
von Tom
Ist doch überhaupt nicht so komplex. Wenn die Spaltenposition im Browse 2 ist, was ich originell finde, denn das LbDblClick hängt ja direkt an einer Spalte (es wird also sowieso nur beim Doppelklick genau in dieser Spalte aktiviert), soll der Doppelklick die Sperre, das Felderlesen, das Felderschreiben und die Entsperrung auslösen. Anschließend erfolgt ein Refresh. Das müsste eigentlich immer funktionieren. Hilfreich wäre möglicherweise, in den Codeblock noch etwas Debugcode zu hängen. Möglicherweise machen die aufgerufenen Funktionen nicht immer das, was sie tun sollen - und das Problem liegt also ganz woanders.

Re: :lbdblclick [ERLEDIGT]

Verfasst: Di, 23. Jan 2018 20:44
von AUGE_OHR
@Manfred : was für ein "Cursor" wird da verwendet : ROW oder CELL :?:

überhaupt stelle ich mir die Frage wieso du auf o:DataArea:lbDblClick kommst statt "normal" o:DataArea:ItemSelected was dir ja auch Parameter (aRowCol) ausgibt

Code: Alles auswählen

:itemSelected := {| aRowCol, uNIL, self | ... }
--

Hubert sagte ja du sollst den Code in eine Function auslagern und "einfach" gestalten.
solche "verschachtelten" Konstruktion noch "nach Jahren" zu durchschauen ist einfach schwer.