Einzelnen Beitrag anzeigen

ark4869

Registriert seit: 23. Aug 2006
50 Beiträge
 
Delphi 6 Personal
 
#1

Objekt TList- ich versteh kein Wort!

  Alt 28. Okt 2008, 19:38
Hallöle!
Momentan machen wir in Informatik(wie seit vielen Monaten) Objektorientier Programmierung und als nächste Reihe sollen Listenstrukturen kommen. Dafür sollen wir unser aktuelles Programm abändern.
Dieses wäre, dass wir Uhren(analog) programmiert haben, die die Zeit anzeigen, sich bewegen und an den Rändern abprallen. Wir sollen nun so ändern, dass man beliebig viele Uhren hinzufügen kann(funktioniert ohne Liste, da er immer "Uhr1" createt), und auch, wie in einem Stack, diese wieder löschen kann. Durch dieses Createn als "Uhr1" löscht er aber, wie ich selbst rausgefunden hab( - es gehört zur Aufgabe rauszufinden wieso es nich klappt), nur eine der vielen Uhren, die als letztes Erzeugte.
Dafür brauchen wir halt die Liste(Arrays sollen wir nicht), und unser Lehrer hat uns Seiten in unserem Wunderbaren Buch genannt, nur da ist zwar ne tolle Aufzählung mit Liste.Items und was weiß ich nicht, doch nix , wie man es anwendet. Ich find es momentan sehr kompliziert und konnt noch nichts finden, was mir helfen konnte. Ich geb mal den Code unseres Hauptprogrammes durch. Ich hab Delphi 6

Delphi-Quellcode:
unit mBewegteUhr;
{Übung 14.3 - Modifikation: West; Uhr2a --> BewegteUhr: September/Oktober 2008}

interface

uses
  Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs, StdCtrls,
  classes, {z.B. für TList}
  mTBewegteUhr; {TBewegteUhr}

type
  TMain = class(TForm)
    BtErzeugen: TButton;
    BtVerbergen: TButton;
    BtZeigen: TButton;
    BtVernichten: TButton;
    procedure BtErzeugenClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtVerbergenClick(Sender: TObject);
    procedure BtZeigenClick(Sender: TObject);
    procedure BtVernichtenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Uhr1: TBewegteUhr;
  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;

implementation

{$R *.DFM}

procedure TMain.BtErzeugenClick(Sender: TObject);
begin
  Uhr1 := TBewegteUhr.Create (Main.Width div 2, Main.Height div 2, 75);
  Uhr1.Kennt(Main);
  Uhr1.Zeigen;
end;

procedure TMain.BtVernichtenClick(Sender: TObject);
begin
  if Uhr1 <> nil then begin
    Uhr1.Destroy;
    Uhr1 := nil
  end;
end;

procedure TMain.BtVerbergenClick(Sender: TObject);
begin
  if Uhr1 <> nil then Uhr1.Loeschen;
end;

procedure TMain.BtZeigenClick(Sender: TObject);
begin
  if Uhr1 <> nil then Uhr1.Zeigen;
end;

procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  BtVernichtenClick(Sender);
end;

procedure TMain.FormCreate(Sender: TObject);
begin
  doublebuffered:= true;
  randomize;
