Probleme mit OwnerDraw ListBox
-
BSM wird beschrieben wenn eine Datei gelesen wird. Jedes mal wenn ein Stichwort gefunden wird, merkt es sich die Zeilennummer. Das geschieht nur einmal, danach bleibt es konstant.
int x, zeile; std::string zspeicher; if(zspeicher.find(";BefNum:")!=-1) { BSM[x]=zeile; x++; }
Aber wie schon gesagt, wenn ich das Beispiel eins zu eins hineinschreibe, macht es alles korrekt, an meinem Script ändert sich dabei nichts.
Ich hoffe irgendwer hat eine Lösung für dieses Mysterium...
-
Du hast int zrg Zeile 1 deklariert und im Quelltext
steht zgr Zeile 9.
-
Sorry, war ein Rechtschreibefehler im Forum. ^^
In Meinem Script stimmt es, würde sonst auch gar nicht erst kompilieren...
-
Ok, Problem gefunden, zgr wurde nie auf 0 zurückgesetzt.
Dummer Fehler... sorry für die Zeitverschwendung ^^
-
Mathiable schrieb:
würde sonst auch gar nicht erst kompilieren...
Trifft nur zu, wenn nicht irgendwo in deinem Script noch ein int zgr steht...
-
Noch zu
if (Index==BSM[zgr])
Du kannst dich nicht darauf verlassen, daß DrawItem immer für alle Items sequentiell aufgerufen wird. Wenn du z.B. eine ScrollBar hast, dann kann es sein, daß der Index mit 10 anfängt und dann greift dein Vergleich nicht mehr (sofern du immer bei zgr = 0 anfängst).
Du mußt die Logik verändern. Am besten, du speicherst zu jedem Eintrag in einem bool-Feld, ob der Eintrag gefärbt werden soll. Alternativ kannst du auch direkt die Daten in ListBox.Objects[] jedem Eintrag zuordnen.
-
Hi,
wenn du nun schon versuchst, den Schreibfehler im ersten Script zu korrigieren, dann schreib es bitte auch
drunter [EDIT] ! Oder lass ihn stehen, sonst siehst so aus, als wenn wir die blöden sind
-
Th69 schrieb:
Noch zu
if (Index==BSM[zgr])
Du kannst dich nicht darauf verlassen, daß DrawItem immer für alle Items sequentiell aufgerufen wird. Wenn du z.B. eine ScrollBar hast, dann kann es sein, daß der Index mit 10 anfängt und dann greift dein Vergleich nicht mehr (sofern du immer bei zgr = 0 anfängst).
Du mußt die Logik verändern. Am besten, du speicherst zu jedem Eintrag in einem bool-Feld, ob der Eintrag gefärbt werden soll. Alternativ kannst du auch direkt die Daten in ListBox.Objects[] jedem Eintrag zuordnen.
ja hab ich auch schon rausgefunden. War aber kein allzu grosses Problem. Ich habe einfach oben beim OnDraw noch das angehängt:
if(Index==0) for(zgr=0;KAT.BSM[zgr]<=ListBox1->TopIndex;zgr++);
Aber kann es sein das er zuerst zeichnet und dann erst scrollt? Irgendwie ist alles um 1 verschoben. Also beim Herunterscrollen bleibt die erste Zeile schwarz, und beim Hinaufscrollen werden alle nachfolgenden schwarz wenn eine markierte Zeile oben verschwindet, so als ob zgr nicht abgeändert würde, zgr wird aber zum richtigen Zeitpunkt abgeändert. Währe noch praktisch wenn man das abändern könnte.
kpeter schrieb:
Hi,
wenn du nun schon versuchst, den Schreibfehler im ersten Script zu korrigieren, dann schreib es bitte auch
drunter [EDIT] ! Oder lass ihn stehen, sonst siehst so aus, als wenn wir die blöden sindOk merk ich mir für die Zukunft
-
Wie ich schon geschrieben hatte: du kannst dich nicht darauf verlassen, in welcher Reihenfolge DrawItem aufgerufen wird, d.h. die Index-Werte können unterschiedlich sein.
Und sobald du einmal gescrollt hast, wird der Code "Index == 0" gar nicht mehr aufgerufen (denn Drawitem wird nur für die gerade sichtbaren Einträge aufgerufen).Also noch einmal: ändere deine Logik, so daß der Code unabhängig von der Reihenfolge ist !!!!!!!!!!!
Auch wenn du z.B. ein anderes Fenster teilweise über deine ListBox ziehst und dann wieder wegbewegst wird DrawItem nur für die vormals überdeckten Einträge aufgerufen. Windows arbeitet message-orientiert (nicht sequenziell).
Edit: Du darfst also keine (globale) Zählvariable o.ä. benutzen!!!
-
Beim Debugen ist der fall "index==0" immer als erstes aufgetaucht... naja aber du hast wohl recht. Habe jetzt den "find(";BefNum:")!=-1" beim OnDraw eingefügt und funktioniert soweit ganz gut. Ich habe nur das Gefühl wenn ich da noch ein paar „find„ Befehle reinmache könnte es langsam zu viel werden für den PC. Aber solange es geht, geht es…