Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi function mit zwei Rückgabewerten? (https://www.delphipraxis.net/75739-function-mit-zwei-rueckgabewerten.html)

H4ndy 24. Aug 2006 11:43

Re: function mit zwei Rückgabewerten?
 
Zitat:

Zitat von Hansi
Nur wird diese 2x durchlaufen.
Wie kann ich das verhindern?

Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;

Also with ... do finde ich nicht soo toll, da kann man fix mal durcheinander kommen :?
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;

DGL-luke 24. Aug 2006 11:49

Re: function mit zwei Rückgabewerten?
 
Ihr castet einen string auf einen record? find ich jetzt sehr gewagt... :shock:

EDIT: uppsala... sorry, verlesen :oops:

---Bernhard--- 24. Aug 2006 11:52

Re: function mit zwei Rückgabewerten?
 
Hi!

Muss kurz was richtig stellen
Zitat:

Zitat von Neutral General
1. Function gibt ein Record zurück

Delphi-Quellcode:
ABC = record
 A: String
 B: Integer;
 C: Boolean;
end;

function GetaABC: ABC;
begin
 ABC.A := 'Hallo';
 ABC.B := 22;
 ABC.C := true;
end;

Du musst 'result' verwenden:
Delphi-Quellcode:
ABC = record
  A: String
  B: Integer;
  C: Boolean;
end;

function GetABC: ABC;
begin
  result.A := 'Hallo';
  result.B := 22;
  result.C := true;
end;
Und dann hätte ich noch nen kleinen Vorschlag um das Zwischenspeichern des Records zu vermeiden, nämlich die Verwendung von "with .. do .." :

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  with GetABC do
  begin
    showmessage(A);
    showmessage(IntToStr(B));
    showmessage(BoolToStr(C, true));
  end;
end;
edit: ups, der with do Vorschlag hatte ja schon jemand gepostet :oops:

RavenIV 24. Aug 2006 11:56

Re: function mit zwei Rückgabewerten?
 
Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;

Das mit dem with macht die ganze Sache noch unübersichtlicher.
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.

Die beste Lösung bisher ist das mit dem Ergebnis := ...

jfheins 24. Aug 2006 12:04

Re: function mit zwei Rückgabewerten?
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;

Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.

Ich wette dagegen, ich glaube, Delphi legt eine Variable an, mit dem Inhalt und greift immer darauf zu ... :mrgreen:

JasonDX 24. Aug 2006 12:06

Re: function mit zwei Rückgabewerten?
 
Zitat:

Zitat von RavenIV
Das mit dem with macht die ganze Sache noch unübersichtlicher.
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.

Nee, ganz sicher nicht. with ist mehr eine Hilfe beim programmieren, der Compiler schert sich (grob gesehn) so gut wie gar nicht drum, ob da jetzt ein with steht oder ned. Fuer ihn ist es beides mal das selbe. Naemlich wird das Ergebnis auf den Stack gepusht, und er greift dann ueber [esp+offset] auf die einzelnen Elemente zu.

greetz
Mike

ManuMF 24. Aug 2006 12:06

Re: function mit zwei Rückgabewerten?
 
@RavenIV: genau.
Hier noch mal dazu mein Code von oben:

Zitat:

Zitat von ManuMF
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Rueckgabe: TStringAndInt;
begin
  Rueckgabe := Test;
  Showmessage(Rueckgabe.rString + ' ' + IntToStr(Rueckgabe.rInteger));
end;


3_of_8 24. Aug 2006 12:19

Re: function mit zwei Rückgabewerten?
 
Zitat:

Zitat von RavenIV
Zitat:

Zitat von 3_of_8
Delphi-Quellcode:
with test(Edit1.Text) do
begin
  s := test_String;
  i := test_Integer;
end;

Das mit dem with macht die ganze Sache noch unübersichtlicher.
Und die Funktion wird trotzdem 2x durchlaufen, weil 2x darauf zugrgriffen wird.

Die beste Lösung bisher ist das mit dem Ergebnis := ...

Unsinn.

Delphi-Quellcode:
with test('wuppdi') do
begin
showmessage(inttostr(i));
showmessage(s);
end;
wird zu:
Delphi-Quellcode:
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
No further comment.

oldmax 24. Aug 2006 12:26

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:
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;
Aufruf im Programm
Delphi-Quellcode:
.....
ZweiWerteStr:=Machwas(einString);
StringAntwort:=Copy(ZweiWerteStr,1, Pos(';',ZweiWerteStr)-1);
ZahlAntwort:=StrToInt(Copy(ZweiWerteStr, Pos(';',ZweiWerteStr)+1,Length(ZweiWerteStr)-Pos(';',ZweiWerteStr)));

....
Zugegeben, etwas kompliziert, daher ersetze ich meist bei solchen sachen das Ergebnis Pos(...) unter Zuhilfenahme von xPos

Delphi-Quellcode:
....
xPos:=Pos(';',ZweiWerteStr);
StringAntwort:=Copy(ZweiWerteStr,1, xPos-1);
ZahlAntwort:=StrToInt(Copy(ZweiWerteStr, xPos+1,Length(ZweiWerteStr)-xPos));
....
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.
Gruß oldmax

JasonDX 24. Aug 2006 12:47

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:

Zitat von oldmax
Der Nachteil der Parameterübergabe mit Vatist, das du sehr schnell eine Variable veränderst, die du gar nicht geändert haben möchtest.

Na ja, bei der Ergebnisvariable waer schon ganz gut, wenn die Prozedur/Funktion diese veraendern wurde :gruebel:

greetz
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 2 von 3     12 3      

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