Custom Listview-Problems

Started by Norbert Spoerl, July 16, 2012, 03:31:16 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Norbert Spoerl

Please read english text below.
----------------------------------
Guten Tag Theo,

ich habe ein Problem mit ListView und XP-Stil bzw. der Manifest-Datei.

Darf ich Dich bitten, mal über meine Übersetzung zu schauen, ob ich die so ins Forum stellen kann. Dann ist noch die Frage, ob ich es zuerst hier bei Jose oder im amerikanischen Forum versuchen soll. Beides gleichzeitig wird je eher nicht so gern gesehen.


Gruß
Norbert


>>>
Ich habe sehr viel Zeit damit verbracht, eine ListView Control DLL zu entwickeln, die meinen Wünschen entspricht. Bisher habe ich mit Anwendungen unter Win 98, Win 2000 und XP gearbeitet, die keine Manifest-Datei eingebunden haben. Als ich jetzt wegen dem Aussehen der Controls in der EXE die Manifest-Datei ("xxx.xml") eingebunden habe, mußte ich leider feststellen, daß meine ListView-DLL nicht mehr richtig funktioniert. Nach vielen Änderungsversuchen und Untersuchungen weiß ich nun, worin das Problem besteht.

Beim Einbinden der Manifest-Datei wird automatisch die ComCtl32.dll in der Version 6.0.xxx angesprochen. Ohne Manifest-Datei ist es die Version 5.82.xxx.
MS hat zugegeben, daß die Version 6 Bugs enthält. Die Vorschläge zur Umgehung der Bugs taugen nicht viel.

So sind meine Verhältnisse.
Die EXE ruft Funktionen der DLL auf. Die DLL erstellt und registriert eine neue Festerklasse. Damit wird ein Fenster erstellt. Ein ListView wird erstellt und auf das Fenster gesetzt. Die Nachrichtenverwaltung für das Fenster und das ListView Control erfolgt innerhalb der DLL. 

Nun meine Frage an die Experten.
Gibt es einen Weg, wie ich noch die alte Version der ComCtl32.dll für das ListView in der DLL nutzen kann, obwohl die EXE die Manifest eingebunden hat und die Controls der EXE den XP-Stil benutzen.
<<<

>>>
I have spent very much time to develop a ListView-Control-DLL, which corresponds to my wishes. Up to now I have worked with applications under Win98, Win2000 and XP, which have not included the manifest-file. As I have bound the Manifest ("xxx.xml") now, because of the better XP-Design of the Controls in the EXE, I had to see unfortunately, that my ListView-DLL works no more right. After many try of changes and investigations I know now, in what the problem exists.

When binding the Manifest-file, the ComCtl32.dll in the version 6.0.xxx is addressed automatically. Without Manifest-file it is the version 5.82.xxx.
MS has conceded, that the version 6 contains bugs. The suggestions for the evasion the bugs are not very useful. 

So are my relationships.
The EXE calls up Functions of the DLL. The DLL prepares and registers a new Window-Class. With it a window is prepared. A ListView is prepared and set on the window. The window message loop for the window and the ListView-Control works within the DLL.   

Now my question to the experts. 
Is there a way, as I can use still the old version the ComCtl32.dll for the ListView inside the DLL, although the calling up EXE has bound the Manifest and the Controls inside the EXE have the the XP-Style. 
<<<

Peter Weis

Hallo Norbert,

kannst mir sagen wo du Probleme mit der listview hast? vielleicht kann ich dir ja helfen? mußt den Fehler aber genauer beschreiben dann kann ich dir bestimmt helfen! :)

Grüße Peter! 

Theo Gottwald

Deine Übersetzung ist gut, Norbert.
Und Peter versteht sowieso deutsch  :-X der mag eh kein ausländisch.

Peter Weis

#3
Hallo Norbert,

du kannst ein Objekt bestimmt anspringen z.B.
LET objvar = NEWCOM CLSID ClassID$ LIB DLLName$
Voraussetzung  dafür das beide  DLL sich am Rechner befinden
Hoffe das hilft dir etwas weiter

Grüße Peter

Norbert Spoerl

Theo, thank you for seeing my translation.

>>>
Peter, es geht hier wirklich um Fehler in der Version 6 der comctl32.dll.
Siehe bitte http://support.microsoft.com/default.aspx?scid=kb;en-us;813791.
Die Gridlinien werden mit und nach dem Scrollen nicht korrekt gezeichnet.
Im Zusammenhang mit dem Scrollen liefert auch %LVM_GETTOPINDEX ab Version 6 einen falschen Wert.

Ich benötige eine Anwort auf meine gestellte Frage, ob ich in der DLL eine andere Version der comctl32.dll nutzen kann als in der EXE. 

Mit Deinem Hinweis mit dem Anspringen eines Objektes
LET objvar = NEWCOM CLSID ClassID$ LIB DLLName$
kann ich nichts anfangen, da ich von OOP keine Ahnung habe.

