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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2011, 14:51   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию Привязать ProgressBar к динамически созданному IdHTTP

Так ProgressBar привязывается не к динамически созданному IdHTTP
Код:
const
  MY_MESS = WM_USER + 100;
...
procedure MyProgress(var msg: TMessage); message MY_MESS;
...
procedure TFormMain.MyProgress(var msg: TMessage);
begin
  case msg.WParam of
  0: begin
    ProgressBar3.Max := msg.LParam;
    ProgressBar3.Position := 0;
  end;

  1: ProgressBar3.Position := msg.LParam;
  end;
end;

procedure TFormMain.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  PostMessage(FormMain.Handle, MY_MESS, 1, AWorkCount);
end;

procedure TFormMain.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
  PostMessage(FormMain.Handle, MY_MESS, 0, AWorkCountMax);
end;
Как сделать тоже самое, но для динамически созданного IdHTTP?
Shouldercannon вне форума Ответить с цитированием
Старый 03.12.2011, 15:13   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

вот куски из моего проекта:
поток:
Код:
  FWTrayIcon,
  NativeXml;

const
  UPD_PROGRESS_MAX = WM_USER + 1;
  UPD_PROGRESS = WM_USER + 2;

type
  TSelfUpdateThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure HttpWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
  public
  end;


....

procedure TSelfUpdateThread.HttpWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
begin
  if AWorkMode = WmRead then
    SendMessage(SelfUpdatingForm.Handle, UPD_PROGRESS, 0, AWorkCount);
end;

procedure TSelfUpdateThread.HTTPWorkBegin(Sender: TObject;
  AWorkMode: TWorkMode; const AWorkCountMax: Integer);
begin
  if AWorkMode = WmRead then
    SendMessage(SelfUpdatingForm.Handle, UPD_PROGRESS_MAX, 0, AWorkCountMax);
end;

procedure TSelfUpdateThread.HTTPWorkEnd(Sender: TObject;
  AWorkMode: TWorkMode);
begin
  SendMessage(SelfUpdatingForm.Handle, UPD_PROGRESS, 0, 0);
  SendMessage(SelfUpdatingForm.Handle, UPD_PROGRESS_MAX, 0, 0);
end;

procedure TSelfUpdateThread.GetHttpFile(aFile, aDestDir: string);
var
  http: TIdHTTP;
  sFile: TMemoryStream;
begin
  sFile := TMemoryStream.Create;
  http := TIdHTTP.Create(nil);
  try
    Http.OnWork := HttpWork;
    http.OnWorkBegin := HTTPWorkBegin;
    http.OnWorkEnd := HTTPWorkEnd;
    try
      StatusMessage('Загрузка данных...');
      http.Get(aFile, sFile);
      sFile.SaveToFile(aDestDir);
    except
      Terminate;
    end;
  finally
    http.Free;
    sFile.Free;
  end;
end;
Форма:
Код:
const
  UPD_PROGRESS_MAX = WM_USER + 1;
  UPD_PROGRESS = WM_USER + 2;
...
    procedure SetProgressMax(var msg: TMessage); message UPD_PROGRESS_MAX;
    procedure SetProgress(var msg: TMessage); message UPD_PROGRESS;

...

{Исп. компонент TGauge вкладка Samples} 
procedure TSelfUpdatingForm.SetProgress(var msg: TMessage);
begin
  FileProgress.Progress := msg.LParam;
  Msg.Result := 1;
end;

procedure TSelfUpdatingForm.SetProgressMax(var msg: TMessage);
begin
  FileProgress.MaxValue := msg.LParam;
  msg.Result := 1;
end;

Последний раз редактировалось Человек_Борща; 03.12.2011 в 15:17.
Человек_Борща вне форума Ответить с цитированием
Старый 04.12.2011, 10:42   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

Возникли проблемы с вызовом GetHttpFile
Код:
procedure TSelfUpdateThread.GetHttpFile(aFile, aDestDir: string);
добавил в
Код:
type
  TSelfUpdateThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure HttpWork(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    procedure HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    procedure HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
    procedure GetHttpFile(aFile, aDestDir: string);
  public
  end;
Пытался вызвать так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
  GetHttpFile('http://img.yandex.net/i/www/logo.png', 'C:\'); // Ошибка
  Form1.GetHttpFile('http://img.yandex.net/i/www/logo.png', 'C:\'); // Ошибка
  SelfUpdateThread.GetHttpFile('http://img.yandex.net/i/www/logo.png', 'C:\'); // Ошибка
end;
Shouldercannon вне форума Ответить с цитированием
Старый 04.12.2011, 13:41   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

И что за ошибки? У меня все как часы...
Человек_Борща вне форума Ответить с цитированием
Старый 04.12.2011, 16:39   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,899
По умолчанию

В каждом случае разная. Всётаки как правильно применить
Код:
TSelfUpdatingForm.SetProgress
Хоть один из выше приведённых способов привилен?
Shouldercannon вне форума Ответить с цитированием
Старый 04.12.2011, 17:38   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Вот вам простой пример, как из потока отправлять прогресс(см. вложение).


А передавать прогресс из динам. idHHTP очень просто, просто используя его обработчики события OnWorkBegin.OnWork,OnWorkEnd.
динамически их назначив в потоке созданному компоненту.

Чтобы получить эти обработчики, нужно сам компонент поставить на форму и дабл-кликом вызвать нужные обработчики, скопировать их и обявить в секции private у потока, затем там вписать код отправки данных на форму, а при создании idHTTP в потоке, назначить ему, его же события только уже обьявленые из потока.

В куске модуля потока показно как это делать.
Вложения
Тип файла: rar SimpleMsgFromThread.rar (154.0 Кб, 54 просмотров)

Последний раз редактировалось Человек_Борща; 04.12.2011 в 17:40.
Человек_Борща вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Привязать процедуру к динамически созданной картинке Marsel737 Общие вопросы Delphi 7 27.07.2012 19:19
Как привязать таблицу нового modal окна к Dataset динамически созданного родительского окна? delphicoding Общие вопросы Delphi 6 02.10.2011 22:41
Как обратиться к динамически созданному объекту, изменить его? 2bfree Общие вопросы Delphi 3 24.07.2011 14:06
Обратится к объекту, созданному динамически StrToFloat Помощь студентам 6 20.01.2010 18:53
Как в ProgressBar отобразить процесс выполнения Post запроса через Idhttp Joe_Tribbiani Работа с сетью в Delphi 8 15.06.2009 10:39