Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Populate Array of procedure of object (https://www.delphipraxis.net/195086-populate-array-procedure-object.html)

hzzm 31. Jan 2018 14:45

Delphi-Version: 10 Seattle

Populate Array of procedure of object
 
(1) So wie ich MyArr = TArray<TFrame>; in einer Zeile populiere
Code:
MyArr := TArray<TFrame>.Create(Chiecho, Bingo, Bongo);
wuerde ich gerne
Code:
TQuinoaSalate = Array of TQuinoaSalat;
in einer Zeile populieren. Gibt es dazu eine Syntax?


(2) Im gleichen Milieu haenge ich gerade mit
Code:
TUpdateProcedure = Procedure of Object;
TUpdateProcedures = TArray<TUpdateProcedure>;
[...]
private
  UpdateViewProcedures: TUpdateProcedures;
[...]
procedure TReloAdapter.UpdateView001;
procedure TReloAdapter.UpdateView002;
[...]
UpdateViewProcedures := TArray<TUpdateProcedure>.Create(UpdateView001, UpdateView002);
Inkompatible Typen: 'TUpdateProcedure' und 'procedure, untyped pointer or untyped parameter'

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?

Zacherl 31. Jan 2018 15:46

AW: Populate Array of procedure of object
 
Das Problem ist, dass
Delphi-Quellcode:
procedure of Object
nicht gleich
Delphi-Quellcode:
procedure
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
Delphi-Quellcode:
RelodAdapterInstance.UpdateView1
, etc. Also mit einer konkreten Objektinstanz.

Der schöne Günther 31. Jan 2018 18:43

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.

hzzm 1. Feb 2018 07:14

AW: Populate Array of procedure of object
 
Vielen Dank fuer Eure Antworten.

Zitat:

Zitat von Zacherl (Beitrag 1392728)
Das Problem ist, dass
Delphi-Quellcode:
procedure of Object
nicht gleich
Delphi-Quellcode:
procedure
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
Delphi-Quellcode:
RelodAdapterInstance.UpdateView1
, etc. Also mit einer konkreten Objektinstanz.

Mein Code hat es nicht eindeutig gezeigt; in meinem Fall waere das dann Self.UpdateView001. Das aendert leider nichts. Selbst die Deklaration als Procedure; anstatt Procedure of object; bringt die exakt gleichen Probleme (gleicher Compiler-Fehler).

Zitat:

Zitat von Der schöne Günther (Beitrag 1392788)
Minimalbeispiel:
Delphi-Quellcode:
updateProcedures := TUpdateProcedures.Create(); // geht
   updateProcedures := []; // geht

Ja, das geht beides. Aber dann
Delphi-Quellcode:
updateProcedures := TUpdateProcedures.Create(); // geht
   updateProcedures := [UpdateView001, UpdateView002]; // geht nicht
'TUpdateProcedure' und 'procedure, untyped pointer or untyped parameter'

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;

Der schöne Günther 1. Feb 2018 08:56

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.

TiGü 1. Feb 2018 10:18

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.

hzzm 6. Feb 2018 10:10

AW: Populate Array of procedure of object
 
Zitat:

Zitat von TiGü (Beitrag 1392872)
Workaround:
Delphi-Quellcode:
UpdateProcedureList:= TList<TUpdateProcedure>.Create();

Danke. Ich hab jetzt alles auf TList's umgebogen. Komisch, dass das nicht auch mit Arrays geht. Naja, was solls...

TiGü 2. Mär 2018 08:35

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;

hzzm 2. Mär 2018 10:55

AW: Populate Array of procedure of object
 
Zitat:

Zitat von TiGü (Beitrag 1394993)
Nach dem Workaround kommt die Lösung

Du krasser Fuchs.
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?

TiGü 2. Mär 2018 11:14

AW: Populate Array of procedure of object
 
Zitat:

Zitat von hzzm (Beitrag 1395043)
Zitat:

Zitat von TiGü (Beitrag 1394993)
Nach dem Workaround kommt die Lösung

Du krasser Fuchs.
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?

Ja, natürlich.
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 20:28 Uhr.
Seite 1 von 2  1 2      

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