Einzelnen Beitrag anzeigen

Texas

Registriert seit: 15. Jul 2005
Ort: Laatzen
56 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

StingGrid um Records erweitern

  Alt 10. Apr 2007, 22:38
Hallo

ich habe eine Frage zum StrinGrid,

und zwar möchte ich eine Komponente von StringGrid ableiten und so erweitern das man für jede Cell einen
Record zu Verfügung hat. Eigentlich wie Cell[x,y] nur eben nicht ein TEXT sondern einen Record.
Ich habe schon eine ganze Weile und getestet mit wenig Erfolg, da ich es nicht schaffe die
Werte in dem Record der Komponente aus dem Programm zu ändern. Auslesen klappt.

Komponente sieht im Moment noch so aus

Delphi-Quellcode:
unit RecordGrid;

interface

uses
  SysUtils, Classes, Controls, Grids, Graphics;
type
  PCellRec = ^TCellRec; // Zeiger auf Record

  TCellRec = record
    Color: TColor;
    Text: string;
    Font: TFont;
    TextColor: TColor;
    Push: Boolean;
    Coll: Integer;
    Row: Integer;
    Cell: Integer;
  end;

type
  TRecordGrid = class(TStringGrid)
  private
    FRecList: TList; // TList für alle Records
    ARecord: PCellRec;
    function Get(Index: Integer): TCellRec;
    procedure Put(Index: Integer; const Value: TCellRec);
    procedure Neu;
    { Private-Deklarationen }
  protected
    { Protected-Deklarationen }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure Deleteall;
    function Count: integer;
    function CountCells: integer;
    property item[index: integer]: TCellRec read Get write Put;
    { Public-Deklarationen }
  published
    { Published-Deklarationen }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TRecordGrid]);
end;

constructor TRecordGrid.Create(AOwner: TComponent);
begin
  FRecList := TList.Create;
  inherited Create(AOwner);
  Neu;
end;

destructor TRecordGrid.destroy;
begin;
  Deleteall;
  inherited destroy;
end;

function TRecordGrid.count: Integer;
begin
  Result := FRecList.Count;
end;

function TRecordGrid.CountCells: integer;
begin
  result := (self as TStringGrid).RowCount * (self as TStringGrid).ColCount;
end;

function TRecordGrid.Get(Index: Integer): TCellRec;
begin
  result := PCellRec(FRecList.Items[Index])^;
end;

procedure TRecordGrid.Put(Index: Integer; const Value: TCellRec);
begin
  ARecord^ := value;
  FRecList[Index] := ARecord;
end;

procedure TRecordGrid.Neu;
var i, j, k: integer;
begin
  // Erzeugen und Beschreiben der Records für jede Cell über einen TList Eintrag
  k := 0;
  for i := 0 to (self as TStringGrid).RowCount-1 do
    for j := 0 to (self as TStringGrid).ColCount-1 do begin
      New(ARecord);
      ARecord^.Row := i;
      ARecord^.Coll := j;
      ARecord^.Cell := k;
      FRecList.add(ARecord);
      inc(k);
    end;
end;

procedure TRecordGrid.Deleteall;
var i: integer;
begin
  for i := FRecList.Count-1 downto 0 do begin
    ARecord := FRecList.Items[i];
    Dispose(ARecord);
    FRecList.Delete(i);
  end;
  FRecList.Clear;
end;

end.
Soweit klappt alles bis auf das ich die Records aus dem Programm nicht ändern kann

wenn ich dann aber

property item[index: integer]: TCellRec read Get write Put;

nach

published

verschiebe bekomme ich beim Compilieren eine Fehlermeldung
Item kann nicht vom Typ Array sein

Gehört der property item[...] überhaupt nach published damit ich die Werte ändern kann

Ich habe noch nicht so viel Erfahrung mit dem Entwickeln von Komponenten

Für Hilfe schon mal vielen Dank im Voraus
Michael
  Mit Zitat antworten Zitat