Einzelnen Beitrag anzeigen

trebor90

Registriert seit: 28. Mai 2009
43 Beiträge
 
#1

Meine Probleme mit Delphi-OOP ...

  Alt 22. Feb 2012, 15:14
Hallo alle miteinander,

zur Historie
Ich begann in der Schule Delphi zu lernen, wie man das eben so macht; tippeln, verstehen, freuen
Dann habe ich C, Java, C++ im Zuge des Studiums gelernt und kann jetzt OOP *freu*
Nun kehre ich zu Delphi zurueck und gerate ganz schoen ins Straucheln ...


Meine Probleme
Ich habe also in C++ intensiver Klassengestaltung gelernt; ebenso virtuelle und abstrakte Methoden.
Aufgrund dessen kollidiere ich in Delphi mit den Worten >Verdecken/Verbergen< und >Ueberschreiben<.
Darueber hinaus programmiere ich ja auch in der Delphi IDE und diese erzeugt ja schonmal vorab eine ganze Menge Quelltext. Umso mehr knallt's dann, wenn ich versuche ein halbwegs vernuenftiges Klassenkonzept zu realisieren, ohne komplett in der vorgefertigten Kiste "herumzupfuschen" ...


Jetzt ganz genau
1.) Was ist der Unterschied zwischen Verbergen/Verdecken und Ueberschreiben? Ich habe widerspruechliche Dinge gelesen, nach welchen die verdeckten Methoden wieder mit inherited sichtbar gemacht werden koennen ...

2.) Ich habe Zwei Delphi-Formen, wobei ich die erste mit einem eigenen Konstruktor Create(Eigentuemer: TComponent; Kanalnummer: Integer) erzeuge und die Meldung bekomme:
[Warnung] Unit2.pas(25): Methode 'Create' verbirgt virtuelle Methode vom Basistyp 'TCustomForm'
Dabei hat meiner aber eine andere Signatur als der originaere --> Create(AOwner: TComponent)
Was soll ich tun (Bitte nicht nur sagen: reintroduce), ich will ihn ja eigentlich ueberladen, aber mit overload verschwindet die Warnung auch nicht, und Warnungen ignoriere ich nicht.

3.) Ist es ueberhaupt moeglich, ohne den von Delphi automatisch erzeugten Quelltext umzubauen, vernuenftig und streng objektorientiert zu programmieren? Es geht dabei primaer um GUIs.
Ich habe zum Beispiel erstmal die Klassen umbenannt, Zugriffspezifizierer gesetzt, globale Variablen fuer die Forms entfernt (>Form1: TForm1<), Konstruktoren geschrieben, automatische Erzeugungen (FormCreate) entfernt ...
Sieht jetzt so aus:

Delphi-Quellcode:
program Gehoerbildung;

uses
  Forms,
  Unit1 in 'Unit1.pas{Hauptfenster},
  Unit2 in 'Unit2.pas{GeraeteDialog};

{$R *.RES}

var Hauptfenster: THauptfenster;
begin
  Hauptfenster := THauptfenster.Create(nil);
   Application.Initialize;
   Application.CreateForm(THauptfenster, Hauptfenster);
  Application.Run;
end.
Delphi-Quellcode:
unit Unit1;

interface

uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,
   Buttons, MidiOut, Unit2;

type
  TTon = array [1..5] of Integer;
   THauptfenster = class(TForm)
   published
    AbsoluterTonCheckBox: TCheckBox;
    ZweiToeneCheckBox: TCheckBox;
    DreiToeneCheckBox: TCheckBox;
    VierklangCheckBox: TCheckBox;
    FuenfklangCheckBox: TCheckBox;
    HoheLageCheckBox: TCheckBox;
    MittlereLageCheckBox: TCheckBox;
      TiefeLageCheckBox: TCheckBox;
      GenugButton: TButton;
      MIDIDialogButton: TButton;
      WiederholungButton: TBitBtn;
      NeuerVersuchButton: TBitBtn;
      AufloesungButton: TBitBtn;
      CrashButton: TBitBtn;
      GehoerbildungLabel: TLabel;
      KleinC: TLabel;
      GrossC: TLabel;
      CEins: TLabel;
      CZwei: TLabel;
      CDrei: TLabel;
      Trennlinie1: TShape;
      Trennlinie2: TShape;
      Shape1: TShape;

   private
      FToene: TTon;
      FGeraeteDialog: TGeraeteDialog;
      FMidiOut: TMidiOutput;
      property GeraeteDialog: TGeraeteDialog read FGeraeteDialog write FGeraeteDialog;

   published
      procedure NeuerVersuchButtonClick(Sender: TObject);
      procedure WiederholungButtonClick(Sender: TObject);
      procedure AufloesungButtonClick(Sender: TObject);
      procedure CrashButtonClick(Sender: TObject);
      procedure GenugButtonClick(Sender: TObject);
      procedure MIDIDialogButtonClick(Sender: TObject);

      procedure FormCreate(Sender: TObject);
      procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
      procedure FormDestroy(Sender: TObject);

      procedure ErzeugeKlang(AnzahlToene: Integer);
      procedure BestimmeTiefstUndHoechstton(var Tiefster: Integer; var Hoechster: Integer);

   public
      function GetTon(Stelle: Integer): Integer;
      procedure SetTon(Stelle, NeuerTon: Integer);
      property Toene[Stelle: Integer]: Integer read GetTon write SetTon;
      property MidiOut: TMidiOutput read FMidiOut write FMidiOut;
   end;

implementation
--> Hier fehlen die globalen Variablen ...


4.) Wie verwendet man die Zugriffsspezifizierer (>Sichtbarkeitsattribute<) richtig? Musste zwangslaeufig das Meiste in published-Bloecke tun, dass das Programm ueberhaupt uebersetzt wird bzw. nicht abbricht aufgrund fehlender Klassenbestandteile. Aber das ist doch doof - steht doch total im Widerspruch zu Datenkapselung.


Nachtrag
Ich habe mich hier schon durch ein Paar Themen gelesen (mittels der Suche), ebenso durch mehrere Tutorien.
Doch habe ich's immer noch nicht ganz begriffen.
Bitte versteht also, wenn ich keine weiteren Verweise darauf suche, sondern es noch mal mit euren Worten erklaert bekommen moechte. Das bezieht sich insbesondere auf die Zugriffsspezifizierer und Ueberladen etc. .



Bis zur Hilfe,
Ri
"Es amüsiert mich immer wieder, wenn Menschen all ihr Unglück dem Schicksal, dem Zufall oder dem Verhängnis zuschreiben, während sie ihre Erfolge oder ihr Glück mit ihrer eigenen Klugheit, ihrem Scharfsinn oder ihrer Einsicht begründen."
  Mit Zitat antworten Zitat