Home » Tutorials » VCL » TList

TList

Schritt 3

Wir wollen jetzt die Prozedur schreiben, die das Ganze zeichnet.
Nun werden wir auch sehen, wieso wir einen Basistypen definiert haben.
Da der Benutzer ja in beliebiger Reihenfolge Objekte einfügen kann, wissen wir nicht, welche Objekte sich an welcher Stelle der Liste befinden.
Um herauszufinden, um was für ein Objekt es sich handelt, weisen wir einer Variable des Types Basistyp einfach den Zeiger auf das zu zeichnende Objekt zu. Da es sich bei BasisTyp um die gleiche Datenstruktur wie bei BildTyp und FormTyp handelt, können wir ohne Probleme auf die Daten zugreifen:

var Basis:^BasisTyp;
begin
  Basis:=Objekte[0]; // das erste Objekt ist ein??
  case Basis^.Typ of
  ...

Das Ganze sieht dann so aus:

public
    ...
    procedure PaintIt;
    ...
  end;

procedure THauptForm.PaintIt;
var loop:Integer;
    Basis:^BasisTyp;
    bild:^BildTyp;
    Form:^FormTyp;

begin
 with ZeichenFlaeche.Canvas do
  begin
   // Löschen
   Brush.Color:=clWhite;
   Pen.Color:=clWhite;
   Rectangle(0,0,ZeichenFlaeche.Width,zeichenFlaeche.Height);

   for loop:=0 to Objekte.Count-1 do // das letzte zuerst zeichnen
    begin
     Basis:=Objekte[loop];
     case Basis^.Typ of
      1: begin // Bild
          Bild:=Objekte[loop];
         StretchDraw(Rect(Bild^.X, Bild^.Y, Bild^.X+Bild^.Width,
         Bild^.Y+Bild^.Height), Bild^.Image);
          //Draw(Bild^.X,Bild^.Y,Bild^.Image);
         end; // Bild;
      2: begin // Form
          Form:=Objekte[loop];
          Brush.Color:=Form^.FuellFarbe;
          Pen.Color:=Form^.LinienFarbe;
           case Form^.FormTyp of
            1: Rectangle(Form^.X, Form^.Y, Form^.X+Form^.Width,
               Form^.Y+Form^.Height);
            2: Ellipse(Form^.X, Form^.Y, Form^.X+Form^.Width,
               Form^.Y+Form^.Height);
           end; // Rechteck oder Kreis
         end; // Form
     end; // case

     if loop=AnGewaehlt then
      begin // um das gerade gewählte Objekt wird ein roter Rahmen gezeichnet
          Brush.Style:=bsClear;
          Pen.Color:=clRed;
          Rectangle(Basis^.X, Basis^.Y, Basis^.X+Basis^.Width,
          Basis^.Y+Basis^.Height);
          Brush.Style:=bsSolid;
      end; // angewaehlt
    end; // jedes Objekt
  end;
end;

Durch die gleiche Datenstruktur war es uns also möglich zu erfahren, um was für einen Typen es sich überhaupt handelte. Im BasisTyp sind ja noch weitere, bei jedem Objekt gleiche, Daten wie die Position und die Größe gespeichert. Dies brauchen wir im nächsten Schritt.