[Delphi] Funkcja z wieloma Resultami

0

Jakis czas temu pytalem sie czy jest taka mozliwosc zeby funkcja zwracala wiecej niz jeden result i wymyslilem :-) Moze nie dokonca sa to rozne resulty bo zawsze to jest ta sama zmienna ale to juz chyba cos :-)

function aaa : TStrings;
begin
result := TStringList.Create;
result.Add('aaa');
result.Add('sss');
//tu mozna do bolu :-)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(aaa.Strings[1])
end;

--
pozdrawiam PEDROS {hello}

Encyklopedia was potrzebuje:
www.4programmers.net/delphi/help.php

Delphi 6 Personal.

0

Dodre dobre :)
wykorzystam to moze :)--||===

0

A gdzie wstawić Result.Free.
co będzie jeśli funkcje wywołasz 1 000 000 razy.

0

Chyba jednak wolę wykorzystać procedury i przekazywanie obiektu TStrings przez var.--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

0

a nie mozna by po prostu użyć rekordów ?

0

To się podłącze do tematu bo mam pytania:

  1. Czy funkcja może zwrócić Array of Byte ?
  2. Czy funkcja może zmienić wielkość (SetLength())
    wprowadzonego do niej argumentu typu: var Array of Byte ?

Próbowałem wiele razy znaleŹć rozwiązanie i
nic z tego ale może jakoś się da to obejść ?

0

Ad. 1

  function Test: TArray;
  begin
    SetLength(Result, 2);
  end;

var
  a: TArray;
begin
  a := Test;
  a[1] := 10;
  ShowMessage(IntToStr(a[1]));
end;

Ad. 2

  procedure Test(var a: TArray);
  begin
    SetLength(a, 2);
  end;

var
  a: TArray;
begin
  Test(a);
  a[1] := 10;
  ShowMessage(IntToStr(a[1]));
end;
0

hmm..... na początku nie wiedziałem o co chodzi z tym TArray :-D
ale w końcu wpadłem na pomysł żeby dać na górze unitu:

type TArray = Array of Byte; 

ahh te braki w moim wykształceniu [glowa] , dziękuję [browar]

0

Lepiej chyba zrobić, żeby funkcja zwracała rekord. A jeszcze lepiej wskaźnik do rekordu. Będzie najbardziej elegancko, najmniej pamięciożernie (chyba), i bardziej przejrzyście.

0

Ups. Zapomniałem napisać, że to TArray to jest array of Byte :)
A co do wskaźników. Niestety thenkles nie masz racji. Rekordy już są przekazywane jako wskaźniki (jak napiszesz var) tylko Delphi to przed nami ukrywa. Dzięki temu właśnie wygląda to tak elegancko. Jakbyś teraz dorzucił jeszcze wskaźniki... To już byłby koszmar.

0

Jakbyś teraz dorzucił jeszcze wskaźniki... To już byłby koszmar.

Koszmar pod jakim względem? Zużycia pamięci? Czy przejrzystości kodu? Chodziło mi o coś w rodzaju:

type
PDane=^TDane;
TDane=record
Pole1:Integer;
Pole2:Integer;
end;

// I teraz mamy np. funkcję:
function Test:PDane;
begin
New(Result);
Result^.Pole1:=20;
Result^.Pole2:=30;
end;

O ile mi wiadomo, takie coś jest powszechnie wykorzystywanenp. w pluginach w profesjonalnych programach. Mógłbyś więc rozwinąć ten temat?

0

Przejrzystości kodu.
Chodzi o coś takiego:

procedure Test(var X: TDane);
begin
  X.Pole1 := 2;
end;

var
  A: TDane;
begin
  Test(A);
end;

To jest równoważne temu:

procedure Test(X: PDane);
begin
  X^.Pole1 := 2;
end;

var
  A: TDane;
begin
  Test(@A);
end;

Ponieważ maksymalny rozmiar jaki można przekazać w zwykły sposób przez stos lub rejestry to 4 bajty. Wobec tego struktury takie jak ten rekord są przekazywane w rzeczywistości przez wskaźniki.
To co ty już napisałeś, to jest rezerwacja pamięci dla zmiennej, więc to wyglądałoby już inaczej. Tutaj mielibyśmy już przekopiowanie danych, gdybyśmy zastosowali TDane zamiast PDane.

0

Jeeeeee.... wreszcie skumałem o co chodzi
z daszkami i małpami ;-)

type
  TStr = ^String;
  TWsk = ^TAry;
  TRec = record
    Str : ^TStr;
  end;
  TAry = Array of ^TRec;

function Test(p: TStr): TWsk;
begin
  New(Result);
  SetLength(Result^,1);
  New(Result^[0]);
  with Result^[0]^ do begin
    New(Str); New(Str^); 
    Str^^ := p^;
  end;
end;

A teraz konkluzja :-D

var
  Wsk : TWsk;
  s : String;
begin
  s := 'Bla bla';
  Wsk := Test(@s);
  ShowMessage(Wsk^[0]^.Str^^);
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1