Beide Versionen der DLL sind auf dem Rechner. Ich könnte ja auch die Version 5.82.xxx direkt mit in den Pfad der EXE legen.
<<<

>>>
Peter, there are really bugs in the version 6 of the comctl32.dll.
See please http://support.microsoft.com/default.aspx?scid=kb;en-us;813791.
The gridlines are drawn not correctly with and after scrolling.
In connection with the scrolling  %LVM_GETTOPINDEX delivers also a wrong value in version 6. 

I need a answer to my question, if it possible to use inside the DLL a different version of the comctl.dll as in the EXE.     

With your reference with starting of an object
LET objvar = NEWCOM CLSID ClassID$ LIB DLLName$
can I do nothing. I have no expectation on OOP.

Both versions of the comctl32.dll are on the computer. I could put also the version 5.82.xxx directly into the path of the EXE.
<<<

Regards

José Roca

If you use a manifest, Windows will use version 6. Period.

BTW the bugs are fixed in the versión that ships with Windows 7. About XP, they just don't care anymore.

Peter Weis

hallo Norbert

handelt es sich um diesen Fehler?

QuoteDas ListView-Steuerelement gibt einen ungültigen Index zurück, wenn Sie in einer Anwendung, die auf einem Windows Vista/Windows XP/Windows Server 2003/Windows Server 2008-basierten Computer ausgeführt wird, eine LVM_GETTOPINDEX-Nachricht senden

Grüße Peter

Norbert Spoerl

#7
An Peter
Wahrscheinlich ist es nicht der beschriebene Fehler. Der Fehler hängt mit dem geänderten Scrollverhalten zusammen. Vor Version 6 hat LVM_GETTOPINDEX den richtigen Index geliefert, jetzt ist der Index immer der von vor dem Scrollen. D.h., ich liege um 1 daneben. Da hat sich was an der Reihenfolge in der Nachrichten-Verarbeitung geändert. 


Hello all,

MS has eliminated a bug - congratulation. How many years from XP to Win 7? 

In my firm work work more than the half of all PC still with XP.
I have here 2 computers. One with Win 2000, one with XP.   

It uses me now nothing, if the error is no more available in Win 7.

Once more my real question from the top. If it is somehow possible, that I can use in the Control-DLL the ListView from the comctl32.dll in version before 6.

Here is an example of  my control, so that you see, that it would be too bad, if I could insert it no more.

Peter Weis

Hi Norbert,

bin mir noch nicht Ganz sicher wo dein Fehler liegt den ich konnte es ja nicht austesteten das Bild sagt mir auch nicht viel
Habe dir aber eine stelle dir aber eine Visual Basic Funktion zur Verfügung die den Fehler korrigieren soll bin mir aber nicht sicher ob das der Fehler ist tapse immer noch etwas im dunklen


Private Declare Function SendMessage Lib "user32" _
                Alias "SendMessageA" ( _
                ByVal hWnd As IntPtr, _
                ByVal wMsg As Integer, _
                ByVal wParam As Integer, _
                ByVal lParam As Integer) As Integer

  Private Const LVM_FIRST = &H1000
  Private Const LVM_GETTOPINDEX = (LVM_FIRST + 39)

  Public Function LVGetTopIndex(ByVal hWndLV As IntPtr) As Integer

    LVGetTopIndex = SendMessage(hWndLV, _
                                LVM_GETTOPINDEX, _
                                0&, _
                                0&)

  End Function 'LVGetTopIndex

  Public Function LVSetTopIndex(ByVal lv As ListView, ByVal TopIndex As _
    Integer) As Integer
    Dim lvCurrTopIndex, lvCurrIndex As Integer
    Dim Diff, NewIndex As Integer

    On Error Resume Next
    LVSetTopIndex = -1 'Flag: Nix geändert
    lvCurrTopIndex = LVGetTopIndex(lv.Handle) 'Index 1. Eintrag im sichtbaren
    ' Bereich
    lvCurrIndex = lv.SelectedItems(0).Index 'Index des markierten Eintrages
    Diff = TopIndex - lvCurrTopIndex 'Differenz zwischen 1. und aktuellem
    ' Eintrag
    NewIndex = lvCurrIndex + Diff 'Index des Eintrages der ins Bild geholt
    ' werden muss
    If NewIndex < lv.Items.Count - 1 Then 'Hamwer überhaupt soviele?
      lv.Items(NewIndex).EnsureVisible() 'Jo, reinschieben
      LVSetTopIndex = NewIndex 'Index 1. Eintrag im sichtbaren Bereich
    End If

  End Function 'LVSetTopIndex



Grüße Peter

Norbert Spoerl

