Einzelnen Beitrag anzeigen

benwen

Registriert seit: 11. Sep 2006
17 Beiträge
 
Delphi 7 Enterprise
 
#1

Frage zu OOP - zwei Listen

  Alt 17. Sep 2006, 21:43
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 = 'startthen
      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!!
  Mit Zitat antworten Zitat