Seite 1 von 1

Textmodus: Browse-Refresh stört Text-Kopieren [ERLEDIGT]

Verfasst: Fr, 29. Mai 2009 16:17
von dtmackenzie
Es geht wieder um den Quick-Edit Modus...
In der Clipper-kompilierte Anwendung läßt sich ohne Probleme Text aus einer Browse-Zeile kopieren.
Wenn ich aber mit Xbase kompiliere dann wird während der Textauswahl die Markierung ständig zurückgesetzt bzw. geändert.
Dies scheint im gleichen Takt mit der sekündlichen Browse-Aktualisierung zu passieren.
Dadurch ist es nahezu unmöglich, Text aus der Browse-Zeile zu kopieren.
Hat jemand eine Idee wie ich das Problem umgehen könnte?

Ein anderes, kleineres Problem gibt es auch in diesem Zusammenhang.
Nach dem Öffnen eines Browse-Fensters gibt ein sporadisches "Raster-zucken" - als ob eine (Teil-) Pixelreihe kurz geändert wurde.
Dies passiert unregelmäßig, in durchschnitt vielleicht zehnmal pro Minute, und auf verschiedenen Stellen im Fenster.
Ich glaube nicht, dass es die (hoffentlich baldige!) Einführung der Xbase-kompilierte Anwendung verhindern wird, trotzdem kann ich mich vorstellen, dass die Benutzer nach einem ganzen Tag vor dem Bildschirm davon genervt werden könnten, also wäre ich auch diesbezüglich für jede Lösungsanregung dankbar.

Die Browse-Hauptschleife sieht wie folgt aus ("markierte Zeilen anzeigen" im Code ist übrigens eine ganz andere Geschichte, eine Satzauswahl):

Code: Alles auswählen

WHILE lMore
    IF browse:colPos <= browse:freeze
        browse:colPos := browse:freeze + 1
    END

    nKey:=0
    WHILE nKey==0 .AND. !browse:stabilize()
        nKey:=INKEY()
    END
    
    IF browse:stable
        nrow:=ROW()     //Cursorposition merken
        ncol:=COL()
        IF !EMPTY(fu)
            EVAL(fu)    //zusätzlichen (Anzeige-) Block ausführen
        END
        SETPOS(nrow, ncol)  //Cursorposition wieder herstellen

        refreshMark()   //markierte Zeilen anzeigen
        IF browse:hitBottom .AND. .NOT. IS_APPEND_MODE(browse) .AND. edit
            TURN_ON_APPEND_MODE(browse)
            nKey := K_DOWN
            lNoKeyWait := .T.   // 1. Refresh sofort, nicht erst nach 1 Sekunde
        ELSE
            IF browse:hitTop .OR. browse:hitBottom
                TONE(880,1)
            END
#ifdef __XPP__
            WHILE lNoKeyWait .OR. (nKey:=INKEY(1)) == 0
               lNoKeyWait := .F.
#else
            WHILE (nKey:=INKEY(1)) == 0
#endif
               DISPBEGIN()
                browse:refreshAll()     //Gültigkeit aufheben
                browse:forceStable()    //für Novell-Netz
                refreshMark()
               DISPEND()
            END
        END
    END
    EApplyKey(browse, nKey)     //Tastatureingabe auswerten
END
Die lNoKeyWait Optimierung ist übrigens nicht die Ursache - beide Probleme traten auch davor aus.

Vielen Dank und schöne Pfingsten,
David Mackenzie
Leipzig

Re: Textmodus: Browse-Refresh stört Text-Kopieren

Verfasst: Fr, 29. Mai 2009 16:35
von AUGE_OHR
ich "sehen" INKEY() ...
hast du SetMouse(.T.) ?

schau dir doch mal c:\Alaska\XPPW32\source\SYS\BrowSys.prg an.
ich habe keine Probleme bei "markieren" in einem TBrowse.

Re: Textmodus: Browse-Refresh stört Text-Kopieren

Verfasst: Fr, 29. Mai 2009 17:20
von dtmackenzie
Hallo Jimmy,

ich habe kein SetMouse(.T.) in der Anwendung - es sollte erstmal eine reine Textmodus-Portierung von Clipper sein mit nur minimalen Änderungen... Die Clipper-Kompatibilität von Xbase++ hat aber definitiv ihre Grenzen.
BrowSys.prg sieht ganz anders aus als der existierende Clipper-Code, mir ist etwas mulmig dabei (das Testen geht von Vorne los), aber ich werde es auf alle Fälle nach Pfingsten in Detail anschauen und ausprobieren falls es keine einfachere Lösung zu finden gibt.
Danke für Dein Tipp!

David

Re: Textmodus: Browse-Refresh stört Text-Kopieren

Verfasst: Di, 02. Jun 2009 13:29
von dtmackenzie
Hallo Jimmy,

ich habe die 2 Probleme vermieden in dem ich die innere "INKEY(1)"-Schleife für Xbase entfernt habe (Code unten).
Egal was ich displaymäßig in der Schleife gemacht habe (selbst nur DISPBEGIN()...DISPEND() ohne irgendwas dazwischen) kamen die 2 Probleme.
Zwar werden die Browser nun nicht mehr sekündlich aufgefrischt sondern erst nach dem nächsten Tastendruck, aber damit können die Benutzer besser leben als mit den anderen 2 Problemen.
BrowSys.prg macht übrigens keine solche sekündliche Auffrischung (und es fehlen einige erweiterte Funktionalitäten) aber der Vergleich hat mir wenigstens geholfen, in den sauren Apfel zu beißen.
Also Danke nochmals.

David

Code: Alles auswählen

WHILE lMore
    IF browse:colPos <= browse:freeze
        browse:colPos := browse:freeze + 1
    END

    nKey:=0
    WHILE nKey==0 .AND. !browse:stabilize()
        nKey:=INKEY()
    END
    
    IF browse:stable
        nrow:=ROW()     //Cursorposition merken
        ncol:=COL()
        IF !EMPTY(fu)
            EVAL(fu)    //zusätzlichen (Anzeige-) Block ausführen
        END
        SETPOS(nrow, ncol)  //Cursorposition wieder herstellen

        refreshMark()   //markierte Zeilen anzeigen
        IF browse:hitBottom .AND. .NOT. IS_APPEND_MODE(browse) .AND. edit
            TURN_ON_APPEND_MODE(browse)
            nKey := K_DOWN
        ELSE
            IF browse:hitTop .OR. browse:hitBottom
                TONE(880,1)
            END
#ifndef __XPP__
            WHILE (nKey:=INKEY(1)) == 0
#endif
               DISPBEGIN()
                browse:refreshAll()     //Gültigkeit aufheben
                browse:forceStable()    //für Novell-Netz
                refreshMark()
               DISPEND()
#ifdef __XPP__
            nKey:=INKEY(0)
#else
            END
#endif
        END
    END
    EApplyKey(browse, nKey)     //Tastatureingabe auswerten
END