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

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Zuletzt geändert von dtmackenzie am Di, 02. Jun 2009 13:30, insgesamt 1-mal geändert.
Viele Grüße,
David
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

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

Beitrag 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.
gruss by OHR
Jimmy
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Viele Grüße,
David
Benutzeravatar
dtmackenzie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Do, 22. Nov 2007 9:02
Wohnort: Leipzig
Hat sich bedankt: 66 Mal
Danksagung erhalten: 22 Mal
Kontaktdaten:

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

Beitrag 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
Viele Grüße,
David
Antworten