AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anfängerfrage: TMetafileCanvas.Create

Ein Thema von HJay · begonnen am 7. Dez 2009 · letzter Beitrag vom 14. Dez 2009
Antwort Antwort
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

Anfängerfrage: TMetafileCanvas.Create

  Alt 7. Dez 2009, 14:53
Hallo! Ich habe eine Anfängerfrage zur Logik hinter der Erzeugung von Metafile-Objekten. Ich verstehe einfach die Syntax und die Logik hinter dem Aufruf nicht.

Delphi-Quellcode:
procedure MyDraw;
  var MetaGraphic : TMetafile;
begin
  MetaGraphic := TMetafile.Create;
  with TMetafileCanvas.Create(MetaGraphic, 0) do begin
    LineTo(10, 10); // beliebige Zeichenoperationen...
    Free; // "erzeugt" das fertige MetaGraphic-Objekt (?)
  end;
  MyCanvas.Draw(0, 0, MetaGraphic); // MetaGraphic enthält jetzt die Zeichenoperationen
  MetaGraphic.Free;
end;
Wieso kann man "with" auf ein Klassenobjekt anwenden, ohne dass es instantiiert wurde? TMetafileCanvas.Create ist auch keine Funktion, sondern Prozedur. Auf welches Objekt wird "with" hier angewendet? Ich gebe zu, ich habe wahrscheinlich was grundlegendes nicht verstanden, aber ich würde es gerne verstehen...

Jetzt noch die zentrale, praktische Frage, die mich eigentlich dazu gebracht hat: Wie könnte man die obige Prozedur OHNE Verwendung von "with" schreiben? Ich möchte nämlich eigentlich innerhalb der with-Klausel eine Prozedur mehrfach aufrufen und weiß nicht, wie ich innerhalb der Unterprozedur auf das TMetafileCanvas-Objekt zugreifen könnte:

Delphi-Quellcode:
procedure MyDraw;
  var MetaGraphic : TMetafile;
      A : Integer;

  procedure DrawSomething(Angle:Integer);
  begin
    // hier sollen etliche Zeichenoperationen stehen, als ob sie unter "with" stehen würden
    LineTo(10, 10);
  end;

begin
  MetaGraphic := TMetafile.Create;
  with TMetafileCanvas.Create(MetaGraphic, 0) do begin
    for A := 0 to 90 do DrawSomething(A);
    Free;
  end;
  MyCanvas.Draw(0, 0, MetaGraphic);
  MetaGraphic.Free;
end;
Ich wäre sehr dankbar für Erklärung und Lösung!
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Anfängerfrage: TMetafileCanvas.Create

  Alt 7. Dez 2009, 15:11
Du kannst doch ein Objekt des Typs "TMetaFileCanvas" per Hand erzeugen und anschließend wieder freigeben. Mach es doch einfach so:

Delphi-Quellcode:
procedure MyDraw;
  var MetaGraphic : TMetafile;
      MetaCanvas : TMetafileCanvas; // <-- hier
      A : Integer;

  procedure DrawSomething(Angle:Integer);
  begin
    // hier sollen etliche Zeichenoperationen stehen, als ob sie unter "with" stehen würden
    MetaCanvas.LineTo(10, 10); // <-- hier noch ein "MetaCanvas" davor
  end;

begin
  MetaGraphic := TMetafile.Create;
  //
  // lieber noch in einen try-finally-Block packen
  //
  try
    MetaCanvas := TMetafileCanvas.Create(MetaGraphic, 0);
    //
    try
      for A := 0 to 90 do DrawSomething(A);
      //
      MyCanvas.Draw(0, 0, MetaGraphic);
    finally
      MetaCanvas.Free;
    end;
  finally
    MetaGraphic.Free;
  end;
end;
Hoffe, das hilft dir schonmal weiter.

MFG
Patti

PS: Willkommen in der DP
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#3

Re: Anfängerfrage: TMetafileCanvas.Create

  Alt 7. Dez 2009, 20:27
