Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Procedur verstehen (https://www.delphipraxis.net/201221-procedur-verstehen.html)

paul.kunig 2. Jul 2019 19:28

Delphi-Version: 5

Procedur verstehen
 
Hallo Leute,

in Delphi 10 gibt es folgende Prozedur:
Code:
procedure TForm1.Layout1Paint(Sender: TObject; Canvas: TCanvas;
  const [Ref] ARect: TRectF);
begin

 
end;
Es handelt sich dabei um ein Ereignis einer Komponente.

Kann mir bitte einer diese Prozedur erläutern, genauer gesagt die Parameter.
Sender ist klar. Canvas ist klar.

Was zum Kuckuck bedeutet
Code:
const [REF]
Was bedeutet [REF], vielleicht Referenz?
Wäre etwas merkwürdig, eine konstante Referenz!

Gruß

hoika 2. Jul 2019 19:36

AW: Procedur verstehen
 
Hallo,
kurze Google-Suche

http://docwiki.embarcadero.com/RADSt...ameter_(Delphi)

Dort nach [Ref] suchen und wundern/bewundern ;)

paul.kunig 2. Jul 2019 19:43

AW: Procedur verstehen
 
Danke für deine Mühe und den sehr hilfreichen Link. Sehr Interessant.

Damit alle etwas davon haben füge ich den Inhalt des Links hier 1 zu 1 ein:

