Hallo zusammen,
ich fummel seit einigen Tagen an folgendem Problem rum:
Ich habe eine DB-Tabelle mit mehreren Spalten. Eine der Spalten ist Integer (sie soll einen Status darstellen)
mit 6 möglichen Werten 1 bis 6 und soll sichtbar im TDBGRID dann mit 6 verschiedenen Images ausgestattet werden,
die in einer Imagelist mit dem Namen Images vorliegen (dort sind ca. 56 Images drin).
Leider bekomme ich immer einen Adresszugriffsfehler, egal, ob ich mit GetBitmap oder sogar Loadfromfile arbeite.
ich möchte aber so arbeiten wie unten angegeben, wenn möglich, und keine weiteren Ressourcen nachladen.
BTW: Ja, ich weiss, dass die letzte ELSE-Schleife redundant ist, aber ich wollte die funktionierende Booleanabfrage
im ersten Teil, die funktioniert, und die nicht funktionierende (ab Column=3) voneinander trennen.
Ich bekomme auch bei einem If FieldName='STATUS' anstelle von Column=3 den gleichen Fehler.
Irgendwo habe ich hier einen dummen Bock drin. :-)
Wenn ich auf die gleiche Art wie bei (Column=3)ff vorher das
Booleanfeld fülle (Column.Field.DataType = ftBoolean), funktioniert das malen der beiden Images 30 und 46.
Ich habe schon verschiedene Dinge ausprobiert und brauche einmal
einen genialen Moment von Eurer Seite. Hier kommt der Quelltext:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91:
| procedure TVerwaltung.VertraegeDBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var BooleanBitmap : Graphics.TBitmap; StatusBitmap : Graphics.TBitmap; BitmapLeft : Integer; Multiplikator : Real; begin with (Sender as TDBGrid) do begin if (Column.Field.DataType = ftBoolean) then begin if (BooleanBitmap = nil) then BooleanBitmap := Graphics.TBitMap.Create;
BooleanBitmap.Transparent:=True;
try
if Column.Field.AsBoolean then Images.GetBitmap(30,BooleanBitmap) else Images.GetBitmap(46,BooleanBitmap);
VertraegeDBGrid.Canvas.FillRect(Rect);
BitmapLeft := Trunc(Rect.Left + ((Rect.Right-Rect.Left)/2)- (BooleanBitmap.Width/2));
VertraegeDBGrid.Canvas.Draw(BitmapLeft, Rect.Top+1, BooleanBitmap); finally BooleanBitmap.Free; end; end ELSE Begin Canvas.Font.Color := clBlack; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString); End;
IF(Column.Index=3)THEN Begin StatusBitmap:=nil;
try CASE DataModul.Vertraege.FieldValues['STATUS'] OF 1:Images.GetBitmap(54,StatusBitmap); 2:Images.GetBitmap(30,StatusBitmap); 3:Images.GetBitmap(46,StatusBitmap); 4:Images.GetBitmap(52,StatusBitmap); 5:Images.GetBitmap(52,StatusBitmap); 6:Images.GetBitmap(50,StatusBitmap); 7:Images.GetBitmap(48,StatusBitmap); End;
StatusBitmap.Transparent:=True;
VertraegeDBGrid.Canvas.FillRect(Rect);
BitmapLeft := Trunc(Rect.Left + ((Rect.Right-Rect.Left)/2)- (StatusBitmap.Width/2));
VertraegeDBGrid.Canvas.Draw(BitmapLeft, Rect.Top+1, StatusBitmap); finally StatusBitmap.Free; end; End; END; end; |
Für jede Hilfe bin ich sehr dankbar! HILFE :-)
Vielen Dank,
David
Moderiert von
UGrohne: Code- durch Delphi-Tags ersetzt
Lieber gut machen statt besser wissen.