Image in beliebiger ListBox-Spalte

Hallo,
ich möchte ein Image (Image_List) in einer beliebigen Listbox-Spalte darstellen.
Ich komme noch nicht dahinter.

var imagetest as picture = Image_List // ?!?
ListBox1.AddRow(row.Column("Bezeichnung").StringValue, datum_liste, row.Column("Name").StringValue, betrag_format, row.Column("ID").StringValue, imagetest) <- ?!?

if betrag_suche > 0 then // Beispiel
  ListBox1.RowImageAt(ListBox1.LastAddedRowIndex) = imagetest // nur Spalte 1
end If

Mit RowImageAt in Spalte 1 funktioniert es, aber da brauche ich es nicht. RowImageAt hat ja leider keinen Parameter für column?! :thinking:

Scheint es keine Methode für zu geben aber Du kannst das cell background paint Ereignis benutzen mit g.DrawPicture

Danke,
Sie meinten sicher PaintCellBackround. Damit funktioniert es erstmal.
Aber wie quetsche ich jetzt eine Bedingung aus meiner ListBox dazwischen?
z. B. Betrag_SQL > 0, der ja in einer anderen Methode existiert.

Im PaintCellBackround-Event steht:

If column = 5 then
  Var img As Picture = Image_List
  If img <> Nil AND Betrag_SQL > 0 Then // Betrag_SQL ist hier nicht bekannt
    g.DrawPicture(img, 20, 5, g.Height, g.Height)
  End If
  Return True
End If

… aus der Methode die die ListBox darstellt. An betrag_sql muss ich in PaintCellBackround rankommen

betrag_sql = row.Column("Betrag_SQL").DoubleValue
betrag_format = Format(betrag_sql, "###,##0.00")
ListBox1.AddRow(row.Column("Bezeichnung").StringValue, datum_liste, row.Column("Name").StringValue, betrag_format, row.Column("ID").StringValue)

Kann man z.B. als CellTag in der entsprechenden Spalte ablegen und darauf dann im Event zugreifen. So lasse ich z.B. das Mailsymbol anzeigen…

Das sieht schon ganz gut aus. Aber ich fliege noch raus, wenn ich an’s Ende scrolle und bei manchen Suchen.

Listbox:

ListBox1.AddRow(row.Column("Bezeichnung").StringValue, datum_liste, row.Column("Name").StringValue, betrag_format, row.Column("ID").StringValue)

var zeile as integer = ListBox1.LastAddedRowIndex
if betrag_suche > 0 then
  ListBox1.CellTagAt(zeile, 5) = Image_File
end If

PaintCellBackround-Event:

listimage3

Entweder machst Du ein Try/Catch für eine OutOfBoundException um den Code. Oder Du machst ein

if row > me.RowCount then return

an den Anfang (Code nicht getestet).

OutOfBoundsException konnte ich nicht abfangen. War auch immer Fehler 0. :thinking:
Ich bin aber definitiv eine Zeile zu weit geraten.
Aber so geht es jetzt. :ok_hand:t2:

if row < me.RowCount then
  If column = 5 then
    var img as picture = ListBox1.CellTagAt(row,column)
    If img <> Nil Then
      g.DrawPicture(img, 20, 5, g.Height, g.Height)
    End If
    Return True
  End If
end If

if row > me.RowCount then return am Anfang wollte nicht. Hab ich was falsch verstanden?

Liste.ListBox1.PaintCellBackground, line 1
The current function must return a value, but this Return statement does not specify any value
if row > me.RowCount then Return

Aber so ist es ja das Gleiche. :slightly_smiling_face:

Danke!

Eins noch:
Wie kriege ich die Spalte für die Sektierung transparent bei dem Image?

listimage5

Ein etwas anderer Ansatz wäre wohl noch ein

if row < me.rowCount and ListBox1.CellTagAt(row, column) IsA Picture then

Gruss

Marius

Hab ich noch eingebaut. :+1:t2:

Danke euch allen!

Ich glaube das ist die Auswahl Farbe bei Windows

If Me.RowSelectedAt(row) = True Then
  g.DrawingColor=Color.HighlightColor
  g.FillRectangle(0,0,g.Width,g.Height)
End If

bei dem Parameter Reihe muss man immer aufpassen das der zur Liste passt weil
die letzte Zeile nur optisch zur Ausfüllung dient.

column = 5

hier ist es ggfs. besser eine Enum oder Constante zu benutzen statt einfach nur die Zahl 5.
Blickt man spaeter besser durch wenn man mehrere Vergleiche hat oder Spalten hinzu kommen oder sich verschieben.

Ah ok. Beim Mac wäre das die Akzentfarbe vom System. Es kommt auch die richtige Farbe, aber viel heller.
Evtl. noch was mit der Transparenz.

ok. Schaue ich mir morgen an.
:+1:t2:

Dein Icon sollte an den richtigen Stellen transparent sein. Dann mußt Du gar nichts weiteres machen. Und den Nachtmodus nicht vergessen.

ich denke wenn man selbst das Hintergrund malen Ereignis benutzt wird auch nicht mehr die Zeilenauswahl gemalt und man sieht die Farbe der Listbox hinter dem Icon.

Das Icon war bestimmt ein PNG mit Transparenz.

Hier nochmal wie das jetzt aussieht mit RowSelected

If Me.RowSelectedAt(row) = True Then
  g.DrawingColor = Color.HighlightColor // MacOS Auswahlfarbe
  g.FillRectangle(0, 0, g.Width, g.Height)
end if
g.DrawPicture(img, 20, 5, g.Height, g.Height)

Peferkt wäre g.DrawingColor = Color.Akzentfarbe :thinking:

Wenn ich die RowSelected-Bedingung weglasse, ist der Hintergrund bei Betrag > 0 weiß.

imagebg2

Das Icon ist ein transparentes PNG.

Ich verwende überall transparente PNGs und die sehen alle gut aus ohne daß ich irgendwelche FillRectangles habe.

Auch wenn eine Zeile ausgewählt ist?

Ich weiß nicht, ob das ein Bug oder ein Feature ist.

Code im CellTextPaint:

Code im CellBackgroundPaint:

Das hilft!!
PaintCellText funktioniert.

pct

Über die Bezeichnung kann man sich streiten …

Danke für’s Forschen!

1 Like

ja stimmt wenn man nur das Icon malt in einer Spalte kann man das Vordergrund malen Ereignis benutzen.

fuer Apple gibt es noch diese Farb Gruppe die man auch mit Name ansprechen kann.
https://documentation.xojo.com/api/graphics/colorgroup.html#colorgroup