![]() |
Hilfe mit Canvas?
Hey
ich kenn mich mit Delphi gar nicht gut aus muss aber eine Aufgabe erfüllen mit der Aufgabe: Wie kann mann erreichen, dann man beim Erstellen von Quelltexten für eine Eigenschaft Canvas nicht jedesmal Image1.Canvas vor die einzelnen Methoden oder Eigenschaften von Canvas schreiben muss? Wäre nett wenn ihr mir helfen könntet. :) |
AW: Hilfe mit Canvas?
Auch wenn es mir fast körperliche Schmerzen verursacht:
Delphi-Quellcode:
with Image1.Canvas do
begin MoveTo(X, Y); LineTo(X + 200, Y + 100); RectAngle(10, 10, 150, 200); end; |
AW: Hilfe mit Canvas?
Mit einer
![]() |
AW: Hilfe mit Canvas?
Hallo,
evtl. so?
Delphi-Quellcode:
var derCanvas:TCanvas;
... ... derCanvas:=Image1.Canvas; derCanvas.MoveTo(1, 1); ... |
AW: Hilfe mit Canvas?
Wenn du dir damit "nur" Schreibarbeit ersparen willst, und dies nicht Teil einer Aufgabe ist, muss man dir davon dringend abraten dir das anzugewöhnen. Allen voran die Nutzung des "with" - DeddyH hat da nicht umsonst Schmerzen. Die Gründe einem Anfänger so zu erklären, dass es nicht mehr Fragen aufwirft als nötig ist dürfte schwierig werden, zumal es anfangs erstmal prima funktioniert. Deswegen soll hier erstmal ein "tu's lieber nicht" genügen. Ansonsten gibt es hier im Forum schon mehr als genug gut findbare Diskussionen zu dem Thema.
Gollums Vorschlag birgt nicht die potenziellen technischen Fallen von "with", jedoch trifft auch hier ein weiterer Aspekt zu, der auch "with" betrifft: Die Lesbarkeit leidet unter solchen Verkürzungen immens. Das mag für kleine Programme am Anfang völlig übertrieben klingen, aber spätestens wenn jemand anders oder gar man selbst nach ein paar Wochen erst Stunden suchen muss um zu verstehen was man da gemacht hat (Kommentare im Quellcode sind da auch keine gute Lösung), wird man seine eigene Faulheit doppelt und dreifach bezahlen. Lieber immer die ganze Litanei voll ausschreiben. Kleiner Tipp: "Image1.Canvas" schreiben, markieren, Strg-C, und von da an jede solche Zeile mit "Strg-V" gefolgt von einem "." beginnen. (Den Punkt schreibe ich immer gerne von Hand, da dann die Codevervollständigung aufklappt und man noch mehr Tippen sparen kann.) |
AW: Hilfe mit Canvas?
Zitat:
Ich finde Gollums Variante schon deutlich lesbarer und wartbarer als alles dutzendfach zu wiederholen, insbesondere bei längeren Call-Chains. Im Allgemeinen gehe ich ein Schritt weiter und lagere ich solchen Code in eine Funktion/Methode aus. Damit ist der Code schön kurz und kann dann nach Belieben auf jedes Canvas angewendet werden, welches als Argument übergeben wird. |
AW: Hilfe mit Canvas?
Mit dem WITH muß man halt wissen was man macht, denn das kann auch nachteile haben, da es den Namespace verschiebt und man darin dann andere Methoden bekommt, als man es gewohnt ist.
Oder wer will im WITH denn überall das
Delphi-Quellcode:
davor schreiben, nur um auf Nummer sicher zu gehn?
Self.
Beispiel:
Delphi-Quellcode:
with R do Height := Bottom - Top;
Gemeint war ja ein
Delphi-Quellcode:
, aber seit "kurzem" macht Delphi da plötzlich ein
Self.Height := R.Bottom - R.Top;
Delphi-Quellcode:
daraus,
R.Height := R.Bottom - R.Top;
da das Rect nun eine Height.Methode besitzt, womit man nun auch
Delphi-Quellcode:
schreiben könnte, was einem
Height := R.Height;
Delphi-Quellcode:
entspricht.
Height := CalcHeight(R);
Wenn sich also der Typ im WITH "weiterentwickelt" und es dadurch zu Namenskonflikten kommt, dann hat man den Salat, wenn man das vorher nicht bedacht hat, bzw. wenn man es nicht immer wieder überpüft, nach Austausch/Upgrade der entsprechenden Bibliotheken. Fazit: Solange man, bei dem gezeigten Code, davon ausgehen kann, daß ein TCanvas in Zukunft kein X oder Y enthält, dann ist alles gut. Oder man nimmt halt die Variante von Gollumn/BUG. (Ob nun lokale Variable oder Parameter ... ist am Ende das Selbe) |
AW: Hilfe mit Canvas?
Die beste Alternative ist eigentlich wiederverwendbaren Code zu schreiben:
Delphi-Quellcode:
und selbiges mit
procedure Foo( ACanvas : TCanvas; X, Y : Integer );
begin ACanvas.MoveTo(X, Y); ACanvas.LineTo(X + 200, Y + 100); ACanvas.RectAngle(10, 10, 150, 200); end;
Delphi-Quellcode:
aufzurufen ;)
Foo( Image1.Canvas, X, Y );
|
AW: Hilfe mit Canvas?
Gegen eine Methode mit einem Canvas als Parameter ist nichts einzuwenden, das ist wunderbar selbstdokumentierend (wenn man gescheite Methodennamen nutzt), und sicherlich die beste Lösung von allen. Da stimme ich zu!
|
AW: Hilfe mit Canvas?
Wobei man dann innerhalb der Funktion auch wieder zig mal "ACanvas." schreibt. Hier könnte man wieder in Versuchung kommen, with zu benutzen, was die potentiellen Probleme eigentlich nur verlagert.
|
AW: Hilfe mit Canvas?
Zitat:
Darum schreiben wir ja auch immer kurze und knackige Methoden und schon wird die Versuchung immer geringer ;) |
AW: Hilfe mit Canvas?
Die Verwendung der Zwischenablage reduziert die Versuchung noch einmal deutlich ;). Ich selbst lagere Code-Teile, die nur einmalig verwendet werden, eigentlich nur dann aus, wenn die enthaltende Routine nicht mehr in Gänze auf meinen Bildschirm passt, oder wenn evtl. die Möglichkeit besteht, dass sie später doch noch einmal woanders gebraucht werden könnten.
|
AW: Hilfe mit Canvas?
So richtig passt das hier nicht her - aber wie werden Namenskollisionen im with eigentlich aufgelöst?
Delphi-Quellcode:
Was wird aufgerufen? Mein Tipp wäre doSomething von TBar?
TFoo = class
property Foo2: TFoo2; procedure DoSomething; end; TFoo2 = class property Bar: TBar; procedure DoSomething; end; TBar = class procedure DoSomething; end; Foo: TFoo; with Foo do with Foo2 do with Bar do DoSomething; |
AW: Hilfe mit Canvas?
Zitat:
Dadurch spare ich mir auch eine Menge Kommentare und die Anzahl der verwendeten lokalen Variablen verringert sich zwar nicht in der Summe, aber pro Methode. @nachti1505 Ja, immer der am nächsten liegende Scope. Wenn nicht in Bar, dann in Foo2, wenn da auch nicht dann in Foo |
AW: Hilfe mit Canvas?
Zitat:
|
AW: Hilfe mit Canvas?
Zitat:
|
AW: Hilfe mit Canvas?
Och, einfach "Bar" nehmen und durchnummerieren :mrgreen: Aber wir entfernen uns jetzt ziemlich vom Thema (obwohl der Threadtitel mit der Problembeschreibung ohnehin nichts zu tun hatte).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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