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