Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод результата с функции 
V
    Опции темы
ПЕЛ
  Дата 8.8.2009, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Имеется некая функция, требуется вывести несколько значений переменных. Собственно вопрос как Result присвоить массив или список. И как в дальнейшим использовать такого рода функцию в теле программы? просто присваиваем результат массиву а оттуда уже "дергаем"?
PM MAIL   Вверх
Keeper89
Дата 8.8.2009, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Можно создать тип-массив и возвращать его экземпляр как результат функции.


--------------------
PM MAIL WWW   Вверх
Predator_2004
Дата 8.8.2009, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 26.4.2007

Репутация: нет
Всего: нет



Или как вариант возвращать указатель на данные.
PM MAIL   Вверх
ПЕЛ
Дата 8.8.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



А можно привести пример простенького кода для реализации метода?  smile 
PM MAIL   Вверх
Rrader
  Дата 8.8.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Цитата(ПЕЛ @  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.


Это сообщение отредактировал(а) Rrader - 8.8.2009, 14:24


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
THandle
  Дата 8.8.2009, 14:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



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

Код

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);


ИМХО, как-то так.
PM   Вверх
Rrader
Дата 8.8.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 18
Всего: 191



Цитата(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.



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Qu1nt
Дата 8.8.2009, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Ибо вызывается:
Код

 call @DynArrayClear

А зачем? = )
PM MAIL   Вверх
ПЕЛ
Дата 9.8.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.8.2009

Репутация: нет
Всего: нет



Всем спс, разобрался.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0615 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.