![]() |
Saubere Programmierung mit Delphi
Hallo,
da ich sehr viel Wert auf saubere Programmierung lege, habe ich mir folgendes gedacht. Vieleicht könntet ihr euch mal eine Klasse von mir anschauen und mir ein paar Tips geben, was ich vieleicht besser machen kann.
Delphi-Quellcode:
MFG Christian18
unit UBackground;
interface uses Forms, Graphics; type TBackground = class private FForm : TForm; FColor : Array[0..1] of TColor; FDistance : Byte; public constructor Create(Form: TForm; Color1, Color2: TColor; Distance: Byte); procedure Horizontal(); procedure Vertical(); destructor Destroy(); end; implementation constructor TBackground.Create(Form: TForm; Color1, Color2: TColor; Distance: Byte); begin FForm:=Form; FColor[0]:=Color1; FColor[1]:=Color2; FDistance:=Distance; end; procedure TBackground.Horizontal(); var i : Integer; // Schleifenvariable begin FForm.Color:=FColor[0]; FForm.Canvas.Pen.Color:=FColor[1]; i:=0; while i <= FForm.ClientHeight do begin FForm.Canvas.MoveTo(0, i); FForm.Canvas.LineTo(FForm.ClientWidth, i); Inc(i, FDistance); end; end; procedure TBackground.Vertical(); var i : Integer; // Schleifenvariable begin FForm.Color:=FColor[0]; FForm.Canvas.Pen.Color:=FColor[1]; i:=0; while i <= FForm.ClientWidth do begin FForm.Canvas.MoveTo(i, 0); FForm.Canvas.LineTo(i, FForm.ClientHeight); Inc(i, FDistance); end; end; destructor TBackground.Destroy(); begin FForm.Free(); end; end. |
Re: Saubere Programmierung mit Delphi
Ich weiß jetzt nicht genau was du meinst? Willst du, dass dir jemand sagt, dass xyz bei abc an der Stelle besser aussieht oder etwas was vielleicht Code technisch einen Vorteil hat?
|
Re: Saubere Programmierung mit Delphi
Es fehlt das inherited beim Destruktor
|
Re: Saubere Programmierung mit Delphi
Wieso gibt du FForm wieder frei? Das Objekt wird doch übergeben?
Wenn ich dort nil übergebe, schützt du deine interne Verarbeitung nicht. Gruss Thorsten |
Re: Saubere Programmierung mit Delphi
Brauche ich denn überhaupt einen Destructor?
|
Re: Saubere Programmierung mit Delphi
Zur Zeit ja, weil du ja deine FForm dort freigibst.
Und den deklariert man dann als override. |
Re: Saubere Programmierung mit Delphi
Eigentlich nicht.
|
Re: Saubere Programmierung mit Delphi
in deinem ersten beitrag klang es so, als müsste ich die form gar nicht freigeben. also könte ich dann den dectructor auch weg lassen.
LG Chris |
Re: Saubere Programmierung mit Delphi
FForm wird ja normalerweise mit der TBackground instance zerstoert, imho
|
Re: Saubere Programmierung mit Delphi
keine ahnung. würde mich aber freuen, wenn mir jemand ein paar tips gibt wie ich es besser machen kann?
|
Re: Saubere Programmierung mit Delphi
Zitat:
|
Re: Saubere Programmierung mit Delphi
Ich finde es merkwürdig, dass TBackground die Form zerstört, obwohl es sie nicht erzeugt. IMHO sollte nur derjenige, der etwas erzeugt, auch für das Zerstören zuständig sein.
Außerdem solltest Du Dir ![]() |
Re: Saubere Programmierung mit Delphi
Hier mal ein Vorschlag...
Delphi-Quellcode:
Gruss
unit UBackground;
interface uses Forms, Graphics; type TBackground = class private FForm : TForm; FColor : Array[0..1] of TColor; FDistance : Byte; public constructor Create(AForm: TForm; AColor1, AColor2: TColor; ADistance: Byte); procedure Horizontal; procedure Vertical; end; implementation constructor TBackground.Create(AForm: TForm; AColor1, AColor2: TColor; ADistance: Byte); begin FForm:=AForm; FColor[0]:=AColor1; FColor[1]:=AColor2; FDistance:=ADistance; end; procedure TBackground.Horizontal; var i : Integer; // Schleifenvariable begin if assigned(FForm) then begin FForm.Color:=FColor[0]; FForm.Canvas.Pen.Color:=FColor[1]; i:=0; while i <= FForm.ClientHeight do begin FForm.Canvas.MoveTo(0, i); FForm.Canvas.LineTo(FForm.ClientWidth, i); Inc(i, FDistance); end; end; end; procedure TBackground.Vertical; var i : Integer; // Schleifenvariable begin if assigned(FForm) then begin FForm.Color:=FColor[0]; FForm.Canvas.Pen.Color:=FColor[1]; i:=0; while i <= FForm.ClientWidth do begin FForm.Canvas.MoveTo(i, 0); FForm.Canvas.LineTo(i, FForm.ClientHeight); Inc(i, FDistance); end; end; end; end. Thorsten |
Re: Saubere Programmierung mit Delphi
parameter sollten als const übergeben werden in deinem constructor
|
Re: Saubere Programmierung mit Delphi
Du setzt die Farbwerte nicht auf den Ursprungszustand zurück. Wenn jemand Deine Klasse benutzt und selber Zeichenoperationen auf dem Canvas durchführt, änderst Du einfach die Farben.
Vor den Schleifen solltest Du FForm.ClientWidth und FForm.ClientHeight in einer Integervariable speichern. Dies ist schneller als der Zugriff über die Formproperties in der Schleife. |
Re: Saubere Programmierung mit Delphi
Zitat:
Zitat:
Und nun noch mein Vorschlag:
Delphi-Quellcode:
unit UBackground;
interface uses Forms, Graphics; type TBackground = class private fBackgroundColor: TColor; fLineColor: TColor; fDistance: Integer; public procedure Horizontal(AForm: TForm); procedure Vertical(AForm: TForm); property BackgroundColor: TColor read fBackgroundColor write fBackgroundColor; property LineColor: TColor read fLineColor write fLineColor; property Distance: integer read fDistance write fDistance; end; implementation procedure TBackground.Horizontal(AForm: TForm); var lWidth, lHeight: integer; begin if assigned(AForm) then begin AForm.Color := fBackgroundColor; AForm.Canvas.Pen.Color := fLineColor; lWidth := AForm.ClientWidth; lHeight := AForm.ClientHeight; while lHeight >= 0 do begin AForm.Canvas.MoveTo(0, lHeight); AForm.Canvas.LineTo(lWidth, lHeight); Dec(lWidth, fDistance); end; end; end; procedure TBackground.Vertical(AForm: TForm); var lWidth, lHeight: Integer; begin if assigned(AForm) then begin AForm.Color := fBackgroundColor; AForm.Canvas.Pen.Color := fLineColor; lHeight := AForm.ClientHeight; lWidth := AForm.ClientWidth; while lWidth >= 0 do begin AForm.Canvas.MoveTo(lWidth, 0); AForm.Canvas.LineTo(lWidth, lHeight); Dec(lWidth, fDistance); end; end; end; end. |
Re: Saubere Programmierung mit Delphi
Gutem Morgen,
Muetze1, ich habe da mal ne Frage. Warum machst du alle Eigenschaften der Klasse TBackground über property öffentlcih und die Form nicht? MFG Christian18 |
Re: Saubere Programmierung mit Delphi
Zitat:
Delphi-Quellcode:
Ergo: Keine (oder immer eine feste Anzahl an) Leerzeichen zwischen Name und Doppelpunkt, und dann der Typ.
TBackground = class
private FForm: TForm; FColor: Array[0..1] of TColor; FDistance: Byte; Des öfteren Sucht man eine Deklaration um schnell dort hin zu gelangen. Ich würde dann z.B. immer nach "FColor:" suchen. Wenn da Leerzeichen zwischen sind findet die Suche das nicht. Und nur nach FColor suchen zeigt ja nicht nur die Deklaration, sondern jedes Vorkommen an. Ist also nicht das gewünschte Ergebnis. Das mag zwar optisch nicht so schön eingerückt wirken, ist aber bei der Suche nach deklarationen umso praktischer. |
Re: Saubere Programmierung mit Delphi
Ok, danke für den Tipp.
ich werde versuchen mich daran zu halten. Hast du eine Idee auf eine vorherige Frage? MFG Christian18 |
Re: Saubere Programmierung mit Delphi
Bezüglich der Formatierung würde ich einen der gängigen Codeformatter nehmen und mich danach nicht mehr drum kümmern.
Wenn du sauber programmieren möchtest, 'solltest' Du deinen Code auch kommentieren. Ansonsten finde ich dein Beispiel zu klein, um eine Aussage über sauberes Programmieren zu machen. Es reicht ja nicht, einige Formatierungskonventionen zu verfolgen (dafür gibts ja Formatierer). Viel wichtiger ist doch, wie Du deine Objekte definierst, ob Du immer ein geeignetes Pattern verwendest usw. |
Re: Saubere Programmierung mit Delphi
Ich würde die Klasse TBackground nicht mit einem Formular in Verbindung bringen, sondern nur mit einem Canvas. Die Größe des Canvas wird dann über 2 Properties Width & Height mitgeteilt.
Vorteil: die Klasse arbeitet auch mit Printer.Canvas und TImage.Canvas zusammen. Ausserdem sollten die beiden Farben auch als Property freigelegt werden; die Übergabe im Konstruktor ist so ja ziemlich restriktiv. Ausserdem sollten deutlich mehr Background-Muster (Karos, Linien, Dreiecke, Sechsecke) programmiert werden, damit sich der Aufwand für eine Klasse überhaupt lohnt. |
Re: Saubere Programmierung mit Delphi
Moin Sebastian,
Zitat:
Um eine Deklaration zu finden genügt es doch die entsprechende Variable mit STRG anzuklicken. |
Re: Saubere Programmierung mit Delphi
Zitat:
Den Constructor habe ich entfernt, weil er zu restriktiv ist, wie auch schon sx2008 geschrieben hat. Du kannst die Klasse anlegen und die farblichen Einstellungen jederzeit ändern bzw. anpassen. @sx2008: Das mit dem Canvas war auch mein erster Ansatz, aber er nutzt die Color Eigenschaft der Form, was auch entsprechend Windows als Window Color mitgeteilt wird. Von daher konnte ich mich nicht auf ein TCanvas beschränken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz