AGB  ·  Datenschutz  ·  Impressum  







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

Populate Array of procedure of object

Ein Thema von hzzm · begonnen am 31. Jan 2018 · letzter Beitrag vom 2. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2      
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#1

Populate Array of procedure of object

  Alt 31. Jan 2018, 15:45
Delphi-Version: 10 Seattle
(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?

Geändert von hzzm (31. Jan 2018 um 15:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Populate Array of procedure of object

  Alt 31. Jan 2018, 16:46
Das Problem ist, dass procedure of Object nicht gleich 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 RelodAdapterInstance.UpdateView1 , etc. Also mit einer konkreten Objektinstanz.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Populate Array of procedure of object

  Alt 31. Jan 2018, 19:43
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.
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#4

AW: Populate Array of procedure of object

  Alt 1. Feb 2018, 08:14
Vielen Dank fuer Eure Antworten.

Das Problem ist, dass procedure of Object nicht gleich 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 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).

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;
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Populate Array of procedure of object

  Alt 1. Feb 2018, 09:56
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.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Populate Array of procedure of object

  Alt 1. Feb 2018, 11:18
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.
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#7

AW: Populate Array of procedure of object

  Alt 6. Feb 2018, 11:10
Workaround: UpdateProcedureList:= TList<TUpdateProcedure>.Create();
Danke. Ich hab jetzt alles auf TList's umgebogen. Komisch, dass das nicht auch mit Arrays geht. Naja, was solls...
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Populate Array of procedure of object

  Alt 2. Mär 2018, 09:35
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;
  Mit Zitat antworten Zitat
hzzm

Registriert seit: 8. Apr 2016
103 Beiträge
 
Delphi 10 Seattle Professional
 
#9

AW: Populate Array of procedure of object

  Alt 2. Mär 2018, 11:55
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?
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Populate Array of procedure of object

  Alt 2. Mär 2018, 12:14
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:37 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