2016-08-18 3 views
0

Ich habe ein TStringGrid in Lazarus, unter Linux ausgeführt. Ich habe eine Spalte, die Editor-Typ cbsButton hat. Ich möchte, dass die Schaltfläche anstelle einer Ellipse ein bestimmtes Bild anzeigt. Ich habe den folgenden Code, der einen Fehler verursacht:Zeichnen und Bild auf einer Schaltfläche in einer Zelle in einem TStringGrid

procedure TForm1.streams_gridDrawCell(Sender: TObject; aCol, aRow: Integer; aRect: TRect; aState: TGridDrawState); 
var 
    aCanvas: TCanvas; 
    aGrid: TStringGrid; 
    Editor: TWinControl; 
    image: TImage; 
begin 
    if (aCol <> 1) or (aRow = 0) then begin 
     Exit; 
    end; 

    aGrid := (Sender as TStringGrid); 

    aCanvas := image.Canvas; 
    aCanvas.FillRect(aRect); 
    imagelist1.Draw(aCanvas, aRect.Left+2, aRect.Top+2, 8); 

    Editor := (aGrid.EditorByStyle(cbsButton) as TButtonCellEditor); 
    Editor.Brush.Style := TBrushStyle.bsImage; 
    (Editor.Brush.Image as TImage) := image; // causes the error below 
end; 

Der Fehler ist:

mainform.pas(156,23) Error: Class or Object types "TFPCustomImage" and "TImage" are not related

An diesem Punkt, ich bin sicher, dass ich darüber werde in ganz falsch. Könnte mich bitte jemand auf den richtigen Weg zurückbringen?

+0

Sie sollten eine Zugriffsverletzung statt für den Zugriff auf eine TImage Leinwand bekommen, bevor die Komponente zu konstruieren. –

+0

Zugriffsverletzungen sind Laufzeit. Der obige Fehler ist Kompilierzeit. – lk75

Antwort

3

Ich bezweifle, dass das OnDrawCell-Ereignis der richtige Ort ist, um einen Zelleneditor zu ändern, da wahrscheinlich der richtige Zelleneditor in diesem Moment nicht existiert, wenn die Zelle gemalt wird.

Das richtige Ereignis zum Definieren des Zelleneditors ist das OnSelectEditor-Ereignis des Rasters. Bitte lies das Wiki (http://wiki.lazarus.freepascal.org/Grids_Reference_Page).

Der von Ihnen verwendete cbsButton-Editor erbt von TButton. Ein TButton verfügt nicht über eine Glyph-Eigenschaft - Sie können der Schaltfläche keine Bitmap zuweisen. Aber können Sie Ihre eigenen Zelleditor leicht schreiben, folgen Sie einfach den Standard-Beispiel in examples/gridexamples/gridcelleditor:

  • hinzufügen TBitBtn in das Formular. Löschen Sie die Beschriftung und fügen Sie das gewünschte Bild der Glyph-Eigenschaft hinzu. Setzen Sie die Visible-Eigenschaft auf false.
  • Im OnClick-Ereignis dieser Schaltfläche schreiben Sie, wie Sie die Zelle bearbeiten möchten. Greifen Sie auf die Zelle zu, die in den Eigenschaften Col und Row des Rasters angegeben ist. Als Beispiel nehme ich hier, dass Sie nur wollen, eine InputBox öffnen:
 
    procedure TForm1.BitBtn1Click(Sender: TObject); 
    begin 
     StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := 
     InputBox('Input some text', 'Text:', ''); 
    end;
  • nun einen Event-Handler für das OnSelectEditor Ereignis des Rasters schreiben. Er muss das BitBtn dem Editor-Parameter des Ereignisses zuweisen und sicherstellen, dass die Schaltfläche an der richtigen Position innerhalb der ausgewählten Zelle ist - das ist alles!
 
    procedure TForm1.StringGrid1SelectEditor(Sender: TObject; aCol, aRow: Integer; 
     var Editor: TWinControl); 
    var 
     R: TRect; 
    begin 
     if (aCol=2) and (aRow > 0) then begin 
     R := StringGrid1.CellRect(aCol, ARow); 
     R.Left := R.Right - (R.Bottom - R.Top); 
     BitBtn1.BoundsRect := R; 
     Editor := BitBtn1; 
     end; 
    end;
+0

Ich habe das noch nicht ausprobiert, aber es macht Sinn. Danke, angenommen und aufgewertet. – lk75

0

Editor.Brush.Image ist eine Eigenschaft des Typs TFPCustomImage. Dies ist ein TPersistent Nachkomme. Und TImage ist ein Nachkomme von TCustomImage und somit TGraphicControl und TControl. Das sind also völlig verschiedene Klassen, die nicht kompatibel sind.

Es wird also nicht erwartet, dass Sie (Editor.Brush.Image as TImage) übernehmen und ihm eine beliebige TImage-Instanz zuweisen.

+0

Danke, das habe ich gemerkt. Ich habe nicht wirklich gefragt, warum der obige Code nicht funktioniert, sondern eher, was ist der richtige Weg, um das zu tun, was ich versuche (offensichtlich falsch). :) Danke, ich glaube, die Antwort von wp_1233996 wird die richtige sein. – lk75

Verwandte Themen