Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zwei Array of const kombinieren (https://www.delphipraxis.net/197111-zwei-array-const-kombinieren.html)

Codehunter 18. Jul 2018 11:58

Delphi-Version: 10.2 Tokyo

Zwei Array of const kombinieren
 
Ahoi,

ich versuche für eine Formatierfunktion zwei Array of const zu kombinieren. Weil das Array aber typenlos ist komme ich gerade nicht weiter. Eigentlich dachte ich, ein Array of const wäre ein Array of Pointer. Deshalb wäre die Elementgröße ja fix. Aber so einfach isses denn doch nicht.
Delphi-Quellcode:
constructor ETechnikException.CreateFmt(const Fehlernummer: Integer;
  const Args: array of const);
var
  sFehler: string;
begin
  Self.Fehlernummer := Fehlernummer;
  case Fehlernummer of
    E_TECHNIK_ALLGEMEIN: sFehler := R_TECHNIK_ALLGEMEIN;
    E_TECHNIK_PFLICHTFELD_UNBESETZT: sFehler := R_TECHNIK_PFLICHTFELD_UNBESETZT;
    E_TECHNIK_PROGRAMM_AUSFUEHREN: sFehler := R_TECHNIK_PROGRAMM_AUSFUEHREN;
  end;
  inherited CreateFmt(R_TECHNIK_EXCEPTION, [sFehler, Fehlernummer] + Args); // <-- [dcc32 Fehler]E2029 ')' erwartet, aber '+' gefunden
end;

himitsu 18. Jul 2018 12:23

AW: Zwei Array of const kombinieren
 
Ein
Delphi-Quellcode:
array of const
ist ein
Delphi-Quellcode:
array of TVarRec
, was sowas wie eine Miniversion des Variant ist, allerdings ohne automatische Speicherverwaltung oder AutoCasts, wenn du es direkt nutzt.

Variable erstellen, Beides da reinkopieren und dann Dieses übergeben.

sakura 18. Jul 2018 12:28

AW: Zwei Array of const kombinieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Basierend auf diesem Blogbeitrag: http://rvelthuis.de/articles/articles-openarr.html , findest Du im Anhang ein Beispiel.

...:cat:...

Der schöne Günther 18. Jul 2018 12:29

AW: Zwei Array of const kombinieren
 
Heißt du brauchst ein
Delphi-Quellcode:
array of TVarRec
und musst selbst TVarRec-Dinger reinstecken.


Ich hatte so etwas ähnliches mit Exceptions und Jonglieren der Exception-Argumente auch. Ich hatte sie mir für später gespeichert um die Meldung auch in anderen Sprachen anzeigen zu können. Kein Spaß.


Meine Empfehlung: Tu es nicht, mach es anders. Gib deiner ETechnikException einen Record in dem alles drinsteht was sie an weiteren Infos mitschleppen soll.

Delphi-Quellcode:
type
   TTechnikFehler = record
      fehlerText:            String;
      fehlerNummer:         Integer;
      geräteStatus:         Byte;
      esBestehtNochHoffnung:   Boolean;
   end;

   ETechnikFehler = class(Exception)
   public
      constructor Create(const technikFehler: TTechnikFehler);
      function getTechnikFehler(): TTechnikFehler;
   end;
Super leicht zu erweitern wenn später mehr hinzu kommt und zu lokalisieren.


Ja, du kannst deine Exception nicht mehr mit einem Einzeiler werfen, sondern füllst erst ordentlich dein
Delphi-Quellcode:
TTechnikFEhler
und wirfst die Exception dann. Aber das bisschen Mühe sollte es einem wirklich wert sein.

himitsu 18. Jul 2018 12:43

AW: Zwei Array of const kombinieren
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1407661)
Ja, du kannst deine Exception nicht mehr mit einem Einzeiler werfen,

Gib deinem Record einen Constructor und dann geht das auch wieder einzeilig.

Oder eben mehrere Parameter statt einem Record. Geht auch mit zwei Contructoren an der Exception.

Codehunter 18. Jul 2018 12:51

AW: Zwei Array of const kombinieren
 
Zitat:

Zitat von himitsu (Beitrag 1407668)
Zitat:

Zitat von Der schöne Günther (Beitrag 1407661)
Ja, du kannst deine Exception nicht mehr mit einem Einzeiler werfen,

Gib deinem Record einen Constructor und dann geht das auch wieder einzeilig.

Oder eben mehrere Parameter statt einem Record. Geht auch mit zwei Contructoren an der Exception.

Das Thema hatten wir gerade erst :-)

Davon abgesehen, @sakura und @Günther: Beides gute Vorschläge, die ich an verschiedenen Stellen gut gebrauchen kann. Das mit dem array of TVarRec war mir neu dass das mit Format() kompatibel ist. Wieder was gelernt :-)

Stevie 18. Jul 2018 15:02

AW: Zwei Array of const kombinieren
 
Einfach ein array of const in ein array of TVarRec umwandeln, dann kannst du dynamische Array Konkatenation nutzen und das kann wieder in ein array of const gegeben werden. Da du nur die TVarRec referenzen lokal nutzt, brauchst du auch kein Zauberwerk veranstalten, den Rudy in seinem Artikel beschreibt.

Delphi-Quellcode:
function _Args(const args: array of const): TArray<TVarRec>;
var
  i: Integer;
begin
  SetLength(Result, 0);
  SetLength(Result, Length(args));
  for i := 0 to High(args) do
    Result[i] := args[i];
end;

....

inherited CreateFmt(R_TECHNIK_EXCEPTION, _Args([sFehler, Fehlernummer]) + _Args(Args));
Wirklich raketenschnell wird der Code natürlich durch das ganze Array allokieren nicht, aber was solls, wir sind ja eh in einer Exception :stupid:

Codehunter 1. Aug 2018 06:29

AW: Zwei Array of const kombinieren
 
Irgendwie ist dieser Thread in meinem Inbox.Gewusel untergegangen. Letztlich habe ich es vil einfacher gelöst. Aber das ändert nichts am Lernprozess :) Und ich möchte euch für eure Mühe danken.


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