|
Registriert seit: 23. Aug 2006 50 Beiträge Delphi 6 Personal |
#1
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( ![]() 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:
Hier noch die Klasse(unterklasse ist irgendwie über der Oberklasse ^^'?):
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;
Delphi-Quellcode:
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.
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. 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. |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |