ComboBox mit Grafik statt Text

Rund um die LCL und andere Komponenten
Antworten
Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

ComboBox mit Grafik statt Text

Beitrag von Halvar »

Hallo Leute,

ich benötige für mein Programm eine ComboBoxzwecks auswahl der verschiedenen PenStyles. Ich habe mir dazu die Kompos von Pluto heruntergeladen.
Leider hat er das so gelöst das ein entsprechender Text angezeigt wird. Ich benötige es aber mit Grafik, so ein Benutzer gleich sieht wie die "zukünftigen"
Striche aussehen.
Also habe ich mich ans Werk gemacht und folgendes ist dabei herausgekommen:

Code: Alles auswählen

...
var fmbp: array [0..5] of TBitmap;
...
 
procedure TPenStyleComboBox.MouseDown(Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  inherited MouseDown(Button, Shift, X, Y);
end;
 
procedure TPenStyleComboBox.DrawItem(Index: Integer; ARect: TRect;
  State: TOwnerDrawState);
var
  Bitmap: TBitmap;
begin
  Canvas.FillRect(ARect);
  Bitmap := TBitmap(Items.Objects[Index]);
  Canvas.Draw(ARect.Left,ARect.Top, Bitmap);
 
  { *** VARIANTE die auch nicht funktioniert ***
   if Bitmap <> nil then begin
    //copy bitmap to combobox coordinate
    Canvas.CopyRect(Bounds(ARect.Left + 2, ARect.Top + 2, Bitmap.Width,
                    Bitmap.Height), Bitmap.Canvas,
                    Bounds(0, 0, Bitmap.Width, Bitmap.Height));
    Canvas.TextOut(0,20,Items[Index]);
  end;}
end;
 
constructor TPenStyleComboBox.Create(TheOwner: TComponent);
  var i  : integer;
begin
  inherited Create(TheOwner);
 
  ItemHeight := 29;
  Style:=csOwnerDrawVariable;
  for i := 0 to 5 do begin
    fbmp[i] := TBitmap.Create;
    fbmp[i].Width := 60;
    fbmp[i].Height := 24;
    case i of
      0: fbmp[i].Canvas.Pen.Style := psSolid;
      1: fbmp[i].Canvas.Pen.Style := psDash;
      2: fbmp[i].Canvas.Pen.Style := psDot;
      3: fbmp[i].Canvas.Pen.Style := psDashDot;
      4: fbmp[i].Canvas.Pen.Style := psDashDotDot;
      5: fbmp[i].Canvas.Pen.Style := psClear;
    end;
    fbmp[i].Canvas.MoveTo(0,12);
    fbmp[i].Canvas.LineTo(60,12);
    Items.AddObject('Pen_'+IntToStr(i),fbmp[i]);
  end;
  ItemIndex := 0;
end;
 
destructor TPenStyleComboBox.Destroy;
  var i: integer;
begin
  for i := 0 to 5 do fbmp[i].Free;
  inherited Destroy;
end;
Mein Problem ist nun, das die Grafiken nicht angezeigt werden. Bei Selektion im Dropdownfeld (blind) erscheint dann der dem Objekt zugeordnete Text.
Alles in allem nicht sehr befriedigend. Da ich "Weltweit" keine Lösung gefunden habe, hoffe ich darauf das ihr mir helfen könnt.

Es grüßt
Halvar

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: ComboBox mit Grafik statt Text

Beitrag von theo »

Ich weiss nicht genau, wie du das machen willst. Wozu Bitmaps?

Ich hab's eben ausprobiert, mit einer normalen ComboBox mit csOwnerDrawFixed und im Ereignis OnDrawItem.
Funzt bei mir prima. Oder verstehe ich dich falsch?

Code: Alles auswählen

procedure TForm1.ComboBox1DrawItem(Control:TWinControl;Index:Integer;ARect:TRect
  ;State:TOwnerDrawState);
begin
  if odd(Index) then
  Combobox1.Canvas.Brush.Color:=$ffffff else
  Combobox1.Canvas.Brush.Color:=$f1f1f1;
  Combobox1.Canvas.FillRect(ARect);
  case index of
      0: Combobox1.Canvas.Pen.Style := psSolid;
      1: Combobox1.Canvas.Pen.Style := psDash;
      2: Combobox1.Canvas.Pen.Style := psDot;
      3: Combobox1.Canvas.Pen.Style := psDashDot;
      4: Combobox1.Canvas.Pen.Style := psDashDotDot;
      5: Combobox1.Canvas.Pen.Style := psClear;
  end;
  Combobox1.Canvas.Line(Arect.Left,ARect.Top+10,Arect.Right,Arect.Top+10);
end;

Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

Re: ComboBox mit Grafik statt Text

Beitrag von Halvar »

Danke für die Antwort.

Du hast schon Recht, es geht so wie du sagst, ABER ...

ich möchte auch das mir nach der Selection in der ComboBox die entsprechende Linie als Grafik und nicht als Text
angezeigt wird. ;-)

