Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: dynamische Verwaltung von Objekten - Fahrstuhlsteuerung

  Alt 12. Jun 2013, 17:34
Kurze Grundlagen zu Klassen:

Klassen sind erstmal Typen und bekommen vor dem Namen ein T verpasst.

Der constructor heißt Create und sollte nach Möglichkeit auch so benutzt/benannt werden.
Delphi-Quellcode:
TMyObj = class
public
  constructor Create;
  constructor Init;
end;

constructor TMyObj.Create;
begin
  inherited;
  // irgendwas machen
end;

constructor TMyObj.Init;
begin
  inherited Create;
  // irgendwas machen
end;
Wird eine Klassen-Instanz erzeugt (mit dem constructor ) so liefert mir selbiger eine Referenz auf die Klasse (als einen Zeiger).

Ein Zeiger auf eine Klassen-Referenz-Variable liefert mir also nur den Zeiger auf den Zeiger der Klasse. Lustig, gell?
(Das hört sich nicht nur komisch an, es ist auch komisch)

Für die Verwaltung von Klassen-Instanzen (man spricht dabei von Objekten), also eine Liste mit Objekten, gibt es die Hier im Forum suchenTObjectList.

Delphi-Quellcode:
var
  MyList : TObjectList;
begin
  // Liste erzeugen ...
  MyList := TObjectList.Create( True );
  try
    // ... mit ein paar Objekten füllen ...
    MyList.Add( TMyObj.Create );
    MyList.Add( TMyObj.Create );
    MyList.Add( TMyObj.Create );
  finally
    // und wieder freigeben
    MyList.Free;
  end;
end;
Das gibt auch kein Speicherleck, da TObjectList.Create( True ) eine Liste erzeugt, die alle Objekte der Liste automatisch freigibt.

Somit solltest du deinen Ansatz mit dem ganzen Zeigergeraffel grundlegend über Bord werfen.

Zu deiner Klasse selber
Delphi-Quellcode:
TFahrtRichtung = ( frRunter, frHoch );

//FahrstuhlKabine = class
TFahrstuhlKabine = class
  // diese Felder sind alle published ... eher unvorteilhaft
  // Der Zugriff sollte über Properties geregelt werden
      F_id: cardinal;
      //fahrtrichtung: bool; // 1 = hoch // 0 = runter
      Fahrtrichtung : TFahrtRichtung;
      In_Benutzung: bool;
      Fahrtzeit: real;
      gewaehlteEtagen: pgewEt;
      speed: real;
      EtageV, EtageB, zulGewicht: integer;
      niAnEt: pNiAnEt;
    private
      F_position, F_tatsGewicht: real;
    public
      testvar:integer;
      property id: cardinal read F_id write F_id;
      property position:real read F_position write F_position;
      property tatsGewicht:real read F_tatsGewicht write F_tatsGewicht;
      constructor init(id_in:cardinal; zulGewicht_in, EtageV_in, EtageB_in: integer; sNiAnEt: string);

      // !!! NEIN !!!
      // destructor destruct();

      destructor Destroy; override;

      function zielAnfahren(Ziel:integer):bool;
      procedure set_Zieletage();
      procedure Notruf();
      function lastprobe():bool;
      function geschwindigkeitsmessung():bool;
      procedure notfallbremsen();
      function test():integer;
    end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (12. Jun 2013 um 17:48 Uhr)
  Mit Zitat antworten Zitat