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