AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klassenvorschläge und Hilfestellung

Ein Thema von Preddy2005 · begonnen am 15. Dez 2006 · letzter Beitrag vom 20. Dez 2006
Antwort Antwort
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
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#2

Re: Klassenvorschläge und Hilfestellung

  Alt 15. Dez 2006, 20:12
Hallo Matthias
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
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Pfoto

Registriert seit: 26. Aug 2005
Ort: Daun
541 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Klassenvorschläge und Hilfestellung

  Alt 15. Dez 2006, 20:30
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
Jürgen Höfs
  Mit Zitat antworten Zitat
Preddy2005

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

Re: Klassenvorschläge und Hilfestellung

  Alt 15. Dez 2006, 23:07
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
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#5

Re: Klassenvorschläge und Hilfestellung

  Alt 16. Dez 2006, 11:42
Folgenden Absatz hab ich nicht verstanden:
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.


mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Preddy2005

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

Re: Klassenvorschläge und Hilfestellung

  Alt 20. Dez 2006, 09:21
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:47 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