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


Автор: d10gtr 2.11.2007, 18:44
В потоке мне нужно использовать Событие Redirect у компонента IDhttp1
Когда я делаю это на форме- это выглядит так:
Код

type
  TForm1 = class(TForm)
    IdHTTP1: TIdHTTP;
    procedure IdHTTP1Redirect(Sender: TObject; var dest: String;
      var NumRedirect: Integer; var Handled: Boolean;
      var VMethod: TIdHTTPMethod);
....


procedure TForm1.IdHTTP1Redirect(Sender: TObject; var dest: String;
  var NumRedirect: Integer; var Handled: Boolean;
  var VMethod: TIdHTTPMethod);
begin
  showmessage('');
end;


А как создать процедуру в потоке? если я просто напишу procedure IdHTTP1Redirect(Sender: TObject........... в разделе Type то выдает ошибку [Error] Unit2.pas(12): Unsatisfied forward or external declaration: 'SSS.IdHTTP1Redirect'


Подскажите плз как Пользоваться процедцрами компонентов в потоке

Автор: bems 2.11.2007, 20:31
Цитата(d10gtr @  2.11.2007,  18:44 Найти цитируемый пост)
Unsatisfied forward or external declaration: 'SSS.IdHTTP1Redirect'
ну это просто означает что ты добавил описание метода, но не предоставил реализации

это есть
Цитата(d10gtr @  2.11.2007,  18:44 Найти цитируемый пост)
procedure IdHTTP1Redirect(Sender: TObject; var dest: String;
      var NumRedirect: Integer; var Handled: Boolean;
      var VMethod: TIdHTTPMethod);


а аналога этого нет
Цитата(d10gtr @  2.11.2007,  18:44 Найти цитируемый пост)
procedure TForm1.IdHTTP1Redirect(Sender: TObject; var dest: String;
  var NumRedirect: Integer; var Handled: Boolean;
  var VMethod: TIdHTTPMethod);
begin
  showmessage('');
end;


Автор: d10gtr 4.11.2007, 17:31
Вот почему ничего не работает?

Когда я делаю это в форме,то событие срабатывает, а в потоке не хочет...Подскажите пожалуйста


Код

unit Unit2;

interface

uses
  Classes,SysUtils,IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  IdBaseComponent,  StdCtrls,Dialogs;


type
  LaLa = class(TThread)
    idHTTP1:TidHTTP;
      procedure IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation
     Uses Unit1;





procedure LaLa.Execute;
begin
idHTTP1 := TidHTTP.Create(nil);
  { Place thread code here }
  form1.Memo1.Text:=idhttp1.Get('http://forum.vingrad.ru/');
end;



procedure LaLa.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
showmessage('Сообщение');
end;
end.


Автор: X-Vlad 5.11.2007, 11:07
Код

unit Unit2;

interface

uses
  Classes,SysUtils,IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  IdBaseComponent,  StdCtrls,Dialogs;


type
  LaLa = class(TThread)
    idHTTP1:TidHTTP;
  private
      procedure IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
         const AStatusText: String);
      procedure YouMessage(aMsg: string);
  protected
    procedure Execute; override;
  end;

implementation
     Uses Unit1;

procedure LaLa.Execute;
begin
  idHTTP1 := TidHTTP.Create(nil);
  idHTTP1.OnStatus := IdHTTP1Status;

  idhttp1.Get('http://forum.vingrad.ru/');
end;

procedure LaLa.YouMessage(aMsg: string);
begin
  showmessage(aMsg);
end;

procedure LaLa.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: String);
begin
  Synchronize(YouMessage('Сообщение'));
end;

end.

Автор: MetalFan 5.11.2007, 11:17
X-Vlad, а ничего, что в Synchronize надо метод, а не процедуру передавать?

Добавлено через 55 секунд
Цитата(d10gtr @  4.11.2007,  17:31 Найти цитируемый пост)
form1.Memo1.Text:=idhttp1.Get('http://forum.vingrad.ru/');

а так в потоке делать ни в коем случае нельзя

Автор: X-Vlad 5.11.2007, 11:25
Цитата(MetalFan @ 5.11.2007,  10:17)
X-Vlad, а ничего, что в Synchronize надо метод, а не процедуру передавать?

Добавлено @ 11:18
Цитата(d10gtr @  4.11.2007,  17:31 Найти цитируемый пост)
form1.Memo1.Text:=idhttp1.Get('http://forum.vingrad.ru/');

а так в потоке делать ни в коем случае нельзя

согласен. неувидел. ))))

Автор: d10gtr 5.11.2007, 14:57
X-Vlad я попробовал твой пример,но ничего не вышло...Вылетает ошибка...

 
[Error] Unit2.pas(40): There is no overloaded version of 'Synchronize' that can be called with these arguments


Что делать?





Автор: X-Vlad 5.11.2007, 19:24
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP,
  IdBaseComponent;

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

  LaLa = class(TThread)
    idHTTP1: TidHTTP;
  private
    FMsg : string;
    procedure IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
      const AStatusText: String);
    procedure YouMessage;
    procedure GetPageInfo;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

{$R *.DFM}  

implementation

procedure lala.GetPageInfo;
begin
  form1.Memo1.Text := idhttp1.Get('http://forum.vingrad.ru/');
end;

procedure LaLa.Execute;
begin
  idHTTP1 := TidHTTP.Create(nil);
  idHTTP1.OnStatus := IdHTTP1Status;

  Synchronize(GetPageInfo);
end;

procedure LaLa.YouMessage;
begin
  showmessage(FMsg);
end;

procedure LaLa.IdHTTP1Status(ASender: TObject; const AStatus: TIdStatus;
  const AStatusText: String);
begin
  FMsg := Format('Status %s', [AStatusText]);
  Synchronize(YouMessage);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  l: lala;
begin
  l := lala.Create(False);
end;

end.

Автор: d10gtr 5.11.2007, 19:41
Большое спасибо...
 smile 

Автор: MetalFan 5.11.2007, 20:18
нет никакого смысла использовать потоки в данном примере

Автор: d10gtr 6.11.2007, 17:29
Знаю, мне в качестве примера надо

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