Vielen Dank, Patti, das hat sehr weitergeholfen. Wenn man das so sieht, sieht es auch ganz einfach und logisch aus. Mich hatte diese "with"-Konstruktion doch sehr verwirrt.

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

Re: Anfängerfrage: TMetafileCanvas.Create

  Alt 7. Dez 2009, 20:32
das With legt die übergebene Variable als aktuellen Namespace fest
und hier wurde auch noch eine temporäre Variable genutzt.

es ist also so, daß alle Funktionen/Namen erstmal in diesem Namespace gesucht werden
Delphi-Quellcode:
with TMetafileCanvas.Create(MetaGraphic, 0) do begin
  for A := 0 to 90 do DrawSomething(A);
  Free;
end;
Delphi-Quellcode:
var MC: TMetafileCanvas;

MC := TMetafileCanvas.Create(MetaGraphic, 0)
with MC do begin
  for A := 0 to 90 do {MC.}DrawSomething(A);
  {MC.}Free;
end;
Delphi-Quellcode:
var MC: TMetafileCanvas;

MC := TMetafileCanvas.Create(MetaGraphic, 0)
for A := 0 to 90 do MC.DrawSomething(A);
MC.Free;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Anfängerfrage: TMetafileCanvas.Create

  Alt 7. Dez 2009, 20:36
Zitat von HJay:
Vielen Dank, Patti, das hat sehr weitergeholfen. Wenn man das so sieht, sieht es auch ganz einfach und logisch aus. Mich hatte diese "with"-Konstruktion doch sehr verwirrt.

Danke!
Diese "with"-Konstruktionen sind auch nicht sonderlich beliebt, da nicht wirklich übersichtlich etc.. Habe schon von Unternehmen gehört, die ihren Mitarbeitern "verboten" haben, diese zu benutzen. Auf der anderen Seite sind sie aber auch ganz nützlich. Wo ich sie relativ häufig einsetze, ist tatsächlich bei Zeichen-Aktionen auf einer Canvas, also z.B.

Delphi-Quellcode:
with Self.Canvas do
begin
  Pen.Color := clBlack;
  // usw...
end;
Ich denke, dass es letztlich Geschmackssache ist, ob man sie nutzt oder eben nicht.

Patti
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

Re: Anfängerfrage: TMetafileCanvas.Create

  Alt 7. Dez 2009, 20:53
Ja, mit With kann man praktisch Code kürzen, aber da sollte man aufpassen, das der Namespace nicht andere Befehle im einbeschlossenen Code verändert ... z.B. bei gleichnamigen Funktionen und Co.

z.B. kann man sich bei sowas eben auch mal 'ne Variable sparen, aber try-finally sollte auch mit rein
Delphi-Quellcode:
with TMetafileCanvas.Create(MetaGraphic, 0) do
  try
    for A := 0 to 90 do DrawSomething(A);
  finally
    Free;
  end;
nutze ichgern mal für INIs oder kleine Formulare via ShowModal
Delphi-Quellcode:
with TMyOprionDialog.Create(Self) do
  try
    ...
    // Variablen/Property befüllen
    ...
    if ShowModal = mrOK then begin
      ...
      // Rückgabewerte verarbeiten
      ...
    end;
  finally
    Free;
  end;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#7

Re: Anfängerfrage: TMetafileCanvas.Create

  Alt 14. Dez 2009, 13:58
Nochmal vielen Dank für Eure Kommentare. Ich habe die With-Konstruktion jetzt verstanden, aber finde sie immer noch etwas gewöhnungsbedürftig. Ich habe aber gelernt, dass das Create einer Methode eben doch wie eine Funktion funktioniert und ein Result des eigenen Methodentyps zurückgibt. Es beruhigt ein wenig, dass auch erfahrene Programmierer die Konstruktion beachten müssen. Ab jetzt kenne ich sie und werde sie trotzdem versuchen zu vermeiden...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 Uhr.
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