Parameter (Delphi
Diese Seite enthält momentan noch keinen Text und du bist auch nicht dazu berechtigt, diese Seite zu erstellen. Du kannst ihren Titel auf anderen Seiten suchen oder die zugehörigen Logbücher betrachten.

Eine Erklärung wäre noch immer hilfreich!

Gruß

DieDolly 2. Jul 2019 19:45

AW: Procedur verstehen
 
Nimm das [ref] einfach weg. Ich kann mir nicht vorstellen, dass das dahin gehört.

https://pascal.today/2016/08/17/cons...-vs-non-const/
Zitat:

Const

The const parameters are almost the same as standard parameters, but have some differences. It is not allowed to set the value to the const parameter inside of the function/procedure either pass it as a var/out parameter to other routines. The const parameters are passed by value (simple types) or by reference (string, fixed array, dynamic arrays and records. However this depends on the size of the parameter. If the size of the parameter is bigger than a certain amount of bytes then it is passed by reference instead) but without copy on write – remember, those are marked read-only and we cannot assign values to them or pass them to var parameters of other routines. You can specify [Ref] before the parameter to force the compiler to pass the value by reference – so it will be the same as var parameter except that the routine cannot modify the value directly via assignment. But be warned that const [Ref] parameters cannot be captured by the anonymous methods (lambdas) – as it is with “Result” in functions.

Heuman 2. Jul 2019 19:52

AW: Procedur verstehen
 
hallo,

vieleicht hilft dies (Laut Link #2)

Konstantenparameter

Ein Konstantenparameter (const) entspricht einer lokalen bzw. schreibgeschützten Variable. Konstantenparameter entsprechen weitgehend Wertparametern. Sie können ihnen jedoch im Rumpf einer Prozedur oder Funktion keinen Wert zuweisen und sie nicht als var-Parameter an eine andere Routine übergeben. Wenn Sie aber eine Objektreferenz als Konstantenparameter übergeben, können Sie weiterhin auf die Objekteigenschaften zugreifen und diese ändern.

Die Verwendung von const ermöglicht dem Compiler die Optimierung des Codes für strukturierte und String-Parameter. Gleichzeitig wird die versehentliche Übergabe eines Parameters als Referenz an eine andere Routine verhindert.

Das folgende Beispiel ist der Header der Funktion CompareStr in der Unit SysUtils:

function CompareStr(const S1, S2: string): Integer;

Da S1 und S2 im Rumpf von CompareStr nicht geändert werden, können sie als Konstantenparameter deklariert werden.

Konstantenparameter können je nach verwendetem Compiler an die Funktion per Wert oder per Referenz übergeben werden. Um den Compiler zu veranlassen, einen Konstantenparameter per Referenz zu übergeben, können Sie den Dekorator [Ref] mit dem Schlüsselwort const verwenden.

Das folgende Beispiel zeigt, wie Sie den Dekorator [Ref] entweder vor oder nach dem Schlüsselwort const angeben können:

function FunctionName(const [Ref] parameter1: Class1Name; [Ref] const parameter2: Class2Name);

Gruß

paul.kunig 2. Jul 2019 20:05

AW: Procedur verstehen
 
Danke DieDolly,

o.k. Verstanden. Ab einer bestimmten Größe wird der Wert als Referenz übergeben.
Das hätte mir als Antwort schon gereicht.

Was du mit wegnehmen meinst ist mir allerdings nicht klar.

Nächstes Problem:
Der übergebene Wert wird in der Prozedur ignoriert.

Ich rufe DoPaint auf und übergebe als Parameter ein Canvas und ein Rect.
Dennoch enthält ARect aus der oben genannten Procedure nicht die übergebenen Werte(Maße), sonder die Werte(Maße) der bereitstellenden Komponente, in diesem Fall der Komponente Layout1.

Jemand eine Idee, aus welchem Grund der an ARect übergebene Wert nicht übernommen wird?

Gruß

paul.kunig 2. Jul 2019 20:07

AW: Procedur verstehen
 
Danke Heuman

paul.kunig 2. Jul 2019 21:21

AW: Procedur verstehen
 
Die Frage warum der Wert nicht übergeben wird, ist noch offen.
Nur falls jemand wegen des Dankes meint die Sache sei erledigt.

Weitere Frage:
Die
Delphi-Quellcode:
procedure TForm1.Layout1Paint(Sender: TObject; Canvas: TCanvas;
  const [Ref] ARect: TRectF);
erwartet als Parameter ein Canvas.

Erstelle ich in diesem onPaint-Ereignis ein Rechteck ohne vorher ein Canvas beim Aufruf der Prozedur zu übergeben, wird dennoch ein Rechteck gezeichnet.

Warum?

Gruß

p80286 2. Jul 2019 21:36

AW: Procedur verstehen
 
Zitat:

Zitat von paul.kunig (Beitrag 1435852)
Nächstes Problem:
Der übergebene Wert wird in der Prozedur ignoriert.

Jemand eine Idee, aus welchem Grund der an ARect übergebene Wert nicht übernommen wird?

Das ist vollkommen korrekt, da in ARef ein Verweis auf ein existierendes TRect übergeben wird, also kein Wert!

Gruß
K-H

ConnorMcLeod 3. Jul 2019 07:53

AW: Procedur verstehen
 
Zitat:

Zitat von paul.kunig (Beitrag 1435849)
Danke für deine Mühe und den sehr hilfreichen Link.

Mach in der Adreßzeile Deines Brausers die schließende Klammer dazu und drück die Eingabetaste ;-)

Jumpy 3. Jul 2019 09:08

AW: Procedur verstehen
 
Zitat:

Zitat von paul.kunig (Beitrag 1435856)
Die Frage warum der Wert nicht übergeben wird, ist noch offen.
Nur falls jemand wegen des Dankes meint die Sache sei erledigt.

Weitere Frage:
Die
Delphi-Quellcode:
procedure TForm1.Layout1Paint(Sender: TObject; Canvas: TCanvas;
  const [Ref] ARect: TRectF);
erwartet als Parameter ein Canvas.

Erstelle ich in diesem onPaint-Ereignis ein Rechteck ohne vorher ein Canvas beim Aufruf der Prozedur zu übergeben, wird dennoch ein Rechteck gezeichnet.

Warum?

Gruß

Das ist doch eine Event-Prozedur die automatisch feuert, wenn Layout1 (was auch immer das ist) neu gezeichnet wird. Sender, Canvas, ARect usw. werden dadurch doch automatisch übergeben (von dem das Event auslösenden Element). Du kannst dann anschließend mit den Dingen was machen, also dafür sorgen, dass das Element so gezeichnet wird, wie du willst.

paul.kunig 3. Jul 2019 10:56

AW: Procedur verstehen
 
Danke Jumpy,

hatte da wohl ein Brett vor dem Kopf. Du hast natürlich recht.
Allerdings stellt sich mir eine weitere Frage.
Warum wird hier ARect als Konstante angegeben, obwohl diese doch in der Routine geändert werden soll, kann, darf?

Danke auch an ConnorMcLeod

Gruß

peterbelow 3. Jul 2019 11:41

AW: Procedur verstehen
 
Zitat:

Zitat von paul.kunig (Beitrag 1435856)
Die Frage warum der Wert nicht übergeben wird, ist noch offen.
Nur falls jemand wegen des Dankes meint die Sache sei erledigt.

Weitere Frage:
Die
Delphi-Quellcode:
procedure TForm1.Layout1Paint(Sender: TObject; Canvas: TCanvas;
  const [Ref] ARect: TRectF);
erwartet als Parameter ein Canvas.

Erstelle ich in diesem onPaint-Ereignis ein Rechteck ohne vorher ein Canvas beim Aufruf der Prozedur zu übergeben, wird dennoch ein Rechteck gezeichnet.

Warum?

Gruß

Die Methode sieht aus wie ein von der IDE erzeugter Handler für einen onPaint Event (FMX?). Einen solchen Event ruft man nicht selbst auf, den ruft das Framework auf wenn das Control neu gezeichnet werden muss. Man kann das erzwingen, in dem man eine Methode des Controls (Invalidate, Update, Refresh, wie immer as auch in FMX heißt) aufruft. Der übergebene Canvas ist normalerweise der des Controls, aRect der Bereich auf dem Canvas, der neu gezeichnet werden muss.

paul.kunig 3. Jul 2019 11:52

AW: Procedur verstehen
 
Hallo peterbelow,

absolut richtig was du sagst.

Gruß

Jumpy 3. Jul 2019 13:22

AW: Procedur verstehen
 
Zitat:

Zitat von paul.kunig (Beitrag 1435895)
Warum wird hier ARect als Konstante angegeben, obwohl diese doch in der Routine geändert werden soll, kann, darf?

Das Objekt ARect (oder ist es nicht ein Record?) wird als const aber by Referenz übergeben. Du kannst dann in der Variable ARect nichts anderes reinpacken, also kein anderes Object/Record. Aber du kannst mit dem Object/Record das da drin ist schon was machen!

paul.kunig 3. Jul 2019 18:11

AW: Procedur verstehen
 
Hallo Jumpy,

ja, es ist ein Record.

Nun ja, ich nehme es mal so hin. Den Sinn dahinter verstehe ich noch immer nicht.

Danke für eure Mühe und Geduld.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:47 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