end;
Hier noch die Klasse(unterklasse ist irgendwie über der Oberklasse ^^'?):

Delphi-Quellcode:
unit mTBewegteUhr;
{ Änderungen von West. Zeigt die 'echte' Zeit einschl. Sekunden an.}
{ Änderungen vom 30.08.2006 und vom 23.09.2008
  Übergeben werden Mittelpunktskoordinaten und Radius.
  Die Uhr kann auf einem Hintergrund mit beliebiger Farbe dargestellt werden! }


{Übung 14.3}

interface

uses Forms, {TForm}
     ExtCtrls, {TTimer}
     Graphics, {TCanvas}
     SysUtils; {Zeitmethoden}


type TUhr = class (TObject)
     protected
       kContainer: TForm; { Formular, auf dem gezeichnet wird }
       zX, zY, zBreite: Integer; { Für Canvas-Methode 'Ellipse' benötigt }
       zXM, zYM, zRadius: Integer; { Mittelpunktskoordinaten }
       hZeit: TTimer; { Holt die Zeit (zum Stellen der Uhr) }
       zStd,zMin, zSec, SMSec: Word;
       procedure ZeitAnzeigen (Sender:TObject);
       procedure Zeichnen(color: TColor);
     public
       constructor Create(XM, YM, Radius: integer);
       destructor Destroy;
       procedure Kennt (Container: TForm);
       procedure Zeigen;
       procedure Loeschen;
     end;

type TBewegteUhr = class(TUhr)
     private
        vx, vy: integer;
        procedure Bewegen (Sender:TObject);
     public
       constructor Create(XM, YM, Radius: integer);
     end;

implementation

(*  ******************************  TBewegteUhr ****************************  *)

constructor TBewegteUhr.Create(XM, YM, Radius: integer);
begin
  randomize;
  inherited create(XM, YM, Radius);
  vx:= -5+random(11);
  vy:= -5+random(11);
  hZeit.OnTimer:= Bewegen;
  hZeit.Enabled:= true;
  hZeit.Interval:= 30; // auch 1 ist möglich
end;

procedure TBewegteUhr.Bewegen(Sender:TObject);
begin
  Loeschen;
  {Bei Reflexion gehen vx und vy in -vx bzw. -vy über - Impulserhaltungssatz}
  if zXM < zRadius then vx:= -vx;
  if zXM > (kContainer.ClientWidth - zRadius) then vx:= -vx;
  if zYM < zRadius then vy:= -vy;
  if zYM > (kContainer.ClientHeight - zRadius) then vy:= -vy;
  zXM:= zXM + vx;
  zYM:= zYM + vy;
  DecodeTime(Time, zStd, zMin, zSec, SMSec);
    // zStd:= 23; // nur für Testzwecke!
    // zMin:= 60; // nur für Testzwecke!
    // zSec:= 45; // nur für Testzwecke!
  Zeigen;
end;

(* alternativ bei der Reflexion:

procedure TBewegteUhr.Bewegen(Sender:TObject);
begin
  Loeschen;
  {Bei Reflexion gehen vx und vy in -vx bzw. -vy über - Impulserhaltungssatz}
  if zXM < zRadius then vx:= abs(vx);
  if zXM > (kContainer.ClientWidth - zRadius) then vx:= -abs(vx);
  if zYM < zRadius then vy:= abs(vy);
  if zYM > (kContainer.ClientHeight - zRadius) then vy:= -abs(vy);
  zXM:= zXM + vx;
  zYM:= zYM + vy;
  DecodeTime(Time, zStd, zMin, zSec, SMSec);
    // zStd:= 23;    // nur für Testzwecke!
    // zMin:= 60;    // nur für Testzwecke!
    // zSec:= 45;    // nur für Testzwecke!
  Zeigen;
end;   *)



(*  ******************************  TUhr ***********************************  *)

constructor TUhr.Create (XM, YM, Radius: Integer);
begin
  inherited Create;
  zXM:= XM;
  zYM:= YM;
  zRadius:= Radius;
  DecodeTime(Time, zStd, zMin, zSec, SMSec); // In der Online-Hilfe nachschauen!
  // zStd:= 23; // nur für Testzwecke!
  // zMin:= 60; // nur für Testzwecke!
  // zSec:= 45; // nur für Testzwecke!
  hZeit := TTimer.Create (nil);
  hZeit.Interval := 1000;
  hZeit.Enabled := False;
  hZeit.OnTimer := ZeitAnzeigen;
end;

destructor TUhr.Destroy;
begin
  Loeschen;
  hZeit.Enabled := False; // muss unbedingt geschehen!
  hZeit.Destroy;
  inherited Destroy;
end;

procedure TUhr.Kennt (Container: TForm);
begin
  kContainer := Container;
end;

procedure TUhr.Zeichnen(color: Tcolor);
var StdWinkel, MinWinkel, SekWinkel: real;
     x, y: integer;
begin
  with kContainer.Canvas do begin
    Pen.Color := color;
    // Brush.Color:= clWhite;
    Brush.Style:= bsclear; // Hintergrund in Containerfarbe
    Pen.Width := 2;
    zX := zXM - zRadius;
    zY := zYM + zRadius;
    zBreite := 2*zRadius; // Breite = Durchmesser der Uhr
    Ellipse (zX,zY,zX+zBreite,zY-zBreite);
    {großer Zeiger = Minutenzeiger}
    MoveTo (zXM,zYM);
    MinWinkel:= (zMin/60)*2*Pi;
    x:= zXM+Round(sin(MinWinkel)*0.9*zRadius);
    y:= zYM-Round(cos(MinWinkel)*0.9*zRadius);
    LineTo (x, y);
    {kleiner Zeiger = Stundenzeiger}
    MoveTo (zXM,zYM);
    if zStd >= 12 then zStd := zStd - 12;
    StdWinkel:= (zStd/12 + zMin/720)*2*Pi;
    x:= zXM+Round(sin(StdWinkel)*0.6*zRadius);
    y:= zYM-Round(cos(StdWinkel)*0.6*zRadius);
    LineTo (x, y);
    {Sekundenzeiger}
    Pen.Width := 1;
    MoveTo (zXM,zYM);
    SekWinkel:= (zSec/60)*2*Pi;
    x:= zXM+Round(sin(SekWinkel)*0.9*zRadius);
    y:= zYM-Round(cos(SekWinkel)*0.9*zRadius);
    LineTo (x, y);
  end;
end;

procedure TUhr.Zeigen;
begin
  Zeichnen(clBlack);
  hZeit.Enabled:= true;
end;

procedure TUhr.ZeitAnzeigen (Sender:TObject);
begin
    Loeschen;
    DecodeTime(Time, zStd, zMin, zSec, SMSec);
    // zStd:= 23; // nur für Testzwecke!
    // zMin:= 60; // nur für Testzwecke!
    // zSec:= 45; // nur für Testzwecke!
    Zeigen;
end;

procedure TUhr.Loeschen;
begin
  hZeit.Enabled:= false;
  Zeichnen(kContainer.Color);
end;


end.
Vielleicht kann mir ja jemand zumindest etwas helfen. Ich hab schon was versucht, aber aufgegeben das wär einfach nur Trial mit sehr viel Error geworden.

Trotzdem mal hier, vllt. is was richtiges dabei(nur Hauptformular)

Delphi-Quellcode:
unit mBewegteUhr;
{Übung 14.3 - Modifikation: West; Uhr2a --> BewegteUhr: September/Oktober 2008}

interface

uses
  Windows, Messages, SysUtils, Graphics, Controls, Forms, Dialogs, StdCtrls,
  classes, {z.B. für TList}
  mTBewegteUhr; {TBewegteUhr}

type
  TMain = class(TForm)
    Liste: TList;
    BtErzeugen: TButton;
    BtVerbergen: TButton;
    BtZeigen: TButton;
    BtVernichten: TButton;
    procedure BtErzeugenClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure BtVerbergenClick(Sender: TObject);
    procedure BtZeigenClick(Sender: TObject);
    procedure BtVernichtenClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    Uhr1 : TBewegteUhr;

  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;
  I : integer;
implementation

{$R *.DFM}

procedure TMain.BtErzeugenClick(Sender: TObject);
begin
  Liste.Items[I] := TBewegteUhr.Create (Main.Width div 2, Main.Height div 2, 75);
  Uhr1.Kennt(Main);
  Uhr1.Zeigen;
end;

procedure TMain.BtVernichtenClick(Sender: TObject);
begin
  if Uhr1 <> nil then begin
    Uhr1.Destroy;
    Uhr1 := nil
  end;
end;

procedure TMain.BtVerbergenClick(Sender: TObject);
begin
  if Uhr1 <> nil then Uhr1.Loeschen;
end;

procedure TMain.BtZeigenClick(Sender: TObject);
begin
  if Uhr1 <> nil then Uhr1.Zeigen;
end;

procedure TMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  BtVernichtenClick(Sender);
end;

procedure TMain.FormCreate(Sender: TObject);
begin
  Liste := TList.Create;
  Liste.First := 0
  //Liste.Items [I] : Pointer;
  doublebuffered:= true;
  randomize;
end;

end.
  Mit Zitat antworten Zitat