Einzelnen Beitrag anzeigen

Preddy2005

Registriert seit: 27. Nov 2005
Ort: Mettmann
38 Beiträge
 
#1

Klassenvorschläge und Hilfestellung

  Alt 15. Dez 2006, 19:31
Hallo mal wieder! Ich bräuchte mal ein wenig Hilfe bei der Klassenprogrammierung. Und zwar geht es um folgendes:

Ich werde versuchen, das Problem so gut wie möglich zu schildern.

Es gibt 3 Units :

Ein Hauptformular, in dem man auf das Formular klickt und man ein Objekt dynamisch erzeugt.
Eine Unit, in der eine Klasse drinne ist.
Eine Optionsformular, in dem man die Startparameter einstellen kann.

Soweit so gut...

Hier mal die Klassenunit :

Delphi-Quellcode:

type TKugel = class(TShape) // Klasse, welche von TShape abgeleitet ist

constructor Create(AOwner: TWinControl; AZahl : Integer; AColor : TColor; XPos : Integer);

 private // Klassenattribute
  FKugel_X_Weg : Integer;
  FKugel_Y_Weg : Integer;
  FKugel_X_Pos : Integer;
  FKugel_Y_Pos : Integer;
  FKugel_Geschwindigkeit : Integer;
  FKugel_Breite : Integer;
  FKugel_Hoehe : Integer;
  FKugel_Farbe : TColor;
  FKugel_Typ : TShapeType;

 public // Methoden, mit denen die Klassenattribute verändert werden können

    // Über diese Prozeduren können die Shape - Attributfelder modifiziert werden
  procedure Setze_X_Weg ( X_Weg : Integer );
  procedure Setze_Y_Weg ( Y_Weg : Integer );
  procedure Setze_X_Pos ( X_Pos : Integer );
  procedure Setze_Y_Pos ( Y_Pos : Integer );
  procedure Setze_Geschwindigkeit ( Geschwindigkeit : Integer);
  procedure Setze_Breite ( Breite : Integer);
  procedure Setze_Hoehe ( Hoehe : Integer);
  procedure Setze_Farbe ( Farbe : TColor);
  procedure Setze_Shapetype ( Shapetyp : TShapetype);

     // Lese die Eigenschaften eines Kugelobjektes aus
  function Lese_X_Weg () : Integer;
  function Lese_Y_Weg () : Integer;
  function Lese_X_Pos () : Integer;
  function Lese_Y_Pos () : Integer;
  function Lese_Geschwindigkeit () : Integer;
  function Lese_Breite () : Integer;
  function Lese_Hoehe () : Integer;
  function Lese_Farbe () : Integer;
  function Lese_Shapetpy () : TShapetype;

 end;

implementation

uses Kugel_optionen;

{*******************************************************************************
*******************************************************************************}


constructor TKugel.Create(AOwner: TWinControl; AZahl : Integer; AColor : TColor; XPos : Integer);
begin
 inherited create(AOwner); // Konstruktor von der Basisklasse TWinControl ableiten

  Shape := stCircle; // Geometrische Form zuweisem
  Brush.Color := AColor; // Farbe der Kugel bestimmen
  Name := 'Kugel' + InttoStr(AZahl); // Name der Kugel zuweisen
  Parent := AOwner; // Parent zuweisen ( Beim Aufruf das Formular )
  Visible := True; // Sichtbar
  Top := 10;
  Left := 10;
  Width := 10;
  Height := 10;

end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Breite: Integer;
begin
 result := FKugel_Breite;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Farbe: Integer;
begin
 result := FKugel_Farbe;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Geschwindigkeit: Integer;
begin
 Result := FKugel_Geschwindigkeit;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Hoehe: Integer;
begin
 result := FKugel_Hoehe;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Shapetpy: TShapetype;
begin
 result := FKugel_Typ;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_X_Pos: Integer;
begin
 Result := FKugel_X_Pos;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_X_Weg: Integer;
begin
 Result := FKugel_X_Weg;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Y_Pos: Integer;
begin
 Result := FKugel_Y_Pos;
end;

{*******************************************************************************
*******************************************************************************}


function TKugel.Lese_Y_Weg: Integer;
begin
 result := FKugel_Y_Weg;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Breite(Breite: Integer);
begin
 FKugel_Breite := Breite;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Farbe(Farbe: TColor);
begin
 FKugel_Farbe := Farbe;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Geschwindigkeit(Geschwindigkeit: Integer);
begin
 FKugel_Geschwindigkeit := Geschwindigkeit;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Hoehe(Hoehe: Integer);
begin
 FKugel_Hoehe := Hoehe;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Shapetype(Shapetyp: TShapetype);
begin
 FKugel_Typ := Shapetyp;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_X_Pos(X_Pos: Integer);
