![]() |
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; |
AW: Zwei Array of const kombinieren
Ein
Delphi-Quellcode:
ist ein
array of const
Delphi-Quellcode:
, was sowas wie eine Miniversion des Variant ist, allerdings ohne automatische Speicherverwaltung oder AutoCasts, wenn du es direkt nutzt.
array of TVarRec
Variable erstellen, Beides da reinkopieren und dann Dieses übergeben. |
AW: Zwei Array of const kombinieren
Liste der Anhänge anzeigen (Anzahl: 1)
Basierend auf diesem Blogbeitrag:
![]() ...:cat:... |
AW: Zwei Array of const kombinieren
Heißt du brauchst ein
Delphi-Quellcode:
und musst selbst TVarRec-Dinger reinstecken.
array of TVarRec
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:
Super leicht zu erweitern wenn später mehr hinzu kommt und zu lokalisieren.
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; Ja, du kannst deine Exception nicht mehr mit einem Einzeiler werfen, sondern füllst erst ordentlich dein
Delphi-Quellcode:
und wirfst die Exception dann. Aber das bisschen Mühe sollte es einem wirklich wert sein.
TTechnikFEhler
|
AW: Zwei Array of const kombinieren
Zitat:
Oder eben mehrere Parameter statt einem Record. Geht auch mit zwei Contructoren an der Exception. |
AW: Zwei Array of const kombinieren
Zitat:
![]() 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 :-) |
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:
Wirklich raketenschnell wird der Code natürlich durch das ganze Array allokieren nicht, aber was solls, wir sind ja eh in einer Exception :stupid:
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)); |
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 08:13 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