Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem bei ComboBox mit OwnerDraw


mtm - Mi 29.10.14 22:56
Titel: Problem bei ComboBox mit OwnerDraw
Hallo zusammen,

ich bin gerade dabei ein Drive-Combobox zu schreiben. Im Prinzip kein Problem, es werden auch alle gewünschten Laufwerke angezeigt, wenn ich den DropDown mache (Anhang 1). Wenn ich dann aus der Liste jedoch einen Wert auswähle, wird der nicht angezeigt, sondern das ganze Feld ist blau (Anhang 2).
Vielleicht hat jemand von Euch sowas schon mal gehabt.

Der DrawItem-Teil sieht übrigens so aus.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TDrvCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  ico: TIcon;
  txt,dr: String;
  fi: SHFILEINFO;
  vi: VolInfo;
  py: Integer;
begin
  vi := VolInfo(Self.Items.Objects[Index]); // in Items sind die Laufwerke mit ihren Infos(in den Objects) enthalten.
  dr := vi.Drive + ':\';
  SHGetFileInfo(PWideChar(dr), 0, fi, SizeOf(fi), SHGFI_ICON or SHGFI_SMALLICON);  // hole das SystemIcon für das Laufwerk
  ico := TIcon.Create;
  ico.Handle := fi.hIcon;
  py := Index * ItemHeight;
  with Self.Canvas do begin
    FillRect(Rect);
    Draw(1,py,ico); // Zeichne Icon
    txt := '[' + vi.Drive + '] - ' + vi.Namen;
    TextOut(20,py,txt);  // Ausgabe Text
  end;
  ico.Free;
end;


Habe gerade gemerkt, dass es bei der Auswahl des ersten Elements etwas anders aussieht(Anhang 3).


Stundenplan - Do 30.10.14 10:22

In der DrawItem-Methode bekommst du ja einen Rect-Parameter. Wenn du einfach das übergebene Rect verwendest anstatt es dir vom Index auszurechnen, sollte es funktionieren. Denn wenn du z.B. das 3. Element auswählst, ist Index = 4, aber es muss trotzdem bei 0,0 o.ä. gezeichnet werden, da die aktuelle Auswahl ja ganz "oben links" steht.


mtm - Do 30.10.14 12:50

Danke Dir.

Manchmal hat man auch wirklich Tomaten auf den Augen und im Hirn.