![]() |
Delphi-Version: 10.2 Tokyo
Record als Prozedurparameter: Werte direkt übergeben
Ahoi,
ich habe eine Prozedur mit einem Record als Parameter. Ist es möglich, im Prozeduraufruf die Felder des Records direkt anzugeben. Etwa so wie unten exemplarisch gezeigt?
Delphi-Quellcode:
type
TMyRecord = record FeldA: string; FeldB: Integer; FeldC: string; end; {...} procedure Test(Param: TMyRecord); begin {...} end; procedure Produce; begin Test(['Foo', 1, 'Bar']); end; |
AW: Record als Prozedurparameter: Werte direkt übergeben
Da ich neugierig bin, ob sowas einfach geht, habe ich Google bemüht und
![]() Macht einen ziemlich vollständigen Eindruck, wie man das realisieren kann. |
AW: Record als Prozedurparameter: Werte direkt übergeben
Zitat:
Ich baue für sowas meist eine class function in den Record, die ermöglicht:
Delphi-Quellcode:
TMyRecord = record
FeldA: string; FeldB: Integer; FeldC: string; class function Init(const AFieldA: String; AFieldB: Integer; AFieldC: String): TMyRecord ; static; end; class function TMyRecord.Init(const AFieldA: String; AFieldB: Integer; AFieldC: String): TMyRecord ; begin Result.FeldA:= AFieldA Result.FeldB:= AFieldB Result.FeldC:= AFieldC end; procedure Produce; begin Test(TMyRecord.Init('Foo', 1, 'Bar')); end; |
AW: Record als Prozedurparameter: Werte direkt übergeben
Dumme Frage: Macht es praktisch einen Unterschied ob man dem Record nun eine
Delphi-Quellcode:
oder einen
static class function Init(..)
Delphi-Quellcode:
gibt?
constructor Create(..)
|
AW: Record als Prozedurparameter: Werte direkt übergeben
Zitat:
|
AW: Record als Prozedurparameter: Werte direkt übergeben
Ich mag das TPoint Beispiel.
Delphi-Quellcode:
type
TPoint = record X,Y integer end; function Point( X, Y : integer ) : TPoint; begin Result.X := X; Result.Y := Y; end; |
AW: Record als Prozedurparameter: Werte direkt übergeben
Zitat:
|
AW: Record als Prozedurparameter: Werte direkt übergeben
Zitat:
|
AW: Record als Prozedurparameter: Werte direkt übergeben
Zitat:
Delphi-Quellcode:
program Project5;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; type TMyRecord2 = record FeldB: Integer; class function Init(AFieldB: Integer): TMyRecord2; static; end; TMyRecord = record FeldB: Integer; constructor Create(AFieldB: Integer); end; { TMyRecord } constructor TMyRecord.Create(AFieldB: Integer); begin FeldB := AFieldB; end; { TMyRecord2 } class function TMyRecord2.Init(AFieldB: Integer): TMyRecord2; begin Result.FeldB := AFieldB; end; var MyRecord: TMyRecord; MyRecord2: TMyRecord2; begin MyRecord := TMyRecord.Create(123); MyRecord2 := TMyRecord2.Init(123); end. Ergibt für die beiden Zuweisungen folgenden Assembler-Code:
Code:
Project5.dpr.41: MyRecord := TMyRecord.Create(123);
0041C554 8D45EC lea eax,[ebp-$14] 0041C557 BA7B000000 mov edx,$0000007b 0041C55C E873D7FFFF call TMyRecord.Create 0041C561 8B45EC mov eax,[ebp-$14] 0041C564 A3B8484200 mov [$004248b8],eax Project5.dpr.42: MyRecord2 := TMyRecord2.Init(123); 0041C569 B87B000000 mov eax,$0000007b 0041C56E E87DD7FFFF call TMyRecord2.Init 0041C573 A3BC484200 mov [$004248bc],eax
Code:
Project5.dpr.25: begin
00419CD4 55 push ebp 00419CD5 8BEC mov ebp,esp 00419CD7 83C4F8 add esp,-$08 00419CDA 8955F8 mov [ebp-$08],edx 00419CDD 8945FC mov [ebp-$04],eax Project5.dpr.26: FeldB := AFieldB; // Zuweisung im Create 00419CE0 8B45FC mov eax,[ebp-$04] 00419CE3 8B55F8 mov edx,[ebp-$08] 00419CE6 8910 mov [eax],edx Project5.dpr.27: end; 00419CE8 8B45FC mov eax,[ebp-$04] 00419CEB 59 pop ecx 00419CEC 59 pop ecx 00419CED 5D pop ebp 00419CEE C3 ret 00419CEF 90 nop Project5.dpr.32: begin 00419CF0 55 push ebp 00419CF1 8BEC mov ebp,esp 00419CF3 83C4F8 add esp,-$08 00419CF6 8945FC mov [ebp-$04],eax Project5.dpr.33: Result.FeldB := AFieldB; // Zuweisung im Init 00419CF9 8B45FC mov eax,[ebp-$04] 00419CFC 8945F8 mov [ebp-$08],eax Project5.dpr.34: end; 00419CFF 8B45F8 mov eax,[ebp-$08] 00419D02 59 pop ecx 00419D03 59 pop ecx 00419D04 5D pop ebp 00419D05 C3 ret 00419D06 8BC0 mov eax,eax |
AW: Record als Prozedurparameter: Werte direkt übergeben
Zitat:
Parameterlose Static Class Functions gehen aber schon. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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 by Thomas Breitkreuz