Hallo alle zusammen!
In meinem Programm verwende ich zwei Listen:
- die erste Liste enhält die Grunddaten -> TElementList;
- die zweite Liste enthält die daraus gebildeten Graphikkomponenten (z.N. TNode, TBorder) -> TGraphicObjectList;
Während des Programmablaufs wird aus den Grunddaten ein Knoten-Kanten-Modell gebildet und gezeichnet. Zur Erklärung kurz die Struktur der verwendeten Klassen:
Delphi-Quellcode:
TElement = class
Color:TColor;
Show: boolean;
top: integer;
layerID : integer;
pos, absPos, length: real;
elemID, elemType: string;
public
(...)
end;
TElementList = class(TList)
private
function GetElement(index: integer): TElement;
(...)
public
(...)
property Items[index: integer]: TElement Read GetElement;
end;
TGraphicObject = class(TElement)
S: TElement;
Width: integer;
Height: integer;
Left: integer;
TempFillColor: TCOlor;
BorderPolygon: TBorderPolygon;
BorderCircle: TRect;
Marked: boolean;
FillColor: TColor;
Angle: extended;
GraphicType: TGraphicType;
BorderRect: TRect;
//(und weitere Grafieigenschaften)
procedure Paint(RefCanvas: TCanvas; ClipRect: TRect; BackgroundColor: TColor);
public
procedure GetData(Source: TElement); virtual;
end;
TNode = class(TGraphicObject)
nodeType: TNodeType;
nodeID: string;
(...)
public
procedure GetData(Source: TElement); override;
constructor Create(NType: TNodeType);
procedure Paint(RefCanvas: TCanvas; ClipRect: TRect; BackgroundColor: TColor);
end;
TBorder = class(TGraphicObject)
startNode, endNode: TNode;
length: real;
borderType: TBorderType;
public
constructor Create(StartNode, EndNode: TNode; BorderType: TBorderType);
procedure Paint(RefCanvas: TCanvas; ClipRect: TRect; BackgroundColor: TColor);
procedure GetData(Source: TElement); override;
end;
(...u.a. Graphikobjecte...)
TGraphicObjectList = class(TList)
FSource: TElementList;
public
property Items[index: integer]: TGraphicObject Read GetGraphicObject;
procedure Getdata(Source: TElementList);
procedure SetData;
procedure Paint(RefCanvas: TCanvas; BackgroundColor: TColor; ClipRect: TRect);
end;
implementation
procedure TGraphicObject.GetData(Source: TElement);
begin
self.S := Source;
//genau um diese Grundeigenschaften geht es. kann ich diese nicht als Verweis/Zeiger auf das Element in der ElementList verwenden??)
pos := Source.Pos;
absPos := Source.AbsPos;
elemID := Source.elemID;
elemType := Source.elemType;
trackID := Source.trackID;
long := Source.long;
lat := Source.lat;
alt := Source.alt;
length := Source.length;
dir := Source.dir;
Show := Source.Show;
layerID := Source.layerID;
top := Source.top;
end;
constructor TNode.Create(NType: TNodeType);
begin
GraphicType := gtCircle;
NodeType := NType;
// FillColor := NColor;
//TempFillColor := NColor;
Width := 15;
Height := Width;
Marked := False;
end;
procedure TNode.GetData(Source: TElement);
begin
inherited;
nodeID := 'blabla';
end;
(...das ähnliche nochmal mit TBorder usw...)
procedure TGraphicObjectList.Getdata(Source: TElementList);
var
i: integer;
begin
Clear;
FSource := Source;
for I := 0 to Source.Count - 1 do
begin
if Items[i].elemType = 'start' then
begin
Add(TNode.Create(ntStart));
(Items[Count-1] as TNode).GetData(Source.Items[i]);
end;
(das gleiche mit TBorder u.a.)
end;
end;
Ich hoffe das Grundprinzip ist mit diesem kleinen Ausschnittes deutlich geworden. Nun habe ich ein Problem damit, dass die Eigenschaften von TElement in beiden Listen "gespeichert" werden. Ich möchte aber bei der Erstellung der Grafikobjekte (TGraphicObject) nur auf die Daten der TElementList beziehen...wie kann ich das am besten realisieren?
Danke schonmal für Eure Antworten!!