Entwickler-Ecke

Sonstiges (Delphi) - Fehlermeldung bei Functions Wert rückgabe


Achim_Bim - Di 23.03.04 16:50
Titel: Fehlermeldung bei Functions Wert rückgabe
Hallo, ich hab seit langer Zeit mal wieder was mit Delphi programmiert und bei dieser Gelegenheit eine Hifsfunktion, die mir den Rechten Teil eines Strings, ab einer Suchposition zurück geben soll:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Function RString(os:string;s :char) : string;
 var
   i,pos : integer;
   ch,ergstring : string;
begin
   pos:=0;
   for i := 1 to length(os) do begin
         ch := copy(os,i,1);
           if ch=s then pos:=i+1;
               end;
    ergstring:=copy(os,pos,length(os)-pos+1);
     result:= ergstring;
end


Das tut sie auch zufriedenstellend. Wenn ich einen String habe wie zb 'User1=Webmaster'. Wenn ich aber so einen String habe:'User1=Webmaster-Lokal' also mit Bindestrich oder auch mit Leerzeichen dann bekomme ich folgenden Fehler:
Im Projekt mailcheck.exe ist eine Exeption der Klasse EComponentError aufgetreten. Meldung:'Webmaster-Lokal'ist kein gültiger Komponentenname.

Ich kann damit nichts anfangen, vielleicht weis ja jemand was.
Gruß Achim

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt


Udontknow - Di 23.03.04 17:26

Hallo!

Das Problem liegt nicht an deiner Funktion, sondern an dem Code, in dem du den Funktionsrückgabewert nutzt. Du versuchst anscheinend, bei einer Komponente den Namen (Bsp: Form1.Name:=Result) zuzuweisen. Komponenten-Namen dürfen jedoch keine Sonderzeichen, Umlaute etc. enthalten. Vielleicht verwechselst du irgendwo die Eigenschaft Name einer Komponente mit der Eigenschaft Caption?

Cu,
Udontknow


Achim_Bim - Di 23.03.04 17:55

Hallo,
Hmmm .. ich habe folgenden Funktionsaufruf:


Delphi-Quelltext
1:
2:
3:
4:
Var 
   name : string;

   name:=RString(TempList.Items.Strings[i-1],'=');


Hat es damit was zu tun?

Gruß Achim

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt


MaxiTB - Di 23.03.04 18:13

Ganz schlecht - Name ist bereits ein property von Txxx.

Daher hab ich mir angewöhnt, lokalen Variablen ein l vorzusetzen (lName), dann kanns keine Namenskonflikte geben,


Udontknow - Di 23.03.04 18:50

Das würde keine Rolle spielen, da lokale Variablen Vorrang vor Feldern und Eigenschaften haben. Aber die Variable Name ist in dem Falle höchstwahrscheinlich global in einer Unit definiert, richtig? In diesem Fall solltest du tatsächlich den Namen der Variablen ändern oder ihn in der Form UnitName.Variablenname angeben.

PS : Die Namenskonflikte zwischen Feldern und lokalen Variablen kann man mit dem Aufruf "Self.FeldName" lösen.

Cu,
Udontknow


smiegel - Di 23.03.04 18:56

@Achim_Bim

Deine Funktion geht ein wenig kürzer, denn die Schleife die Du gebrauchst ist in diesem Zusammenhang überflüssig.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function RString(os:String; c:Char):String
var x:integer; 
begin 
  // wo ist unser Zeichen?
  x:=System.Pos(c, os);
  if (x>0then 
    // gefunden, also rechten Teil des Strings kopieren
    Result:=System.Copy(os, x+1, Length(os)-x)
  else 
    // nichts gefunden, Zeichen kommt nicht vor, leeren String zurückgeben
    Result:='';
end// RString


Achim_Bim - Di 23.03.04 21:51

Vielen Dank an alle für die Antworten.
Es war tatsächlich ein Problem mit globalen und lokalen Variablen.
Die funktion mit
"system.pos" hab ich übernommen. Ich bin doch noch ein bisschen eingerostet was das programmieren mit Delphi angeht. Wenn man nicht jeden Tag dran ist, vergisst man doch einiges.

Gruß Achim