Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion Rückgabewert (https://www.delphipraxis.net/139196-funktion-rueckgabewert.html)

kingmarv 25. Aug 2009 14:32


Funktion Rückgabewert
 
Hallo

Ich habe einen String der durch mehrere Trennzeichen getrennt ist und verschiedene Informationen enthält.
Jetzt habe ich eine Funktion geschrieben die diesen String in seine einzelnen Informationen aufteilt und als Rückgabe wert hab ich z.Z Boolean, weil es bisher gereicht hat.

Jetzt möchte ich, dass man die Funktion z.B so Aufrufen kann :

explorestring('String', spieltag);

Wobei in der Variable Spieltag keine informationen übermittelt werden sollen, sondern es soll der Funktion sagen das er nur die Informationen über den Spieltag zurückgeben soll.

Leider weiß ich nicht wie man so eine Funktion aufbaut, es wäre nett wenn mir das einer verraten könnte.

patti 25. Aug 2009 15:11

Re: Funktion Rückgabewert
 
Hallo und Willkommen ;-)

Ich denke, dass noch einpaar Informationen fehlen, damit wir dir wirklich helfen können. Was genau soll den z.B. die Funktion am Ende zurückgeben und vor allem: was soll sie den eigentlich genau machen?

Zu deinem Problem wegen "Spieltag": Du könntest dir einen Typ bauen, z.B.:

Delphi-Quellcode:
TMeinTyp = (mtTest1, mtTest2, mtTest3);
und dann bei der Funktion:

Delphi-Quellcode:
function ExploreString(AStr : string; AWas : TMeinTyp) : boolean;
Innerhalb der Funktion kannst du dann auf "AWas" natürlich zugreifen und für verschiedene Dinge verschiedene Sachen tun.

Vielleicht hilft dir das schon mal weiter, vielleicht hab ich dich aber auch vollkommen falsch verstanden. Gib doch einfach noch einpaar mehr Informationen zu deinem Problem.

mfG

Patti

Edit: Mein 300. Beitrag :party: :spin:

jfheins 25. Aug 2009 15:25

Re: Funktion Rückgabewert
 
Zitat:

Ich habe einen String der durch mehrere Trennzeichen getrennt ist und verschiedene Informationen enthält.
Das würde ich so schnell wie möglich in einen passenden record packen. Damit kann man dann viel leichter herumhantieren.

Um den String zu zerteilen schau dir mal explodeexplode an ;)

DeddyH 25. Aug 2009 15:29

Re: Funktion Rückgabewert
 
Wieso nicht so etwas?
Delphi-Quellcode:
function explorestring(const s: string; const spieltag: TStrings): Boolean;
So eine Funktion könnte z.B. zurückgeben, ob alles in Ordnung war. Wenn ja, steht der "zerpflückte" String anschließend in spieltag, welches als TStrings z.B. Memo.Lines, ListBox.Items oder eine TStringlist sein könnte.

kingmarv 25. Aug 2009 15:37

Re: Funktion Rückgabewert
 
erstmal danke für eure schnelle und netten Antowrten.
Ich dachte zuerst ich müßte mir jetzt anhören ich soll google benutzten. Echt gut hier.

Herzlichen Glückwunsch Patti zum 300ten Post ;)


AWas : TMeinTyp) : boolean;

Ich glaube das ist interessant für mich

Um mein Problem nochmal zuerläutern:

So sieht mein String aus.

s:='spieltag=1|nachname=kamp|vorname=marvin|tippst ring=bochum2gegner6;dortmund1gegner1;schalke1gegne r0;leverkusen3gegner1;|';

Die Funktion um die Informationen von einen zu Trennen hab ich auch schon geschrieben, sieht zwar nicht sonderlich schön aus ^^ aber funktioniert:

Delphi-Quellcode:
function getstring(s:string) :boolean;
var
st,nn,vn,ts:string;
pos1,pos2,pos3,pos4,trenn:integer;
begin

pos1:=pos('spieltag=',s);
st:=copy(s,pos1+9,1);
showmessage(st);
trenn:=pos('|',s);
delete(s,1,trenn);


pos2:=pos('nachname=',s);
trenn:=pos('|',s);
nn:=copy(s,pos2+9,trenn-10);
showmessage(nn);
Delete(s,1,trenn);


pos3:=pos('vorname=',s);
trenn:=pos('|',s);
vn:=copy(s, pos3+8,trenn-9);
showmessage(vn);
Delete(s,1,trenn);


pos4:=pos('tippstring=',s);
trenn:=pos('|',s);
ts:=copy(s, pos4+11,length(s));
showmessage(ts);


end;
Das er mir die Ergebnisse in Showmessage ausgibt war nur zu testzwecken.

Jetzt möchte ich die Funktion aber so umschreiben, das wenn ich die Funktion aufrufe

getstring(....) möchte ich dir Funktion genau sagen welcher dieser Informationen er mir als Rückgabewert ausgeben soll.

z.B getstring('string', spieltag) ausgeben soll er mir dann "1" oder "Spieltag=1".

