![]() |
Delphi-Version: 10 Seattle
Populate Array of procedure of object
(1) So wie ich MyArr = TArray<TFrame>; in einer Zeile populiere
Code:
wuerde ich gerne
MyArr := TArray<TFrame>.Create(Chiecho, Bingo, Bongo);
Code:
in einer Zeile populieren. Gibt es dazu eine Syntax?
TQuinoaSalate = Array of TQuinoaSalat;
(2) Im gleichen Milieu haenge ich gerade mit
Code:
Inkompatible Typen: 'TUpdateProcedure' und 'procedure, untyped pointer or untyped parameter'
TUpdateProcedure = Procedure of Object;
TUpdateProcedures = TArray<TUpdateProcedure>; [...] private UpdateViewProcedures: TUpdateProcedures; [...] procedure TReloAdapter.UpdateView001; procedure TReloAdapter.UpdateView002; [...] UpdateViewProcedures := TArray<TUpdateProcedure>.Create(UpdateView001, UpdateView002); Irgendwie krieg' ich es gerade nicht elegant hinjongliert. Fatal waere natuerlich, die Eintrage alle a la TUpdateProcedures[0] := UpdateView001; fuellen zu muessen... Gibt's da was von RatioPharm? |
AW: Populate Array of procedure of object
Das Problem ist, dass
Delphi-Quellcode:
nicht gleich
procedure of Object
Delphi-Quellcode:
ist. Letzteres ist ein einfacher Funktions-Zeiger, während Ersteres ein Methodenzeiger ist, welcher an eine Instanz gebunden ist. Habe grade leider kein Delphi zum Testen zu Hand, aber probier es mal mit
procedure
Delphi-Quellcode:
, etc. Also mit einer konkreten Objektinstanz.
RelodAdapterInstance.UpdateView1
|
AW: Populate Array of procedure of object
Minimalbeispiel:
Delphi-Quellcode:
type
TMyClass = class public procedure p(); virtual; abstract; end; type TUpdateProcedure = procedure of object; TUpdateProcedures = TArray<TUpdateProcedure>; var updateProcedures: TUpdateProcedures; instance: TMyClass; begin // updateProcedures := TUpdateProcedures.Create(nil); // << F2084 Interner Fehler: C2477 // updateProcedures := [nil]; // << F2084 Interner Fehler: C2477 updateProcedures := TUpdateProcedures.Create(); // geht updateProcedures := []; // geht //updateProcedures := TUpdateProcedures.Create(instance.p); // E2010 Inkompatible Typen: 'TUpdateProcedure' und 'procedure, untyped pointer or untyped parameter' //updateProcedures := [instance.p]; // E2010 Inkompatible Typen: 'TUpdateProcedure' und 'procedure, untyped pointer or untyped parameter' end. |
AW: Populate Array of procedure of object
Vielen Dank fuer Eure Antworten.
Zitat:
Zitat:
Delphi-Quellcode:
'TUpdateProcedure' und 'procedure, untyped pointer or untyped parameter'
updateProcedures := TUpdateProcedures.Create(); // geht
updateProcedures := [UpdateView001, UpdateView002]; // geht nicht Vielleicht liegt mein Fehler in der Struktur, deshalb nochmal vollstaendiger:
Delphi-Quellcode:
type
TUpdateProcedure = Procedure of object; TUpdateProcedures = TArray<TUpdateProcedure>; TReloAdapter = class(TInterfacedObject, IModelUpdater) private UpdateViewProcedures: TUpdateProcedures; procedure UpdateView001; procedure UpdateView002; public constructor Create; end; var ReloAdapter: TReloAdapter; implementation constructor TReloAdapter.Create; begin UpdateViewProcedures := TUpdateProcedures.Create(); // geht UpdateViewProcedures := [UpdateView001, UpdateView002]; // geht nicht end; |
AW: Populate Array of procedure of object
Das war auch kein Lösungsvorschlag, ich wollte nur dass Leute die schlauer sind als wir auf den ersten Blick sehen wo der Compiler noch mitmacht und wo er aussteigt.
Warum er damit ein Problem hat weiß ich ehrlich gesagt auch nicht. |
AW: Populate Array of procedure of object
Workaround:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Generics.Collections; type TUpdateProcedure = procedure of object; TUpdateProcedures = TArray<TUpdateProcedure>; IModelUpdater = interface ['{DB8D4B0F-31EA-4A93-AA06-E49FFA71BA47}'] end; TReloAdapter = class(TInterfacedObject, IModelUpdater) private UpdateViewProcedures: TUpdateProcedures; procedure UpdateView001; procedure UpdateView002; public constructor Create; end; var ReloAdapter: TReloAdapter; constructor TReloAdapter.Create; var UpdateProcedureList: TList<TUpdateProcedure>; begin UpdateProcedureList:= TList<TUpdateProcedure>.Create(); UpdateProcedureList.AddRange([UpdateView001, UpdateView002]); UpdateViewProcedures := UpdateProcedureList.ToArray; UpdateProcedureList.Free; end; procedure TReloAdapter.UpdateView001; begin end; procedure TReloAdapter.UpdateView002; begin end; begin try ReloAdapter := TReloAdapter.Create; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
AW: Populate Array of procedure of object
Zitat:
|
AW: Populate Array of procedure of object
Nach dem Workaround kommt die Lösung:
Delphi-Quellcode:
type
TMaker<T> = class class function MakeArray(const AArray: array of T): TArray<T>; end; class function TMaker<T>.MakeArray(const AArray: array of T): TArray<T>; begin SetLength(Result, Length(AArray)); TArray.Copy<T>(AArray, Result, Low(AArray), Low(Result), Length(AArray)); end; constructor TReloAdapter.Create; begin UpdateViewProcedures := TMaker<TUpdateProcedure>.MakeArray([UpdateView001, UpdateView002]); end; |
AW: Populate Array of procedure of object
Zitat:
Aber mal im Ernst, sollte das nicht grundsaetzlich in 'System' oder so mit aufgenommen werden, anstatt dass die User sich da mega einen abtricksen muessen? |
AW: Populate Array of procedure of object
Zitat:
Aber allein schon das array of T und TArray<T> nicht miteinander kompatibel sind, ist ja schon ein Unding. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 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