![]() |
function mit zwei Rückgabewerten?
Hey,
Ich habe einen function geschrieben die mir einen Rückgabewert liefert und zwar ein String. Nun möchte ich aber dass die Function mir, wenn ich einen StringA reinliefere, einen StringB und einen IntegerA zurückgibt. Wie mache ich sowas? |
Re: function mit zwei Rückgabewerten?
Nimm eine Prozedur mit zwei VAR-PArametern.
|
Re: function mit zwei Rückgabewerten?
Delphi-Quellcode:
Parameter, die mit var angegeben werden, werden nach Funktionsaufruf an den Aufrufer zurückgegeben.
function MachWas (StringA : String; var IntegerA : integer) : string;
Hope it helps onlinekater |
Re: function mit zwei Rückgabewerten?
Alternativ nimmst du einen Record. Dies macht vorallem dann Sinn, wenn es mal mehr wie 2 Rückgabewerte sind oder wenn du schon mehrere Inputparameter hast.
Delphi-Quellcode:
TErgebnis = record
Name : string; Anzahl : integer; end; procedure MachWas(var erg:TErgebnis); |
Re: function mit zwei Rückgabewerten?
Danke euch dreien...
Ich probiere den Ansatz mit dem record mal. mfg Hansi |
Re: function mit zwei Rückgabewerten?
Ich hätte auch ein Record vorgeschlagen, aber als Rückgabewert:
Delphi-Quellcode:
Du musst dazu wie oben im code in der Prozedur / Funktion, die etwas mit dem Rückgabewert machen soll, diesen noch mal als Variable definieren, sonst musst du deine Funktion mehrfach aufrufen:
// Typendefinition
type TStringAndInt = Record rString: String; rInteger: Integer; end; // Irgendwo im Code ;-) function Test: TStringAndInt; begin result.rString := 'Test'; result.rInteger := 123; end; // Und zum Ausführen procedure TForm1.Button1Click(Sender: TObject); var Rueckgabe: TStringAndInt; begin Rueckgabe := Test; Showmessage(Rueckgabe.rString + ' ' + IntToStr(Rueckgabe.rInteger)); end;
Delphi-Quellcode:
Aber das geht natürlich auf Kosten der Geschwindigkeit.
Showmessage(Test.rString + ' ' + IntToStr(Test.rInteger));
|
Re: function mit zwei Rückgabewerten?
Hallo
oder du verwendest "out"
Delphi-Quellcode:
[edit]Delphi-Tags vergessen! Sorry! [/edit]
procedure Test(out i: Integer; out S: String);
begin i := 123; S := DP; end; |
Re: function mit zwei Rückgabewerten?
Zitat:
Also es gibt wie gesagt nur die 2-3 drei Möglichkeiten die ich grad nochmal zusammenfasse damit ich nicht nur OT geschrieben hab :mrgreen: 1. Function gibt ein Record zurück
Delphi-Quellcode:
2. Proceduren mit Out-Parametern
ABC = record
A: String B: Integer; C: Boolean; end; function GetaABC: ABC; begin ABC.A := 'Hallo'; ABC.B := 22; ABC.C := true; end;
Delphi-Quellcode:
3. Das gleiche mit Var-Parametern.
procedure GiveMeAnA(out AA: String);
begin AA:= 'A'; end; Gruß Neutral General |
Re: function mit zwei Rückgabewerten?
Hallo ManuMF,
Leider habe ich dich an dem einen Punkt mit dem zweifachen aufrufen nicht ganz verstanden. Bis jetzt habe ich: Das deklariert:
Delphi-Quellcode:
dann die function:
type
Ttest = Record test_String: String; test_Integer: Integer; end;
Delphi-Quellcode:
und rufe über:
Function test(StringA: String): Ttest;
Delphi-Quellcode:
die function auf.
s := test(Edit1.Text).test_String;
i := test(Edit1.Text).test_Integer; Nur wird diese 2x durchlaufen. Wie kann ich das verhindern? |
Re: function mit zwei Rückgabewerten?
Delphi-Quellcode:
with test(Edit1.Text) do
begin s := test_String; i := test_Integer; end; |
Re: function mit zwei Rückgabewerten?
Zitat:
Zitat:
Besser wäre (vorallem wenn noch mehr mit dem Ergebnis gearbeitet wird):
Delphi-Quellcode:
var Ergebnis: TTest;
... Ergebnis := test(Edit1.Text); s := Ergebnis.test_String; i := Ergebnis.test_Integer; |
Re: function mit zwei Rückgabewerten?
Ihr castet einen string auf einen record? find ich jetzt sehr gewagt... :shock:
EDIT: uppsala... sorry, verlesen :oops: |
Re: function mit zwei Rückgabewerten?
Hi!
Muss kurz was richtig stellen Zitat:
Delphi-Quellcode:
Und dann hätte ich noch nen kleinen Vorschlag um das Zwischenspeichern des Records zu vermeiden, nämlich die Verwendung von "with .. do .." :
ABC = record
A: String B: Integer; C: Boolean; end; function GetABC: ABC; begin result.A := 'Hallo'; result.B := 22; result.C := true; end;
Delphi-Quellcode:
edit: ups, der with do Vorschlag hatte ja schon jemand gepostet :oops:
procedure TForm1.Button1Click(Sender: TObject);
begin with GetABC do begin showmessage(A); showmessage(IntToStr(B)); showmessage(BoolToStr(C, true)); end; end; |
Re: function mit zwei Rückgabewerten?
Zitat:
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird. Die beste Lösung bisher ist das mit dem Ergebnis := ... |
Re: function mit zwei Rückgabewerten?
Zitat:
|
Re: function mit zwei Rückgabewerten?
Zitat:
greetz Mike |
Re: function mit zwei Rückgabewerten?
@RavenIV: genau.
Hier noch mal dazu mein Code von oben: Zitat:
|
Re: function mit zwei Rückgabewerten?
Zitat:
Delphi-Quellcode:
wird zu:
with test('wuppdi') do
begin showmessage(inttostr(i)); showmessage(s); end;
Delphi-Quellcode:
No further comment.
lea edx,[ebp-$08]
mov eax,$004521b8 call test lea edx,[ebp-$0c] mov eax,[ebp-$04] call IntToStr mov eax,[ebp-$0c] call ShowMessage mov eax,[ebp-$08] call ShowMessage |
Re: function mit zwei Rückgabewerten?
Hi
Ich hatte keine Lust, jede Antwort auszuwerten, aber im Prinzip hab ich's schon durchgeschaut. Der Nachteil der Parameterübergabe mit Vatist, das du sehr schnell eine Variable veränderst, die du gar nicht geändert haben möchtest. Daher hier mal eine andere Lösung.
Delphi-Quellcode:
Aufruf im Programm
Function MyForm.Machwas(String_A : String): String;
Var String_B : String; Zahl : Integer; begin .... machwas mit String_A ...... .... setze String_B und den Wert der Zahl Result:=String_B+';'+IntToStr(Zahl); end;
Delphi-Quellcode:
Zugegeben, etwas kompliziert, daher ersetze ich meist bei solchen sachen das Ergebnis Pos(...) unter Zuhilfenahme von xPos
.....
ZweiWerteStr:=Machwas(einString); StringAntwort:=Copy(ZweiWerteStr,1, Pos(';',ZweiWerteStr)-1); ZahlAntwort:=StrToInt(Copy(ZweiWerteStr, Pos(';',ZweiWerteStr)+1,Length(ZweiWerteStr)-Pos(';',ZweiWerteStr))); ....
Delphi-Quellcode:
Wenn du gut im Stringzerlegen bist, kannst du soviele Werte zurückliefern wie du willst. Übrigends, das Semikolon nehme ich meist, weil es in Wörtern halt nicht vorkommt, genausogut kannst du Unterstrich oder irgendwas anderes nehmen, um die Werte zu trennen.
....
xPos:=Pos(';',ZweiWerteStr); StringAntwort:=Copy(ZweiWerteStr,1, xPos-1); ZahlAntwort:=StrToInt(Copy(ZweiWerteStr, xPos+1,Length(ZweiWerteStr)-xPos)); .... Gruß oldmax |
Re: function mit zwei Rückgabewerten?
:shock: Alles in einen String umwandeln und zusammenfassen, und einen String zurueckgeben? :shock:
Mal abgesehn davon, dass ein einbeiniger Esel im Rueckwaertslaufen schneller sein wird als diese Implementierung, hast du noch ein Problem, wenn ich im Record einen String habe, der ein ; enthaelt. Dann musst du noch zusaetzlich alles Escapen. Weiters schwierig wirds dann, wenn ich im Record einen weiteren Record habe, oder andere Typen, die man nicht ohne groesseren Aufwand in Strings umwandeln kann. Sry, aber die string-Methode ist *etwas* [....] Mir faellt das richtige Wort dafuer nicht ein, aber strunzdoof kommt gut hin Zitat:
greetz Mike |
Re: function mit zwei Rückgabewerten?
Wie bitte? Du willst tatsächlich alles in einen String speichern? Du weißt schon, dass das unglaublich ineffezient ist? Erstmal muss Speicher für den String reserviert werden, dann wird der alte String in den neuen kopiert, dann wird der Wert (Integer, Float, wasweißich) nach String gecastet und in den String reingespeichert und beim auslesen das ganze nochmal umgekehrt und zusätzlich Schleifengefummel mit pos.
Das ist eine absolut unsaubere und langsame Methode. Benutze records oder vars, wobei ich eher zu records tendiere. Wenn du eine Variable nicht ändern willst, dann deklariere den Parameter einfach ohne var. Oder, falls du var brauchst, deklariere dir eine Hilfsvariable, in die du den Wert speicherst. Edit: @JasonDX: Das Wort ist "noobig". |
Re: function mit zwei Rückgabewerten?
Zitat:
|
Re: function mit zwei Rückgabewerten?
Zitat:
Hatte das weiter oben aus Zeitmangel bisschen falsch gehabt... :oops: |
Re: function mit zwei Rückgabewerten?
/ganz schön offtopic inzwischen
Zitat:
es ist kontraproduktiv, wenn ich erst schauen muss, zu welchem with die Variable jetzt gehört. Und ganz toll wird es bei verschachtelten with. Und hast Du mal mit D7 debuggen müssen, wenn im Code einige with drin sind? Der Debugger kann das dann nämlich nicht auflösen und zeigt beim drüberfahren keinen Wert für die Variable an.
Delphi-Quellcode:
ist das vielleicht übersichtlich?
with taMeineTabelle do
begin ...hier sind 20 Zeilen Code... Database := MeineDatenbank; TableName := MeineTabelle; Open; FieldByName ('MeinFeld').AsString := MeinString; ...hier ist nochmehr Code... end; |
Re: function mit zwei Rückgabewerten?
Zitat:
Delphi-Quellcode:
weitaus uebersichtlicher als das:
with MyContactlist.GetPerson('') do
begin FirstName := ''; SurName := ''; Address := ''; Age := 0; //... end;
Delphi-Quellcode:
Wie immer geht es also darum, wann, wo und wie ich das ganze verwende, und bei welcher Anwendung die Vorteile ueberwiegen.
MyContactlist.GetPerson('').FirstName := '';
MyContactlist.GetPerson('').SurName := ''; MyContactlist.GetPerson('').Address := ''; MyContactlist.GetPerson('').Age := 0;//... Um das nicht als Pure-OT-Post dastehn zu lassen: IMO sind ![]() ![]() greetz Mike PS: Gibts auch Programmierer, die nicht schreibfaul sind? :duck: ;) |
Re: function mit zwei Rückgabewerten?
Zitat:
|
Re: function mit zwei Rückgabewerten?
Zitat:
Delphi-Quellcode:
Da Nick Hodges jetzt der Delphi PM ist könnte sowas oder etwas ähnliches bald Einzug in Delphi finden.[1]
with person := MyContactlist.GetPerson('') do
begin person.FirstName := 'blabla' person.BlaBla... end; Er hasst with wahrscheinlich sogar noch mehr als ich und bereits ich bekomme davon allergischen Ausschlag... ;) [1]Wobei sie es ähnlich wie die Delphi.Net Generics, die ich bis jetzt gesehen habe absichtlich nicht wie in Chrome aussehen lassen werden. ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 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