Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2014, 20:02   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Получить в ответ от функции динамический массив

Подскажите, пожалуйста, как получить ответ от функции в виде динамического массива, который находится в отдельно Unit.
Код:
unit Unit1;

...

var
  Form1: TForm1;

implementation

uses Utils;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Answer: TMyDataArr; // Явно не так будет
  i: Integer;
  Item: TListItem;
begin
  Answer := Test('000#001#002#003#004#'); // Тут по другому будет заполнться

  for i := 0 to Length(Answer) - 1 do
  begin
    Item := ListView1.Items.Add;
    Item.Caption := Answer[i];
  end;
end;

end.

unit Utils;

interface

type
  TMyDataArr = record
    Para1: string;
    Para2: string;
  end;

var
  MyDataArr: array of TMyDataArr;

function Test(s: string): TMyDataArr;

implementation

function Test(s: string): TMyDataArr;
var
  i: Integer;
begin
  SetLength(Result, 0); // Incompatible types

  while Pos('#', s) <> 0 do
  begin
    i := High(Result) + 2; // Incompatible types
    SetLength(Result, i); // Incompatible types
    Result[i - 1] := Copy(s, 1, Pos('#', s) - 1); // Array type required
    Delete(s, 1, Pos('#', s));
  end;
end;

end.
Shouldercannon вне форума Ответить с цитированием
Старый 04.10.2014, 20:12   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
// Явно не так будет
Почему не так? ИМХО самэ так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2014, 20:15   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Почему не так? ИМХО самэ так.
До этого момента ещё дойти надо. Пока застрял на Utils.
Shouldercannon вне форума Ответить с цитированием
Старый 04.10.2014, 20:33   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Код:
SetLength(Result, 0); // result у тебя - не динмассив и не строка, а record TMyDataArr
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.10.2014, 20:49   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
unit Utils;

interface

type
  TMyDataRec= record
    Para1: string;
    Para2: string;
  end;
 TMyDataArr=array of TMyDataRec
var
  MyDataArr: array of TMyDataArr;

function Test(s: string): TMyDataArr;

implementation

function Test(s: string): TMyDataArr;
var
  i: Integer;
begin
  SetLength(Result, 0); 

  while Pos('#', s) <> 0 do
  begin
    i := High(Result) + 2; 
    SetLength(Result, i); 
    Result[i - 1] .Para1:= Copy(s, 1, Pos('#', s) - 1);
    Delete(s, 1, Pos('#', s));
  end;
end;
Годится?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2014, 21:05   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Годится?
Вполне годится

Теперь другая проблема появилась. Нужно каким-то образом прописать массив в поле потока, чтобы с ним можно было работать при синхронизации
Код:
type
  TGetUsers_Thread = class(TThread)
  private
    { Private declarations }
    s: string;
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
  end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetUsers_Thread := TGetUsers_Thread.Create(True);
  GetUsers_Thread.s := '0~qqq0~www0!end-name1~qqq1~www1!end-name2~qqq2~www2!end-name3~qqq3~www3!end-name4~qqq4~www4!end-name';
  GetUsers_Thread.FreeOnTerminate := True;
  GetUsers_Thread.Resume;
end;

procedure TGetUsers_Thread.Execute;
var
  Answer: TMyDataArr;
begin
  Answer := Test(s);
  Synchronize(SyncProc);

  Terminate;
end;

procedure TGetUsers_Thread.SyncProc;
var
  i: Integer;
  Item: TListItem;
begin
  for i := 0 to Length(Answer) - 1 do
  begin
    Item := Form1.ListView1.Items.Add;
    Item.Caption := Answer[i].Para1;
    Item.SubItems.Add(Answer[i].Para2);
  end;
end;

Последний раз редактировалось Shouldercannon; 04.10.2014 в 21:27.
Shouldercannon вне форума Ответить с цитированием
Старый 04.10.2014, 21:53   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Answer: TMyDataArr; опиши та же где у тебя описана s.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2014, 21:54   #8
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Answer: TMyDataArr; опиши та же где у тебя описана s.
В том и беда, что пробовал так и в ответ получил неопознанный идентификатор TMyDataArr
Shouldercannon вне форума Ответить с цитированием
Старый 04.10.2014, 22:21   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

И как же выглядели пробы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.10.2014, 22:24   #10
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
type
  TGetUsers_Thread = class(TThread)
  private
    { Private declarations }
    s: string;
    Answer: TMyDataArr; // Undeclared identifier: 'TMyDataArr'
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
  end;

procedure TGetUsers_Thread.Execute;
begin
  Answer := Test(s);
  Synchronize(SyncProc);

  Terminate;
end;

procedure TGetUsers_Thread.SyncProc;
var
  i: Integer;
  Item: TListItem;
begin
  for i := 0 to Length(Answer) - 1 do
  begin
    Item := Form1.ListView1.Items.Add;
    Item.Caption := Answer[i].Para1;
    Item.SubItems.Add(Answer[i].Para2);
  end;
end;

Последний раз редактировалось Shouldercannon; 04.10.2014 в 22:29.
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить в ответ от функции массив Shouldercannon Общие вопросы Delphi 12 04.10.2014 19:35
Создать динамический массив внутри функции так, чтобы он потом не уничтожился TwiX Общие вопросы Delphi 5 24.03.2012 23:04
Динамический массив - или всё таки не динамический? vedro-compota Общие вопросы C/C++ 30 10.12.2010 23:22
Как получить из функции массив LOST94 Общие вопросы C/C++ 6 28.03.2010 13:47
Можно ли вернуть динамический массив из функции? worldcentre Помощь студентам 2 06.12.2007 02:37