Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Вывод результата с функции


Автор: ПЕЛ 8.8.2009, 00:49
Имеется некая функция, требуется вывести несколько значений переменных. Собственно вопрос как Result присвоить массив или список. И как в дальнейшим использовать такого рода функцию в теле программы? просто присваиваем результат массиву а оттуда уже "дергаем"?

Автор: Keeper89 8.8.2009, 00:55
Можно создать тип-массив и возвращать его экземпляр как результат функции.

Автор: Predator_2004 8.8.2009, 01:14
Или как вариант возвращать указатель на данные.

Автор: ПЕЛ 8.8.2009, 14:07
А можно привести пример простенького кода для реализации метода?  smile 

Автор: Rrader 8.8.2009, 14:18
Цитата(ПЕЛ @  8.8.2009,  06:49 Найти цитируемый пост)
И как в дальнейшим использовать такого рода функцию в теле программы? просто присваиваем результат массиву а оттуда уже "дергаем"? 

Код

procedure TForm1.Button2Click(Sender: TObject);
var
  A: TMyDataArray;
begin
  ShowMessageFmt('F: %d ; S: %d', [A[vtFirst], A[vtSecond]]);
end;

Можно так, а можно и напрямую:
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TVarTypes = (vtFirst, vtSecond);
  TMyDataArray = array[TVarTypes] of Integer;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ Возвращаем два значения в массиве }
function Foo: TMyDataArray;
begin
  Result[vtFirst] := 123;
  Result[vtSecond] := 345;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I, J: Integer;
begin
  I := Foo[vtFirst];
  J := Foo[vtSecond];
  ShowMessageFmt('I: %d ; J: %d', [I, J]);
end;

end.

Автор: THandle 8.8.2009, 14:24
Если данные какого-то одного типа и количество результатов неизвестно можно использовать массив:

Код

type
  TResultArray = Array Of Integer;

function Function1: TResultArray;


Можно так же использовать var и out параметры:
Код


procedure Function2(var AResult: TResultArray);
procedure Function3(out AResult: TResultArray);


Использовать не функции и процедуры. Плюс при таком подходе можно оставить Result под что-то еще(например под Boolean - правильно ли выполнилась функция или нет):

Код

function Function4(var AResult: TResultArray): Boolean;



Если типы разные я бы использовал какой нибудь TList или что-то в этом роде:

Код

procedure Function5(AResult: TList);


Если количество "результатов" ограничено и не очень велико, можно использовать записи:
Код


type
  TSomeResult = record
    FirstResultField: Integer;
    SecondResultField: Boolean;
  end;

function Function6: TSomeResult;


Или же прямо передавать var параметрами:
Код


procedure Function7(var FirstResult: Integer; var SecondResult: Boolean);


ИМХО, как-то так.

Автор: Rrader 8.8.2009, 14:47
Цитата(THandle @  8.8.2009,  20:24 Найти цитируемый пост)
Можно так же использовать var и out параметры:

Динамический массив всегда передается по ссылке, модификатор var излишен. А модификатор out будет давать Range Check в этом коде (кто знает, почему?) smile 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TResultArray = array of Integer;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure Function2(out AResult: TResultArray);
begin
  AResult[0] := 1234;
  AResult[1] := 5678;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  I: TResultArray;
begin
  SetLength(I, 2);
  Function2(I);
  ShowMessage(IntToStr(I[0]));
end;

end.

Автор: Qu1nt 8.8.2009, 16:23
Ибо вызывается:
Код

 call @DynArrayClear

А зачем? = )

Автор: ПЕЛ 9.8.2009, 20:47
Всем спс, разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)