begin
 FKugel_X_Pos := X_Pos;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_X_Weg(X_Weg : Integer);
begin
 FKugel_X_Weg := X_Weg;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Y_Pos(Y_Pos : Integer);
begin
 FKugel_Y_Pos := Y_Pos;
end;

{*******************************************************************************
*******************************************************************************}


procedure TKugel.Setze_Y_Weg(Y_Weg : Integer);
begin
 FKugel_Y_Weg := Y_Weg;
end;

{*******************************************************************************
*******************************************************************************}


end.
Hier mein Hauptformular :

Delphi-Quellcode:

{*******************************************************************************
*******************************************************************************}


Var
  KugelZahl : Integer = 1; // Kugelzahl setzen
// AKugel : TKugel; // Klasseninstanz deklarieren

{*******************************************************************************
*******************************************************************************}


procedure TfrmMain.FormClick(Sender: TObject);
begin

  AKugel := TKugel.Create(frmMain,Kugelzahl,clRed,50); // Bei Klick Objekt erzeugen
  Kugelzahl := Kugelzahl + 1; // Kugelanzahl erhöhen
  frmMain.Caption := 'Aktuelle Kugelzahl : ' + IntToStr(KugelZahl-1);

  with frmOptionen do
   begin
    cbKugelnummer.Enabled := True; // Kugelselektionsfeld aktivieren
    cbKugelnummer.Items.Add(IntToStr(Kugelzahl-1)); // Kugelanzahl in die Combobox hinzufügen
    cbKugelnummer.ItemIndex := cbKugelnummer.Itemindex + 1; // Zähler der Combobox erhöhen
  end;

end;

{*******************************************************************************
*******************************************************************************}


procedure TfrmMain.Timer1Timer(Sender: TObject);
Var
  i : Integer;

begin
  For i:=1 to KugelZahl-1 Do Begin
    AKugel := FindComponent ('Kugel' + IntToStr (i)) as TKugel; // Nach allen Kugelobjekten auf dem Formular suchen
    AKugel.Left := AKugel.Left + 40; // Die Kugel bewegen
  End;
end;

{*******************************************************************************
*******************************************************************************}


procedure TfrmMain.Optionen1Click(Sender: TObject);
begin
 if frmOptionen.Visible = true then frmOptionen.Visible := false
  else frmOptionen.Show;
end;

{*******************************************************************************
*******************************************************************************}


procedure TfrmMain.FormShow(Sender: TObject);
begin
 frmMain.Caption := 'Aktuelle Kugelzahl : ' + IntToStr(KugelZahl-1);
 frmOptionen.Show;

 with frmOptionen do // Werte beim Start in die Editfelder eintragen
  begin
   edtTimerIntervall.Text := '150';
   edtHoehe.Text := '20';
   edtBreite.Text := '20';
   edtXStartpos.Text := '10';
   edtYStartpos.Text := '10';
   edtXWeg.Text := '10';
   edtYWeg.Text := '10';
   edtGeschwindigkeit.Text := '10';
   cbKugelnummer.Enabled := False;
  end;
end;

{*******************************************************************************
*******************************************************************************}


procedure TfrmMain.Beende1Click(Sender: TObject);
begin
   if MessageDlg('Wollen sie das Programm beenden?',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then Close;
end;

{*******************************************************************************
*******************************************************************************}


procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);

var i : Integer;
begin // Über FindComponent iterieren
 Action := caFree; // Speicher für das Formular freigeben
 // Speicher Freigabe für die Instanzen noch durchführen
end;

{*******************************************************************************
*******************************************************************************}
Nun zu meinem Problem : Wie kann ich nun bei der Erzeugung des Objektes direkte Werte zuweisen?

1.) 10 Parameter im Konstruktor ? Das scheint mir nicht sehr sinnvoll zu sein.
2.) Ich kann auch nicht auf die Klasseninstanz zugreifen, wenn diese noch nicht erzeugt worden ist.
Deshalb habe ich auch keine Chance nach meinem Kenntnisstand vorher die Parameter zu modifizieren.
Meine Prozeduren scheinen also komplett nutzlos zu sein.
Oder denke ich nur zu kompliziert?

Ich hoffe mir kann irgendjemand helfen, ich brauche ein wenig Unterstützung in Sachen Logik.
Vielleicht ist dieser Ansatz auch falsch.

Ich kann natürlich auch mit 10 Konstruktorparametern die Objekt erzeugen, aber es gibt mit Sicherheit noch einen anderen Weg.

Vielen Dank an alle Leute, die mir mit diesem Problem weiterhelfen können.
Für Experten ist dies mit Sicherheit einfach zu lösen.

Gruß

Matthias
  Mit Zitat antworten Zitat