Zitat von
gmc616:
Oho, so wie's scheint hab ich vergessen meinen Post in IRONIE-Tag zu setzten.
Dachte eigentlich, das mit dem Satz "Mehr läßt sich auch den 5 Zeilen nicht entnehmen" alles gesagt wäre.
Mag sein, dass Du das ironisch gemeint hast (was ich hoffe
)... aber woher soll das ein Anfänger wissen??? Der denkt wahrscheinlich, so sollten die Kommentare wirklich aussehen...
Zitat von
s-off:
Zitat von
Phoenix:
Es könnte eine Variable Namens Rect geben, aber benutzt wird Control.Rect. Eine der bösen Fallen bei with...
Da muss ich DIr leider widersprechen; probier's aus:
Delphi-Quellcode:
Procedure TForm1.MalDas(Control: TControl);
Var
Rect: TRect;
Begin
Rect.Left := 10;
Rect.Top := 10;
Rect.Right := 60;
Rect.Bottom := 60;
//alles was hier drüber steht, kennen wir nicht - könnte ja eine lokale Variable sein *g*
With Control As TListBox Do Begin
Canvas.Brush.Color := clYellow;
Canvas.FillRect(Rect);
Canvas.Font.Color := clRed;
Canvas.TextOut(Rect.Left + 2, Rect.Top, 'Hallo');
End;
End;
Hier wird die lokale Variable Rect zugrunde gelegt.
Also...
with gehört
IMHO mit zu den schrecklichsten Sprachkonstrukten überhaupt *schauder*
Nicht nur, dass der Code schwieriger lesbar wird (vor allem bei langen with-Blöcken und gerade da würde ein with überhaupt nur Sinn machen), es wird auch
<IRONIE>unheimlich das Debuggen erleichtert
</IRONIE&gt;...
Ich finde,
with sollte grundsätzlich nicht verwendet werden (in eigenem Code). Es gibt auch keinen Grund dafür... außer um anderen das Leben schwerer zu machen. Code sollte wenn möglich so geschrieben sein, dass er
möglichst einfach und schnell zu verstehen, zu warten und zu debuggen ist.
Auch der Cast in dem with-Block ist kein Argument, denn man kann sich einfach mit einer lokalen Variablen behelfen:
Delphi-Quellcode:
Procedure TForm1.MalDas(Control: TControl);
Var
rect: TRect;
lst: TListBox;
Begin
rect.Left := 10;
rect.Top := 10;
rect.Right := 60;
rect.Bottom := 60;
// alles was hier drüber steht, kennen wir nicht - könnte ja eine lokale Variable sein *g*
With Control As TListBox Do Begin
Canvas.Brush.Color := clYellow;
Canvas.FillRect(Rect);
Canvas.Font.Color := clRed;
Canvas.TextOut(Rect.Left + 2, Rect.Top, 'Hallo');
End;
// diese Variante kommt ohne with aus... und es ist nicht wirklich mehr zu tippen... habe die
// Zeichen jetzt aber nicht gezählt *g*
lst := (Control as TListBox);
lst.Canvas.Brush.Color := clYellow;
lst.Canvas.FillRect(lst.Rect);
lst.Canvas.Font.Color := clRed;
lst.Canvas.TextOut(lst.Rect.Left + 2, lst.Rect.Top, 'Hallo');
End;
Wobei in diesem Beispiel der Cast in TListBox sowieso unnötig ist - mal nebenbei bemerkt - aber es ging ja jetzt ums Prinzip
Allerdings ist diese Diskussion jetzt grade etwas off-topic...
Daher noch was zu der ursprünglichen Frage von coocky:
Die schlechtesten Kommentare sind die, welche schlicht falsch sind (weil z.B. von irgendwoher kopiert und nicht angepasst wurden), da sie nicht nur ihren Sinn nicht erfüllen, sondern den Leser auch noch in die Irre führen...
Daher Kommentare immer sehr sorgfältig schreiben!
Schlicht sinnlos sind Kommentare, die einfach nur den Code in unsere Sprache übersetzen - Kommentare sind nicht dazu gedacht, dem Leser die Sprache beizubringen!
Delphi-Quellcode:
// völlig sinnloser Kommentar...
Canvas.TextOut(Rect.Left + 2, Rect.Top, 'Hallo'); // Schreibe 'Hallo' auf die Zeichenfläche des Controls
// das ist so wie...
i := i + 1; // erhöhe i um 1
Kommentare sollen z.B. erklären,
warum man etwas macht... oder warum gerade so und nicht anders... oder können einfach zur Strukturierung des Codes verwendet werden, wie Überschriften in einem Text... nur um mal ein paar wenige Beipiele zu nennen
Delphi-Quellcode:
// Hierdurch soll erreicht werden, dass.... blabla...
//
// Diese Variante wurde gewählt, weil... blabla...
//
// ACHTUNG:
// Es wird hier nicht überprüft, ob Items.Objects[Index] auch in TColor gecastet werden kann!
// Es sollte unbedingt noch eine entsprechende Prüfung eingebaut werden und im Falle eines ungültigen Wertes
// eine festgelegte Standardfarbe verwendet werden!
//
// TODO: Prüfung auf gültigen Farbwert in Items.Objects[Index]! (<-- Dies erzeugt einen Eintrag in der Delphi-ToDo-Liste)
//
with Control as TListBox do begin
Canvas.FillRect(Rect);
Canvas.FontColor := TColor(Items.Objects[Index]);
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]);
end;
So... das mal so als Anregung