Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassenvorschläge und Hilfestellung (https://www.delphipraxis.net/82569-klassenvorschlaege-und-hilfestellung.html)

Preddy2005 15. Dez 2006 18:31


Klassenvorschläge und Hilfestellung
 
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

r2c2 15. Dez 2006 19:12

Re: Klassenvorschläge und Hilfestellung
 
Hallo Matthias :hi:
gibt es einen Grund, warum du die Eigenschaften nicht einfach nach den Createn setzt. Machst du doch bei nem Button auch so...

Delphi-Quellcode:
  Button := TButton.Ctreate(Self); // erstellen und Owner zuweisen
  // Position
  Button.Top := ...
  Button.Left := ...
  Button.Width := ...
  Button.Height := ...
  // sonstige Eigenschaften:
  Button.Caption := ...
  // Parent zuweisen und damit anzeigen:
  Button.Parent := Self;
  ...
mfg

Christian

Pfoto 15. Dez 2006 19:30

Re: Klassenvorschläge und Hilfestellung
 
Also hier mal mein Vorschlag, ohne Garantie, ob das der "korrekte" Weg ist:

1) Es wird ein Objekt oder eine Klasse im Vorfeld definiert,
die bestimmte Eigenschaften aufnehmen kann.

2) Das Objekt (Deine Kugel) bekommt dieses Objekt
mit allen Einstellungen im Create-Teil zugewiesen.

3) Das Kugel-Objekt liest diese Einstellungen im
Create-Teil aus und füllt damit seine Eigenschaften.




Gruß
Pfoto

Preddy2005 15. Dez 2006 22:07

Re: Klassenvorschläge und Hilfestellung
 
Im Prinzip ist das korrekt. Werde jetzt das alles so machen wie ich es am Anfang machen wollte.

Werde die Kugel mit den Startwerten nach dem Create initalisieren.
Man kann dann im nachhinein die Wert der einzelnen Kugeln noch ändern...

Das Problem ist, das ich sonst Klasse mit Formularfeldern vermischen würde, damit quasi OOP aufheben würde. Das würde auch keinen Sinn machen. Dann kann ich lieber die Werte immer stets gleich initalisieren lassen und erst nach der Erzeugung die Werte modifizieren oder ich baue mir die Konstruktorlösung, welche dann zwar micht vielen Parametern arbeiten würde, aber trotzdem wunderbar funktioniert würde.

Danke für die Hilfe.

Werde die Tage mal gucken was ich so hinbekomme.

Gruß

Matthias

r2c2 16. Dez 2006 10:42

Re: Klassenvorschläge und Hilfestellung
 
Folgenden Absatz hab ich nicht verstanden:
Zitat:

Zitat von Preddy2005
Das Problem ist, das ich sonst Klasse mit Formularfeldern vermischen würde, damit quasi OOP aufheben würde. Das würde auch keinen Sinn machen. Dann kann ich lieber die Werte immer stets gleich initalisieren lassen und erst nach der Erzeugung die Werte modifizieren oder ich baue mir die Konstruktorlösung, welche dann zwar micht vielen Parametern arbeiten würde, aber trotzdem wunderbar funktioniert würde.

:gruebel:

mfg

Christian

Preddy2005 20. Dez 2006 08:21

Re: Klassenvorschläge und Hilfestellung
 
Hallo an alle!

Habe die Klasse jetzt halt mit vielen Konstruktorparametern realisiert.
Funktioniert bestens. Somit kann ich die Editfeldwerte direkt über den Konstruktoraufruf übergeben.

Vielen Dank und Gruss

Matthias Lorenz


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz