![]() |
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:
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.
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; Wie kann ich also den Argument-Array verlängern? Besten Dank Ares |
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. |
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:
Jetzt sind mir die Ideen ausgegangen. Hat also noch jemand einen Tipp, wie ich dieses "array of TVarRec" verlängern kann?
// 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; Wieso kann ich ['1', '2'] problemlos als Argument von concatArgs angeben aber args1 nicht direkt zuweisen? Besten Dank Ares |
Re: TVarRec Array verlängern
1.
Delphi-Quellcode:
2.
str:=Format(str,Args);
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; |
Re: TVarRec Array verlängern
Delphi-Quellcode:
Das geht leider nicht. Der Compiler meckert dabei "Inkompatible Typen"...
setlength(args1,2);
|
Re: TVarRec Array verlängern
Zitat:
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; |
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