Ok,
sorry wenn ich das jetzt mal so sage, aber an deinem Code solltest du noch etwas arbeiten. Ich weiß nicht wie groß das Grafikprogramm ist oder werden soll, aber gerade bei etwas größeren Projekten zahlen sich ein paar Dinge aus. Es gibt nette (kleine) Bücher dazu, die haben so ein paar Grundregeln über guten Codestil drin. Gibt sicherlich auch online etwas..
Die sollte man (
imho) berücksichtigen. Also mir hat das echt eine Menge gebracht (nicht falsch verstehen, ist wirklich als Tipp gemeint und hilft häufig Fehler zu vermeiden, Code lesbarer zu machen und auch wartbar und ist gerade bei der Arbeit von mehreren am selben Programm unabdingbar).
Kurz dazu dann ein paar Worte:
- Variablennamen sollten immer selbst erklären sein (was obj ist weiß doch keiner der es liest)
- Methodennamen auch (s. BitBnt1.Click, gibt dem Button lieber einen Namen)
- With solltest du ruhig weglassen. Ist zwar praktisch, führt aber nicht gerade zu leicher lesbarem Code
Ist wirklich nicht so schlimm wie es jetzt vielleicht klingt, aber diese Kleinigkeiten machen Code schnell unübersichtlicher als er sein muss.
Kommen wir zu deinem eigentlichen Problem:
Zitat von
mimi:
Delphi-Quellcode:
if Obj.Count > 0 then
begin
for i := 0 to Obj.Count - 1 do
begin
if assigned(TFigure(obj.Items[i]).Style.obj1) then
begin
// Prüfen ob überhaupt was in der Liste steht!
if TFigure(obj.Items[i]).Style.obj1.Count > 0 then
begin
// Zählvariablen sollten einheitlich mit i, j, k, ... benannt werden
for x := 0 to TFigure(obj.Items[i]).Style.obj1.Count - 1 do
begin
// prüfen ob an der Stelle überhaupt etwas steht
if assigned(TFigure(Obj[i]).Style.obj1.Items[x]) then
begin
TFigure(TFigure(Obj[i]).Style.obj1.Items[x]).draw(bmp);
end; // if assigned(TFigure(Obj[i]).Style.obj1.Items[x])
end; // for x := 0 to TFigure(obj.Items[i]).Style.obj1.Count - 1
end; // if TFigure(obj.Items[i]).Style.obj1.Count > 0
end; // for i := 0 to Obj.Count - 1
end; // if Obj.Count > 0
Ist trotz allem nicht gerade der schönste Code. Besser ist es, wenn du wirklich getrennte Container und normale Objekte hast. Dann kannst du wirklich das Bewegen automatisieren und hast nicht mehr diese doppelten Casts wie hier. An sich solltest du immer schauen, ob eine Liste zugewiesen ist (assigned(deinObjekt)) und ob sie auch mindestens 1 Element enthält (deinObjekt.Count > 0). Bevor du castest kannst du natürlich auch schauen ob das Element überhaupt vom richtigen Typ ist (deinObjekt is TDeineKlasse). Natürlich musst du das immer nur dann machen, wenn es nicht sichergestellt wird. Hast du also eine Methode, die öffentlich ist oder irgendwie Argumente von "aussen" bekommt, so solltest du solche Tests immer einbauen. Alles was von "aussen" (ausserhalb deiner Klasse) kommt, kann alles beinhalten. Arbeitest du nur mit selbst in der Klasse Erzeugtem, kannst du hier natürlich gewisse Bedingungen garantieren. Damit kannst du dann Prüfungen wegfallen lassen (musst es aber nicht).
Vorteile liegen dann wirklich darin, dass du diese Klassen (die immer die Eingabe prüfen) auch woanders weiter verwenden kannst.