![]() |
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 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