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."