AGB  ·  Datenschutz  ·  Impressum  







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

TVarRec Array verlängern

Ein Thema von Ares · begonnen am 12. Nov 2007 · letzter Beitrag vom 30. Nov 2007
Antwort Antwort
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#1

TVarRec Array verlängern

  Alt 12. Nov 2007, 13:46
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
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: TVarRec Array verlängern

  Alt 12. Nov 2007, 13:58
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#3

Re: TVarRec Array verlängern

  Alt 29. Nov 2007, 12:15
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
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: TVarRec Array verlängern

  Alt 29. Nov 2007, 12:54
1.
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;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#5

Re: TVarRec Array verlängern

  Alt 29. Nov 2007, 13:02
setlength(args1,2); Das geht leider nicht. Der Compiler meckert dabei "Inkompatible Typen"...
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: TVarRec Array verlängern

  Alt 29. Nov 2007, 13:04
Zitat von Ares:
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;
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: TVarRec Array verlängern

  Alt 30. Nov 2007, 10:08
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:34 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