2012-03-26 8 views
0

Dies ist eine einfache Frage, aber ich weiß nicht, wie man einen Variablennamen durch Verketten von zwei Strings erstellt. Der folgende Code ist, wie man es nicht tut ...Verketten von Strings in Variablennamen

var 
    UserName1 : String; 
    UserName2 : String; 
    Password1 : String; 
    Password2 : String; 
    UserCount : Integer; 

UserCount := 2; 

for Wk1 := 1 to UserCount do 
begin 
    DoLogin(UserName+Wk1, Password+Wk1); 
end; 

Antwort

2

Grundsätzlich können Sie dies nicht tun. Variablennamen werden zur Kompilierzeit festgelegt und in Adressen übersetzt, die den Wert der Variablen enthalten.

Es sieht so aus, als ob Sie ein Array wollen oder in diesem Fall zwei: ein Array enthält die Login-Namen und ein Array das Passwort. Natürlich könnten Sie die beiden zu einem Datensatz kombinieren und dann ein Array von Datensätzen haben.

type 
LogType = record 
      username, password: string[31] 
      end; 

var 
LogArray: array [1..10] of logtype; 
usercount, wk1: integer; 

begin 
UserCount := 2; 
for Wk1 := 1 to UserCount do 
    begin 
    DoLogin(logarray[wk1].username, logarray[wk1].password); 
    etc 
    end; 
end; 
+0

Gibt es einen besonderen Grund, warum Sie 'ShortString' für die String-Typen verwendet haben? Das OP hat keine Notwendigkeit dafür angegeben, und es wird in Delphi nicht mehr häufig verwendet (sicherlich nicht standardmäßig in Delphi 5, das in einem der Tags enthalten ist). –

+0

@Ken: Kraft der Gewohnheit. Ich fing an, mit Pascal in den frühen achtziger Jahren zu programmieren, als Gedächtnis eine Beschränkung war. Ich kann mich nicht daran gewöhnen, den Speichergebrauch mit Strings zu verschwenden. –

+2

@No'amNewman: Ich denke, ich kann dich verstehen, aber andererseits kann deine Gewohnheit dich in der Tat dazu verleiten, das Gedächtnis in größerem Ausmaß zu verschwenden als es mit dem 'string' Typ sein könnte. Betrachten Sie den Beispielcode in Ihrer Antwort. Wie oft können Sie auf ein Passwort stoßen, das so lang ist (31 Zeichen)? –

2

Versuchen Sie nicht, das zu tun.

Reflection (oder RTTI - Run Time Type Information) würde benötigt werden und es ist nicht gut in Delphi zu verwenden, da es von Release zu Release wechseln kann und Sie müssten Debug-Informationen beim Bauen mit einbeziehen.

Verwenden Sie also ein Array oder zwei.

var 
UserNames[1..2] : String; 
Passwords[1..2] : String; 
UserCount : Integer; 

UserCount := 2; 

for Wk1 := 1 to UserCount do 
begin 
    DoLogin(UserNames[Wk1], Passwords[Wk1]); 
end; 
+0

D2010 unterstützt richtige RTTI auf nicht veröffentlichten Symbolen. Aber es schießt eine Mücke mit einer Kanone. Die Mücke ist tot, aber auch alle anderen. –