Ich denke da kommt das ins spiel "AWas : TMeinTyp)" nur wie baue ich diese Klasse auf um mein Problem zu realisieren.

guidok 25. Aug 2009 15:46

Re: Funktion Rückgabewert
 
Ein Tip zum Zerlegen des Strings ist die TStringList. Schau dir da mal die Eigenschaften Delimiter, StrictDelimiter und DelimitedText an, damit hast du deinen String schon mal auf einfachste Weise zerlegt.

Das andere Problem wurde ja von Patti schon fast komplett gelöst:

Delphi-Quellcode:

type

  TMeinTyp = (mtSpieltag, mtNachname); //Alle weiteren kannst du ergänzen

function GetString(AStr : string; AWas : TMeinTyp) : String;
begin

  case AWas of
    mtSpieltag: begin
                  Result := ... //Hier kommt die richtige Zuweisung hin
                end;
    mtNachname: ... //usw.
  end;
end;

Edit: Variante mit TStringList. Ungetestet.

Delphi-Quellcode:
type
  TSubString = (ssSpieltag, ssNachname, ssVorname, ssTippstring);

function GetString(AStr: String; const ASubString: TSubString): String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Delimiter := '|';
  sl.StrictDelimiter := True;
  sl.DelimitedText := AStr;
  Result := sl.Strings[Integer(ASubString)];
  sl.Free;
end;

kingmarv 26. Aug 2009 00:01

Re: Funktion Rückgabewert
 
hey danke eure tips waren super habs so gemacht und es klappt viel kürzer und zuverlässiger ;)

danke nochmals

guidok 26. Aug 2009 07:34

Re: Funktion Rückgabewert
 
TStringList kann übrigens noch mehr... Sie kann auch mit Namen-Wertepaaren umgehen, d.h.
"Name=Wert", was ja bei dir der Fall ist.

Solltest du also beim Rückgabewert nur den Teil nach dem "=" benötigen musst du nur

Delphi-Quellcode:
Result := sl.ValueByIndex[Integer(ASubString)];
schreiben.

kingmarv 26. Aug 2009 10:59

Re: Funktion Rückgabewert
 
hey guido

danke noch für den zusätzlich tipp. Muss man erst einmal wissen das es das auch noch gibt ;)

Hab es dann über ne eigene Function gelöst, wobei deine Variante sicherlich eleganter gewesen wäre :)

Delphi-Quellcode:
function format(s:string) : string;
var
s2:string;
i:integer;
begin
i:=pos('=',s);
Delete(s,1,i);
Result:=s;
end;
Danke nochmal an ALLE für den guten Support :)

guidok 26. Aug 2009 11:09

Re: Funktion Rückgabewert
 
Zitat:

Unit

SysUtils

Syntax

function Format(const Format: string; var Args: array of TVarRec): string; overload;

function Format(const Format: string; var Args: array of TVarRec; var FormatSettings: TFormatSettings): string; overload;
Die Funktion Format ist übrigens bereits in den SysUtils definiert. Du solltest bei der Vergabe deiner Namen für Variablen, Prozeduren, Funktionen usw. darauf achten, dass es den Namen noch nicht gibt, um später Probleme zu vermeiden.

Ein einfacher Weg wäre es z.B. der eigenen Variablen, Routine usw. etwas voranzustellen (MyFormat, kmFormat [km steht hier für kingmarv]).

Edit:

Noch was wichtiges: Die Möglichkeit mit TStringList, wie oben vorgestellt funktioniert nur solange die gesuchten Substrings in dieser Reihenfolge im String stehen. Falls sich das mal ändert, musst du das anders lösen:

Delphi-Quellcode:
function GetSubStringByName(AStr: String; const AName: String): String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := '|';
    sl.StrictDelimiter := True;
    sl.DelimitedText := AStr;
    Result := sl.Values[AName];
  finally
    sl.Free;
  end;
end;

//Aufruf:

GetSubStringByName(Quellstring, 'nachname'); //liefert als Ergebnis den Teil der hinter nachname= steht
Falls du den anderen Aufruf bevorzugst, dann könnte das so aussehen:

Delphi-Quellcode:
type
  TSubstring = (ssSpieltag, ssNachname, ssVorname, ssTippstring);

const
  CSubstring: Array[TSubstring] of Shortstring = ('spieltag', 'nachname', 'vorname', 'tippstring');

function GetSubStringByName2(AStr: String; const ASubstring: TSubstring): String;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := '|';
    sl.StrictDelimiter := True;
    sl.DelimitedText := AStr;
    Result := sl.Values[CSubstring[ASubstring]];
  finally
    sl.Free;
  end;
end;

//Aufruf:

GetSubStringByName2(Quellstring, ssNachname); //liefert als Ergebnis den Teil der hinter nachname= steht
Diese beiden Varianten richten sich nur nach dem, was VOR dem "=" steht und funktionieren auch wenn sich die Reihenfolge ändert.

Jetzt solltest du nur noch verstehen, was in den beiden Routinen passiert...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 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 by Thomas Breitkreuz