Delphi-PRAXiS

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.

Sir Rufo 20. Mai 2014 08:48

AW: Hilfe mit Canvas?
 
Zitat:

Zitat von DeddyH (Beitrag 1259468)
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.

Ein Großteil des Lebens besteht doch daraus einer Versuchung zu widerstehen :mrgreen:

Darum schreiben wir ja auch immer kurze und knackige Methoden und schon wird die Versuchung immer geringer ;)

DeddyH 20. Mai 2014 08:58

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.

nachti1505 20. Mai 2014 09:01

AW: Hilfe mit Canvas?
 
So richtig passt das hier nicht her - aber wie werden Namenskollisionen im with eigentlich aufgelöst?

Delphi-Quellcode:
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;
Was wird aufgerufen? Mein Tipp wäre doSomething von TBar?

Sir Rufo 20. Mai 2014 09:03

AW: Hilfe mit Canvas?
 
Zitat:

Zitat von DeddyH (Beitrag 1259472)
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.

Ich habe es mir mittlerweile angewöhnt immer dann auszulagern, wenn unterschiedliche Aspekte behandelt werden.
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

DeddyH 20. Mai 2014 09:05

AW: Hilfe mit Canvas?
 
Zitat:

Zitat von Sir Rufo (Beitrag 1259474)
Ich habe es mir mittlerweile angewöhnt immer dann auszulagern, wenn unterschiedliche Aspekte behandelt werden.

Stimmt, den Fall vergaß ich zu erwähnen.

Sir Rufo 20. Mai 2014 09:07

AW: Hilfe mit Canvas?
 
Zitat:

Zitat von DeddyH (Beitrag 1259475)
Zitat:

Zitat von Sir Rufo (Beitrag 1259474)
Ich habe es mir mittlerweile angewöhnt immer dann auszulagern, wenn unterschiedliche Aspekte behandelt werden.

Stimmt, den Fall vergaß ich zu erwähnen.

Die größte Schwierigkeit ist dabei eigentlich nicht das Auslagern, sondern eine schlüssige Benennung der Methode :D

DeddyH 20. Mai 2014 09:10

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