| |
|
|
| Hallo Frank,
ab wann kann man ein Listview löschen ? Der Hintergrund ist der, ich erstelle zum Speichern einer Kontrollliste und nur dazu kurzfristig ein Listview, kopiere dort etwas hinein, speichere es ab und möchte es dann wieder löschen, damit ich nicht irgendwann über die 64 möglichen komme. Nachfolgender Code führt aber zu einer Schutzverletzung:
-> $I Listview_Funktionen.inc DECLARE LVDLL& DECLARE LV& DECLARE Name$ LVDLL& = UseDLL(Listview.dll)
Proc MakeLV LV& = CreateListview(%HWND,%HINSTANCE,0,Rgb(255,255,255),-1,$21) Name$ = 01 IColumn(LV&,Addr(Name$),0,0) EndProc
WindowStyle 8 + 512 Window 100,100-800,600
MakeLV
DeleteObject LV& EraseListview(LV&)
WaitInput FreeDLL LVDLL& $I Listview_Dispose.inc End <- |
|
|
| |
|
|
|
| Hallo Georg,
EraseListview() zerstört kein Listview, sondern nimmt den Handle dieses Listviews Handle aus den internen Strukturen der Listview.dll. Ein Listview löschen kannst du - wie jedes andere Fensterobjekt auch - mit DestroyWindow(listview&)...
Gruß, Frank |
|
|
| |
|
|
|
| Hallo Frank,
das mit dem DeleteObject war ein Schreibfehler von mir.
Mir ging es aber gerade um das Löschen des Handles aus der internen Struktur. Da dieses Listview bei jedem Load/Save Befehl erstellt wird, könnte es bei jemanden der wie ein verrückter Arbeitet die 64 möglichen Handles voll werden. Oder geht das Löschen erst wenn man ein InitMessages ausgeführt hat und wenn ja, was ist mit einem Listview das nach einem InitMessages(%HWND) auf %HWND erstellt wird ? Füllt dieses auch die interne Struktur ?
Viele Grüße Georg |
|
|
| |
|
|
|
| Hallo,
nein. Aber bestimmte Funktionen benötigen diese Tabelle(n), z.B. RaiseColumn(). Ist diese Tabelle mal voll, arbeiten die Funktionen nicht mehr richtig. Mit EraseListview() wird dieser Tabellenplatz wieder frei freigemacht.
Gruß, Frank |
|
|
| |
|
|
|
| Hi Frank,
ich stehe etwas auf meiner Leitung.
Ein CreateListview fügt einen Handle in die interne Tabelle ein, diese Tabelle kann 64 Einträge verwalten. Um einen Platz wieder frei zu bekommen muß man ein EraseListview mit dem Handle eines Listviews ausführen.
Wenn man nun 65 mal ein Listview erstellt mit CreateListview und dieses nur per DestroyWindow löscht, würde die interne Tabelle voll sein und einige Funktionen nicht mehr richtig laufen.
Habe ich das so in etwa richtig verstanden ?
Wenn ja besteht immer noch das Problem mit der Systemverletzung in meinem Democode, auch wenn man DestroyWindow nimmt, statt DeleteObject.
Viele Grüße Georg |
|
|
| |
|
|
|
| Hallo Georg,
ja, das sieht du absolut richtig !
Nachdem du DestroyWindow benutzt hast, darfst du das Listviewhandle natürlich nicht mehr benutzen !!! Das EraseListview mußt du vorher anbringen, ggf. gefolgt von einem Sleep 100, damit auch sichergestellt ist, das das Handle in die Dll nicht mehr benutzt wird, wenn das Listview verschwunden ist. Wenn das noch nicht klaapt, sende mir einen funktionierenden kleinen Democode zu.....
Gruß, Frank |
|
|
| |
|
|
|
| Hi,
ich nochmal. Scheint so, als wäre in EraseListview doch noch ein Fehler. Ich prüfe das heute abend.
Gruß, Frank |
|
|
| |
|
|
|
| Hallo,
so, der Fehler ist jetzt weg und RaiseLine() hab ich auch sofort mit hineingenommen.
Hier könnt ihr (immer) die neuste Betaversion runterladen: [...]
Gruß, Frank |
|
|
| |
|
|
|
| Hää ??? RaiseLine()...war doch schon drin oder ? ausser Du meinst die Hilfedatei die ist aber unter diesem Downloadlink nicht dabei ...mein ja nur
Gruß Klaus |
|
|
| |
|
|
|
| Hallo Klaus,
ich meinte das Löschen der internen Tabelle von RaiseLine. War bisher nicht drin.
Gruß, Frank |
|
|
| |
|
|