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

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

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

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

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

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

Имеется
Код:
unit frm_Main;

interface

...

type
  // Поток для получения списка пользователей
  TGetUsers_Thread = class(TThread)
  private
    { Private declarations }
    URL: string;
    Users: TUsersDataArr;
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
  end;

var
  FormMain: TFormMain;
  GetUsers_Thread: TGetUsers_Thread;

implementation

{$R *.dfm}
//------------------------Получение списка пользователей------------------------
procedure TFormMain.Button1Click(Sender: TObject);
begin
  GetUsers_Thread := TGetUsers_Thread.Create(True);
  GetUsers_Thread.URL := 'http://localhost/getusers.php';
  GetUsers_Thread.FreeOnTerminate := True;
  GetUsers_Thread.Start;
end;

procedure TGetUsers_Thread.Execute;
begin
  Users := GetUsers(URL);

  Synchronize(SyncProc);

  Terminate;
end;

procedure TGetUsers_Thread.SyncProc;
begin
  FillUserList(Users, FormMain.LVUsers);
end;

end.

unit Utils;

interface

uses
  System.SysUtils, System.Classes, IdHTTP, Vcl.ExtCtrls, Vcl.ComCtrls;

type
  TUsersDataRec = Record
    UserID: Integer;
    Status: Integer;
    Nick: String;
    Department: String;
    Cabinet: String;
    AdminFlags: String;
    IP: String;
    AddToList: Boolean;
  end;

  TUsersDataArr = Array of TUsersDataRec;

var
  UsersDataArr: Array of TUsersDataArr;

function GetUsers(URL: String): TUsersDataArr;
procedure FillUserList(var Arr: TMyArray; LV: TListView);

implementation

uses frm_Main;

function GetUsers(URL: String): TUsersDataArr;
var
  HTTP: TIdHTTP;
  SS: TStringStream;
  s: String;
  I: Integer;
begin
  try
    HTTP := TIdHTTP.Create(nil);
    HTTP.ConnectTimeout := 5000;
    SS := TStringStream.Create('');
    try
      HTTP.Get(URL, SS);
      SS.Position := 0;
      s := Utf8ToAnsi(RawByteString(SS.DataString));
    except
    end;
  finally
    FreeAndNil(HTTP);
    FreeAndNil(SS);
  end;

  SetLength(Result, 0); // Очистим массив

  while Pos(SeparatorNick, s) <> 0 do
  begin
    I := High(Result) + 2;
    SetLength(Result, i);
    Result[I - 1].UserID := StrToIntDef(Copy(s, 1, Pos('~', s) - 1), -1);
    Delete(s, 1, Pos('~', s));
    Result[I - 1].Status := StrToIntDef(Copy(s, 1, Pos('~', s) - 1), -1);
    Delete(s, 1, Pos('~', s));
    Result[I - 1].Nick := Copy(s, 1, Pos('~', s) - 1);
    Delete(s, 1, Pos('~', s));
    Result[I - 1].Department := Copy(s, 1, Pos('~', s) - 1);
    Delete(s, 1, Pos('~', s));
    Result[I - 1].Cabinet := Copy(s, 1, Pos('~', s) - 1);
    Delete(s, 1, Pos('~', s));
    Result[I - 1].AdminFlags := Copy(s, 1, Pos('~', s) - 1);
    Delete(s, 1, Pos('~', s));
    Result[I - 1].IP := Copy(s, 1, Pos(SeparatorNick, s) - 1);
    Delete(s, 1, Pos(SeparatorNick, s) + 8);
    Result[I - 1].AddToList := True;
  end;
end;

procedure FillUserList(var Arr: TMyArray; LV: TListView);
var
  Item: TListItem;
  I: Integer;
begin
  LV.Items.Clear;
  LV.SortType := stNone;
  LV.Items.BeginUpdate;
  // Добавляем только Online пользователей
  for I := 0 to Length(Arr) - 1 do
  begin
    if Arr[I].Status = 1 then
    begin
      Item := LV.Items.Add;
      Item.Caption := '';
      Item.SubItems.Add(Arr[I].Nick); // Ник пользователя
      Item.SubItems.Add(Arr[I].Department); // Отделение
      Item.SubItems.Add(Arr[I].Cabinet); // Кабинет
      Item.SubItems.Add(IntToStr(Arr[I].UserID)); // ID пользователя
    end;
  end;

  LV.SortType := stBoth;
  LV.Items.EndUpdate;
end;

end.
В execute потока через
Код:
function GetUsers(URL: String): TUsersDataArr;
получаю список пользователей. Дальше в процедуре синхронизации потока хочу полученный от функции массив передать в процедуру
Код:
procedure FillUserList(var Arr: TMyArray; LV: TListView);
чтобы заполнить ListView. Не додумаюсь, как правильно прописать параметр процедуры var Arr: TMyArray

Последний раз редактировалось Shouldercannon; 01.12.2016 в 20:21.
Shouldercannon вне форума Ответить с цитированием
Старый 01.12.2016, 17:51   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

users типа TUsersDataArr. Зачем там TMyArray, если он TUsersDataArr?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 01.12.2016, 18:00   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
users типа TUsersDataArr. Зачем там TMyArray, если он TUsersDataArr?
Сначала вызывается Users в теле потока, потом в синхронизации потока этот Users передать в FillUserList. Как сие разрулить?
Shouldercannon вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать динамический массив Tbitmap в процедуру Armageddets Мультимедиа в Delphi 3 21.06.2014 19:29
Как вызвать процедуру из другого Unit pavellyba Общие вопросы Delphi 7 01.05.2011 01:35
Как из одного Unit вызвать форму другого Unit'a? alexusankov Общие вопросы Delphi 4 10.01.2011 10:54
можно ли передать динамический массив в процедуру "по значению" ? vedro-compota Общие вопросы Delphi 2 05.05.2010 23:11
Передать параметр в процедуру VistaSV30 Microsoft Office Access 2 18.12.2009 20:45