Hi Peter, erst mal vielen Dank, daß Du Dich mal wieder so reinkniest. Das Bild zeigt keinen Fehler, sondern ein Beispiel für mein Control. Linkerhand vom eigentlichen ListView ist ein von mir geschaffener Header für die Zeilen. Der muß mit scrollen, wenn ich das ListView scrolle. Ich muß also während des Scrollens ständig die Position (ganz oben, ganz unten oder irgendwo dazwischen) des ListViews abfragen. Das mache ich, indem ich nach dem obersten sichtbaren Feld frage (GETTOPINDEX) und darauf reagiere. Obwohl das Auge die veränderte Scroll-Position sieht, gibt bei dieser Abfrage das ListView den TopIndex der Zeile vor dem Scrollen um eine Zeile zurück. Hier hinkt ab Version 6 der comctl32.dll eine Nachricht hinterher. Das ist nur währen des Scrollens. Ist das Scrollen beendet, so funktioniert die Abfrage. Dann ist es aber für mich zu spät. Irgendwie läßt sich das evtl. noch hinbiegen. Aber es bleibt generell das Problem mit dem SmothScrolling. Dafür gibt es keine wirklich akzeptable Lösung. Darüber gibt es genug Beitäge im Netz. Das wurde auch im US-Forum schon mal angesprochen. Das einfachste wäre, wenn ich die alte DLL-Version weiter benutzen könnte. Aber wer möchte schon alle anderen Control noch im Stil vor XP sehen. Daher meine ursprüngliche Frage.

Schönen Feierabend!


Peter Weis

Hallo Norbert,
die Funktion die ich dir geschickt habe sollte das Porblem eigentlich beseitigen habe ich aus VB Archiv da wurde es beschrieben. konnte es aber nicht testen da ich das Problem noch nicht hatte!

beim Message LVGetTopIndex wird ein falschen Wert zurück gegeben!

hoffe das wir jetzt langsamm zusammen kommen wo es hengt :)

Hi Norbert habe Urlaub relaxe heute nur!!!!  ;D

Wen du möchtest schreibe ich dir die Funktion auf PowerBasic um!


Norbert Spoerl

Hallo Peter, Du bist wirklich immer hilfsbereit - Danke!

Dein Ansatz (vb-archiv) bringt mich nicht weiter. Ich hatte Dir schon gesagt, daß es mit einer geänderten Message-Emission des LV-Controls in der Version 6 zusammenhängt.
Den Unterschied in der Massage-Sendung beim Scrollen müßte ich untersuchen. Erschwerend kommt dazu, daß das LV in der Version 6 unterschiedlich arbeitet, bzw. Nachrichten verschickt, je nachdem, wie gescrollt wird (1. Scrollbalken ziehen; 2. Pfeilbuttons klicken; 3. mit Enter durch die Zellen springen).
Mir fehlt erst einmal die Zeit, die Sache weiter zu untersuchen. Mein Jahresurlaub steht an. Vorerst werde ich mir damit behelfen, das Control so zu gestalten, daß gar nicht gescrollt werden braucht. Eine andere Idee in dem Zusammenhang ist, nicht das interne Scrollen des LV zu nehmen, sondern das LV in maximaler Größe in eine Fenster zu legen, und das Fenster mit samt Inhalt (LV) zu scrollen. Das macht die Nachrichtenverarbeitung sicherlich einfacher.

Wenn Du Dir ein besseres Bild von der Sache machen möchtest, ich habe hier mal eine ZIP mit 3 Dateien angehängt. 2 x EXE, 1 x DLL. Eine EXE benutzt die Manifest (XP-on), die andere nicht (XP-off).

Gruß Norbert

P.SD.: Ich hoffe, Du hattest einen schönen freien Tag.

Peter Weis

Norbert,

Es fällt dir zwar schwer warum schickst mir nicht gleich den quelcode dann ist es für mich leichter mich rein zuarbeiten!

Dann kann ich mich richtig reinarbeiten und das ding durch debugen und sehen wie man den Fehler beseitigen kann!

Meine E-Mail Adresse hast ja!

Grüße Peter!

Peter Weis

#13
Hallo Norbert,

so wie ich das sehe das Problem das du hast ist unter windows 7 auch oder! Nach Eingabe beim Scrollen erscheint der wert aus der anderen Zeile darüber!


Grüße Peter

Norbert Spoerl

Hallo Peter,

>>>
.. warum schickst mir nicht gleich den quelcode ..
<<<
Ich schreibe meine Programme selbst. Oft macht es ja auch Spaß, an Problemen herumzutüfteln, auch
wenn es etwas länger dauert. Kann mir das leisten, da ich nicht von der Programmierung leben muß.

Ich hatte ja bereits gesagt, daß ich es mit einem anderen Ansatz versuchen will.
>>>
... das Problem das du hast ist unter windows 7 auch ...
<<<
Und dies bestätigt mich darin.

Interessant für mich wäre noch, ob es jemand anderes gebrauchen kann. Na ja, wenn es soweit ist,
kann ich es ja hier mal zum Testen reinstellen.
Jetzt geht es komplett offline erst einmal in den Urlaub.

Bis dahin

Norbert