Das ist das was ich nicht hinbekomme.
Das Leben ist wie eine Hühnerleiter - kurz und beschissen

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: ComboBox mit Grafik statt Text

Beitrag von theo »

Ach so. Das weiss ich auch nicht.
Aber es gibt im Additional Tab eine TColorBox, die kann die ausgewählte Farbe neben dem Text anzeigen.
Vielleicht kannst du da schauen wie das gemacht ist.

Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

Re: ComboBox mit Grafik statt Text

Beitrag von Halvar »

Angeschaut hatte ich mir den Quelltext schon mal. Ich guck nochmal. Ich hoffe ich komme damit klar :-)
Das Leben ist wie eine Hühnerleiter - kurz und beschissen

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ComboBox mit Grafik statt Text

Beitrag von pluto »

Einfach eine eigene Funktion dafür schreiben. Wenn ich dich richtig verstanden habe, möchtest du eine Grafische Line zeichnen, also nicht mit "moveto und lineto".
Geht genau so..... du könntest z.b. es so machen: Canvas.Draw(ARect.Left,ARect.Bottom-2, Grafik von der Line);
So in etwa müsste es gehen. Das -2 spielt dabei eine wichtige Rolle. Sonst geht es nicht....
MFG
Michael Springwald

Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

Re: ComboBox mit Grafik statt Text

Beitrag von Halvar »

Damit man mich auch richtig versteht.

Das Zeichnen der Linien mit den verschiedenen PenStyles klappt in dem Teil der ausklappt. Mir geht es darum das
der ausgewählte PenStyle als grafische Linie auch in der Vorschau zu sehen ist. DAS ist das was nicht klappt!
Das Leben ist wie eine Hühnerleiter - kurz und beschissen

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: ComboBox mit Grafik statt Text

Beitrag von Scotty »

Wenn du ReadOnly auf true setzt, funktioniert Theos Code auch in der Vorschau.

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: ComboBox mit Grafik statt Text

Beitrag von theo »

Scotty hat geschrieben:Wenn du ReadOnly auf true setzt, funktioniert Theos Code auch in der Vorschau.
Hehe, stimmt!

Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

Re: ComboBox mit Grafik statt Text

Beitrag von Halvar »

Ich danke euch :D Das Problem ist gelöst!

Nur mich bedrückt jetzt noch etwas. Wenn die Auswahl aufklappt, ist das ganz etwas "unansehnlich".
Ich meine damit, das die Combo verdeckt wird. Die Auswahl überdeckt diese. Woran liegt das denn
nu schon wieder?
Das Leben ist wie eine Hühnerleiter - kurz und beschissen

Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

Re: ComboBox mit Grafik statt Text

Beitrag von Halvar »

Kann mir keiner sagen woran das liegt?
Das Leben ist wie eine Hühnerleiter - kurz und beschissen

Benutzeravatar
theo
Beiträge: 10856
Registriert: Mo 11. Sep 2006, 19:01

Re: ComboBox mit Grafik statt Text

Beitrag von theo »

Halvar hat geschrieben:Kann mir keiner sagen woran das liegt?
Dann zeichnest du im geschlossenen Zustand halt weniger breit.

Code: Alles auswählen

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; ARect: TRect
  ; State: TOwnerDrawState);
begin
  if not ComboBox1.DroppedDown then  
 ....

Halvar
Beiträge: 58
Registriert: So 16. Mär 2008, 23:40
OS, Lazarus, FPC: Debian Lenny (L 0.9.28-2 FPC 2.2.4)
CPU-Target: 64Bit
Wohnort: Brake/Unterweser

Re: ComboBox mit Grafik statt Text

Beitrag von Halvar »

Das löst leider nicht das Problem, dass das DropDown beim aufklappen die eigentliche ComboBox überdeckt.

Hat jemand eine andere Lösung?
Das Leben ist wie eine Hühnerleiter - kurz und beschissen

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: ComboBox mit Grafik statt Text

Beitrag von pluto »

mach doch mal ein Bild davon, dann können wir es uns besser vorstellen.
MFG
Michael Springwald

Antworten