Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TVarRec Array verlängern (https://www.delphipraxis.net/103212-tvarrec-array-verlaengern.html)

Ares 12. Nov 2007 13:46


TVarRec Array verlängern
 
Hallo!

Ich will eine Procedur schreiben, die verschiedene Fehlermeldungen ausgibt. Hierbei verwende ich die Format()-Methode zur Stringformatierung. Der Argument-Array für die Formatierung wird zusammen mit dem Nachrichtentext an die Procedure übergeben. Um den Nachrichtentext durch eine Fehlernummer ergänzen zu können, soll der Argument-Array um ein Feld erweitert werden:

Delphi-Quellcode:
procedure ShowErrorMsg(Text: String; Args: array of TVarRec);
begin
  // Fehlernummer ermitteln und in den Argument-Array einfügen
  SetLength(Args, length(Args)+1);
  Args[length(Args)-1] := GetErrorNo(); // GetErrorNo liefert einen Int zurück
 
  Application.MessageBox(PChar(
     Format(Text, Args)),
     'Fehler', 48
  );
end;
Bei der Erweiterung des Argument-Arrays meckert nun der Compiler. Die SetLength-Zeile wird mit "Inkompatible Typen" und die Zeile darunter mit "Inkompatible Typen: TVarRec und Integer" moniert.

Wie kann ich also den Argument-Array verlängern?

Besten Dank
Ares

3_of_8 12. Nov 2007 13:58

Re: TVarRec Array verlängern
 
Du darfst das so nicht übergeben. Du musst die einen Array-Typen deklarieren, z.B. TVarRecArray=array of TVarRec (falls es den nicht eh schon gibt).

So, wie du das momentan schreibst, ist das nämlich ein offener Array-Typ, und die haben eine feste Größe. Wenn du allerdings den Komfort behalten willst, das ganze mit ShowErrorMsg('bla', [wuppdi, narf]); aufzurufen, musst du es so behalten, wie es ist, und dann innerhalb der Prozedur das offene Array Args in ein anderes, "normales" Array kopieren.

Ares 29. Nov 2007 12:15

Re: TVarRec Array verlängern
 
Hallo!

Nach längerer Zeit komme ich wieder dazu mich mit dem Problem zu beschäftigen. Ich habe leider noch keine Lösung dafür finden können. Es geht ganz einfach darum, aus zwei "array of TVarRec" einen Array zu machen um diesen an die Format() Funktion übergeben zu können.

Folgende Sachen habe ich probiert die leider nicht funktionieren:
Delphi-Quellcode:
// Funktioniert nicht: Bezeichner erwartet, aber 'ARRAY' gefunden
function concatArgs(a, b: array of TVarRec): array of TVarRec;
...

// Umgehe dieses Problem durch die def. eines eigenen Typs:
type
  TVarRecArray=array of TVarRec;
...
function concatArgs(a, b: array of TVarRec): TVarRecArray;
var i: integer;
begin
  setLength(a, length(a)+length(b)); // Inkompatible Typen

  setLength(result, length(a)+length(b));
  for i:=0 to length(a)-1 do
    result[i] := a[i];

  for i:=0 to length(b)-1 do
    result[length(a)+i] := b[i];
end;

procedure test;
var str: string;
    args1, args2: array of TVarRec;
    argsA, argsB: TVarRecArray;
begin
  str := '%s ist ein Test von %s und %u';

  args1 := ['1', '2'];    // Inkompatible Typen: 'dynamic array' und 'Set'
  args1 := [99];          // Inkompatible Typen: 'dynamic array' und 'Set'
  args1 := ['1', '2', 99]; // Inkompatible Typen: 'Char' und 'Integer'

  argsA := ['1', '2'];    // Inkompatible Typen: 'TVarRecArray' und 'Set'
  argsA := [99];          // Inkompatible Typen: 'TVarRecArray' und 'Set'
  argsA := ['1', '2', 99]; // Inkompatible Typen: 'Char' und 'Integer'

  argsA := concatArgs(['1', '2'], [99]);
  Format(str, argsA);
  showMessage(str);       // --> %s ist ein Test von %s und %u --> Keine Formatierung
end;
Jetzt sind mir die Ideen ausgegangen. Hat also noch jemand einen Tipp, wie ich dieses "array of TVarRec" verlängern kann?

Wieso kann ich ['1', '2'] problemlos als Argument von concatArgs angeben aber args1 nicht direkt zuweisen?

Besten Dank
Ares

sirius 29. Nov 2007 12:54

Re: TVarRec Array verlängern
 
1.
Delphi-Quellcode:
str:=Format(str,Args);
2.
Delphi-Quellcode:
setlength(args1,2);
args1[0].vType:=vtChar;
args1[0].vChar:='1';
args1[1].vType:=vtPChar
args1[1].vPChar:=' 2';

setlength(args2,1);
args2[0].vType:=vtInteger;
args2[0].vInteger:=99;

Ares 29. Nov 2007 13:02

Re: TVarRec Array verlängern
 
Delphi-Quellcode:
setlength(args1,2);
Das geht leider nicht. Der Compiler meckert dabei "Inkompatible Typen"...

sirius 29. Nov 2007 13:04

Re: TVarRec Array verlängern
 
Zitat:

Zitat von Ares
Delphi-Quellcode:
setlength(args1,2);
Das geht leider nicht. Der Compiler meckert dabei "Inkompatible Typen"...

Keine Ahnung, was du gemacht hast, aber das hier funktioniert:
Delphi-Quellcode:
type TVarRecArray=array of TVarRec;

function concatArgs(a, b: array of TVarRec): TVarRecArray;
var i: integer;
begin
  setLength(result, length(a)+length(b));
  for i:=0 to length(a)-1 do
    result[i] := a[i];

  for i:=0 to length(b)-1 do
    result[length(a)+i] := b[i];
end;

procedure TForm1.Button1Click(Sender: TObject);
const x:int64=9;
var Args,Args1:TVarRecArray;
    Args2:array of TVarRec;
begin

  setlength(args1,2);
  args1[0].VInteger:=5;
  args1[0].VType:=vtinteger;

  args1[1].VPChar:='Hallo';
  args1[1].VType:=vtPChar;

  setlength(args2,1);
  args2[0].VType:=vtint64;
  args2[0].Vint64:=@x;


  args:=concatArgs(Args1,Args2);
  showmessage(format('%d %s %d',Args));
end;

3_of_8 30. Nov 2007 10:08

Re: TVarRec Array verlängern
 
Wenn du eine lokale Variable array of TVarRec hast, geht das, aber wenn das array of TVarRec ein Parametet ist, ist es eine besondere Art von Array... "offenes Array" oder so ähnlich... auf jeden Fall haben die die Eigenschaft, dass man sie in der Form [bla, wuppdi narf] als Parameter übergeben kann, aber nicht ihre Größe ändern.


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