![]() |
Anzeige:
|
|
|||||||
| Helfer & Tools Programme für und in XProfan und Fragen dazu. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Hallo zusammen, ich habe ein Programm geschrieben, in dem Frank's Listviev.dll eine zentrale Rolle spielt. Es funzt auf XP-Rechnern wunderbar. Jetzt sollte es neuerdings auch auf einigen W7-Rechnern zum Einsatz kommen. Jedoch verhält sich W7 beim einfärben der Zeilen/Spalten nicht wie erwartet. Die Einfärbung wird nur dort durchgeführt, wenn ich mit den Cursor hoch/runter zappe.
Läßt sich blöde erklären, deshalb habe ich eine kleine Demo geschrieben, die genau dieses Problem reproduziert. Das Programm ist sofort lauffähig (listview.dll muß vorhanden sein). Ich habe es auf XP compiliert. Auf XP löppt alles wie's soll. Auf W7 wird die Spalte bei Cursor links/rechts nicht gefärbt - erst dann, wenn Cursor hoch/runter gedrückt wird. Und dann auch NUR die Zeilen, über die ich gerade hoch- oder runterzappe... Hat da jemand einen heißen Tip? Code:
'w7-verhalten bei einfärbung von zeilen-/spaltenfarben
Declare lvh&, ku&, spa&, aspm& '&
declare mark# '#
Def GetSysColor(1) !"USER32","GetSysColor" 'win farbschema laden
lvh& = @importdll("Listview.dll","") 'listview.dll laden & statisch linken
dim mark#, 64
Windowstyle 512 + 8 ' dialogfensterstil + 8
WindowTitle " Testtabelle"
Window 1024,700 'größe des hauptfensters
Cls GetSysColor(15) 'hauptfenster in den systemfarben darstellen
Proc beenden
CloseMessages(%HWND)
FreeDll lvh& 'dlls entladen
end
EndProc
Proc listebauen
Declare fn#
dim fn#, 50
ku& = CreateListView(%hwnd,%hinstance,$0,$FFFFFF,$FFFFFF,$21) 'tabelle erstellen
buildlistview(ku&,10,0,100,0) '10 spalten mit breite 100 erzeugen
WhileLoop 0, 10 'alle 10 spalten durchlaufen
String fn#, 0 = "Spalte " + Str$(&loop) ' feldnamen in speicherbereich schreiben
SetColumnName(ku&,fn#,&loop) 'betreffenden spaltennamen gemäß feldnamenliste festlegen
EndWhile
Dispose fn#
EndProc
Proc listefuellen
declare spalte#[10],zeiger#,z%
Dim spalte#[], 80
Dim zeiger#, 40 'bereich für 10 adressen
z%= -1 'indexzähler für spalte#[]
WhileLoop 0,36,4
inc z%
Long zeiger#, &loop = spalte#[z%] 'zeigerbereich mit den adressen des bereichsarrays füllen
EndWhile
WhileLoop 0,20 '20 zeilen anhängen
z%= -1 'indexzähler für spalte#[]
While z% < 10 'alle elemente von spalte#[] durchlaufen
Inc z%
String spalte#[z%], 0, "Zeile " + Str$(&loop) + "- Spalte " + Str$(z%) 'aktuellen spalteninhalt in bereichsarray schreiben
EndWhile
SItem(ku&,zeiger#,9) 'zeile mit den vorbelegten werten einfügen (zeile 0-9)
EndWhile
Dispose spalte#[]
Dispose zeiger#
EndProc
Proc spmark
'färbt eine spalte (hintergrund) im listview in eine andere farbe - (index der spalte, die eingefärbt werden soll, wird in globale longvariable spa& gelesen)
Clear mark# 'speicherbereich für die spaltenfarben mit nullen füllen
Byte mark#,spa&,1 'das der spaltennr. entsprechende byte auf 1 setzen
RaiseColumns(ku&,mark#,0,$D9FBDA) 'spaltenhintergrundfarbe setzen (helles grün)
locate 1,1
Print "Spalte",spa&;" "
setfocus(ku&) 'focus auf die tabelle setzen
EndProc
listebauen 'listview erstellen & spaltenköpfe beschriften
listefuellen 'testdaten ins listview schreiben
ShowListview(ku&,5,30,1010,400) 'tabelle anzeigen
InitMessages(%HWND) 'subclassing für das hauptfenster aktivieren
Usermessages $1400 'messages, die das listview ans hauptfenster schicken soll
spa& = 5 'spaltenzeiger setzen
spmark 'spalte einfärben
locate 1,30
Print "Mit Cursor links/rechts kann eine Spalte markiert werden - Esc=Ende"
while 1
waitinput
'tastencodes auswerten, die vom system kommen
If %key = 2
beenden
ElseIf %key = 13 'wenn enter in der tabelle gedrückt wurde
Print "Enter"
setfocus(ku&) 'focus auf die tabelle setzen
EndIf
'usermessages, die das listview sendet, auswerten
if %umessage = $1400 'wenn eine taste gedrückt wurde
if (&ulParam = 38) or (&ulParam = 40) 'wenn cursor hoch/runter gedrückt wurde
'aktion bei cursor hoch/runter
ElseIf &ulParam = 37 'wenn cursor links gedrückt wurde
if spa& > 0 'wenn akt. spaltenindex mindestens 1 ist
dec spa& 'sp.index um eins verringern
spmark 'markierung in tabelle setzen
EndIf
ElseIf &ulParam = 39 'wenn cursor rechts gedrückt wurde
if spa& < 9 'wenn akt. spaltenindex höchstens 8 ist
inc spa& 'sp.index um eins erhöhen
spmark 'edit-markierung in tabelle setzen
EndIf
EndIf 'ende von tastendruck &ulParam = ...
EndIf 'ende von %umessage = ....
endwhile
beenden
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 Geändert von JörgG (21.11.2011 um 21:31 Uhr) |
|
|
|
|
|
|
#2 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.093
|
Muss wohl einmal neugezeichnet werden. Bau vor der Schleife doch mal ein UpdateListview(lvhandle) ein. Hab grad nur XP zum Testen.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#3 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
Reagiert bei mir (im Interpreter), wenn bei jedem einzelnen Tastendruck UpdateListview(ku&) eingefügt wird, aber lediglich im aktiven Feld, und das auch erst, wenn man dieses verlässt...
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 |
|
|
|
|
|
#4 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
oh Sorry, hatte ich vergessen zu erwähnen: UpdateListview(lvhandle) war auch meine erste Idee - mit dem selben Ergebnis wie bei Peter...
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#5 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
ich habe jetzt mal mit den obigen Testcode rumexperimentiert, um irgendwie in die Nähe einer Erklärung zu kommen.
-Komischerweise wird die Spalte 5 ja EINMALIG eingefärbt (vor der Ereignisschleife). Mit Cursor L/R wird später exakt die selbe Proc aufgerufen - Nichts! -Wenn ich die Zeile mit print "Mit Cursor..." VOR den Aufruf für Zeile 5 setze, wird auch diese NICHT mehr eingefärbt - wenn ich jeweils nach dem spmark-Aufruf in der Ereignisschleife den Listview-Befehl 'UpdateListview(ku&)' ausführe, wird genau die ERSTE Zeile in der betreffenden Spalte eingefärbt. Ansonsten wird nur beim Scrollen bzw. Cursor hoch/runter beim verlassen jede einzelne Zeile gefärbt (zum scrollen einfach in proc 'listefuellen' in der Schleife für Zeilen anhängen die Schleifenwiederholungen erhöhen)
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
|
#6 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
Man müßte vielleicht einen raus- und wieder rein-"hüpfenden" Feldcursor erzeugen... (nur so ein Gedanke).
Ähnliche Effekte (Beobachtung) gibt es mit 32-bit-Programmen, die Plugins verwenden: Beim 1. Mal starten klappt alles, bricht man das Plugin ab, geht in Win7 garnichts mehr damit - es lässt sich nie wieder starten, erst nach schließen und komplettem Neustart!
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 Geändert von p. specht (23.11.2011 um 00:19 Uhr) |
|
|
|
|
|
#7 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
vllt. ist das auch einfach nur ein W7-Fehler? So ausgereift ist es ja noch nicht.
Wie meinst du das mit den "hüpfenden" Feldcursor?
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#8 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Eigentlich sollte W7 ja etwas weiter sein als Vista
Gruß Volkmar |
|
|
|
|
|
#9 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.093
|
Das ist kein W7-Fehler, nur die Messageverarbeitung ist etwas anders, Stichwort hovern. Sobald ich unter W7 laufe, schau ich mal nach, ob ich das beseitigen kann.
Könntest mal testen: ~UpdateWindow(lvhandle&) und/oder ~InvalidateRect(lvhandle&, 0, 1), bzw. anstatt lvhandle& mal %hwnd einsetzen. Mit einem davon wirds funktionieren.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#10 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
Ok, ich spiel das mal durch - muß bis morgen warten, weil die W7-Rechner auf Arbeit stehen - zu Hause hab ich ausschließlich XP-Rechner
Danke für den Tip
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
|
#11 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 23.01.2011
Ort: Bernburg
Alter: 58
Beiträge: 756
|
Mal unter Vista probiert, UpdateWindow, egal ob %hwnd oder ku& bringt nichts, egal wo. InvalidateRect(ku&, 0, 1) unmittelbar unter der Zeile RaiseColumns(ku&,mark#,0,$D9FBDA) und es klappt.
Gruß Volkmar |
|
|
|
|
|
#12 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.093
|
Das macht auch Sinn, weil ein Neuzeichnen ausgelöst wird.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#13 (Direktlink) |
|
Weiß worum´s geht
![]() Registriert seit: 08.12.2009
Ort: Mecklenburg
Beiträge: 202
|
cool
Jedenfalls hab jetzt wieder Hoffnung. Frank, würdest du denn ggf. die Listview.dll entsprechend ändern (falls nötig) - Könnte ja sein, daß sonst das Aktualisieren doppelt-gemoppelt gemacht wird?
__________________
Gruß Jörg Ideen gibt es viele - man muß sie nur haben... XProfan 11.2, XP-Pro SP2/3 |
|
|
|
|
|
#14 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 05.02.2009
Ort: Westliches NRW
Alter: 44
Beiträge: 5.093
|
Ja, klar. Gib mir aber etwas Zeit.
__________________
Gruß, Frank ![]() Webpage http://frabbing.bplaced.net mit Freeware - Tools, Spiele und Grafiken. |
|
|
|
|
|
#15 (Direktlink) |
|
Dauergast
![]() Registriert seit: 06.02.2009
Ort: Wien, Österreich
Beiträge: 1.078
|
InvalidateRect(ku&, 0, 1) ... Errorfenster "Funktion unbekannt"...
Gibt´s für XProf11.2a auch dafür ein Workaround?
__________________
Win7-64HomPremSP1,XProfan11.2a,XPIA,JWasm,XPSE,IntelCoreQuad2.5GHz/4GB/je1TB HD intern:esataBay:USB2:USB3 |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Win7 home premium auf Win7 Ultimate upgraden | Betatester | Windows 7 | 8 | 15.12.2010 21:09 |
| Win7-64bit gegen Win7-32bit | Daryll | Windows 7 | 7 | 31.05.2010 18:34 |
| Wie baue ich listview ein? | Peter C. | Dlls, Includes, Units & Prozeduren | 12 | 31.03.2009 08:14 |
| listview | Peter C. | Spezielles | 6 | 29.03.2009 00:41 |
| Listview | Peter C. | Helfer & Tools | 3 | 28.03.2009 09:30 |