Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Hilfe mit Canvas? (https://www.delphipraxis.net/180425-hilfe-mit-canvas.html)

nisemono 19. Mai 2014 15:37

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. :)

DeddyH 19. Mai 2014 15:42

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;

baumina 19. Mai 2014 15:44

AW: Hilfe mit Canvas?
 
Mit einer with-Anweisung.

Gollum 19. Mai 2014 18:14

AW: Hilfe mit Canvas?
 
Hallo,

evtl. so?

Delphi-Quellcode:
var derCanvas:TCanvas;
...
...
derCanvas:=Image1.Canvas;
derCanvas.MoveTo(1, 1);
...

Medium 20. Mai 2014 00:32

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

BUG 20. Mai 2014 01:02

AW: Hilfe mit Canvas?
 
Zitat:

Zitat von Medium (Beitrag 1259446)
Lieber immer die ganze Litanei voll ausschreiben.

DRY :shock:
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.

himitsu 20. Mai 2014 03:18

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:
Self.
davor schreiben, nur um auf Nummer sicher zu gehn?

Beispiel:
Delphi-Quellcode:
with R do Height := Bottom - Top;


Gemeint war ja ein
Delphi-Quellcode:
Self.Height := R.Bottom - R.Top;
, aber seit "kurzem" macht Delphi da plötzlich ein
Delphi-Quellcode:
R.Height := R.Bottom - R.Top;
daraus,
da das Rect nun eine Height.Methode besitzt, womit man nun auch
Delphi-Quellcode:
Height := R.Height;
schreiben könnte, was einem
Delphi-Quellcode:
Height := CalcHeight(R);
entspricht.

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)

Sir Rufo 20. Mai 2014 06:56

AW: Hilfe mit Canvas?
 
Die beste Alternative ist eigentlich wiederverwendbaren Code zu schreiben:
Delphi-Quellcode:
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;
und selbiges mit
Delphi-Quellcode:
Foo( Image1.Canvas, X, Y );
aufzurufen ;)

Medium 20. Mai 2014 08:24

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!

DeddyH 20. Mai 2014 08:35

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz