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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2017, 17:26   #1
rumawiyu
Новичок
Джуниор
 
Регистрация: 22.01.2017
Сообщений: 6
По умолчанию regular procedure and method pointer

Добрый день!

Код:
unit Unit1;

interface

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

type
  TmyTh = class;

  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    procedure doGetURL(sender: TMyTh);
    procedure doLoadedURL(sender: TMyTh);
  public
    { Public declarations }
  end;

  TNotifyThred = procedure(senerThread: TMyTh);

  TmyTh = class(TThread)
  private
    http: TIdHTTP;
    FOnGetURL, FOnLoadedURL: TNotifyThred;
    FGetURL: TNotifyThred;
    FcurrURL: string;
    FLoadedURL: TNotifyThred;
    procedure GetURL;
    procedure LoadedURL;
  public
    property OnGetURL: TNotifyThred write FGetURL;
    property OnLoadedURL: TNotifyThred write FLoadedURL;
    property URL: string read FcurrURL write FcurrURL;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TmyTh }

procedure TmyTh.execute;
begin
  while terminated do
  begin
    Synchronize(self.GetURL);
    if self.FcurrURL = '' then
      Break;
    http.Get(self.FcurrURL);
    Synchronize(self.LoadedURL);
  end;
end;

procedure TmyTh.GetURL;
begin
  self.FonGetURL(self);
end;

procedure TmyTh.LoadedURL;
begin
  self.FonLoadedURL(self);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  th1: TMyTh;
begin
  th1 := TMyTh.Create;
  th1.OnGetURL := self.DoGetURL;
  th1.OnLoadedURL := self.DoLoadedURL;
end;

procedure TForm1.doGetURL(sender: TMyTh);
var
  j: integer;
begin
  for j := 0 to self.Memo1.Lines.count - 1 do
  begin
    if self.Memo1.Lines.Objects[j] = nil then
    begin
      self.memo1.lines.objects[j] := sender;
      sender.URL := self.memo1.Lines[j];
      break;
    end;
  end;
end;

procedure TForm1.doLoadedURL(sender: TMyTh);
var
  j: integer;
begin
  j := self.memo1.Lines.Indexof(sender.URL);
  if j < 0 then

  else if self.memo1.lines.objects[j] = sender then
  begin
    self.memo1.lines.Delete(j);
  end;
end;

end.
на строках

Код:
  th1.OnGetURL := self.DoGetURL;
  th1.OnLoadedURL := self.DoLoadedURL;
ошибка

Цитата:
E2009 Incompatible types: 'regular procedure and method pointer'
как поправить?
rumawiyu вне форума Ответить с цитированием
Старый 22.01.2017, 17:39   #2
Replicant
Форумчанин
 
Аватар для Replicant
 
Регистрация: 17.08.2009
Сообщений: 139
По умолчанию

Выдерните из типа TForm1 = class(TForm)
Код:
    procedure doGetURL(sender: TMyTh);
    procedure doLoadedURL(sender: TMyTh);
Сделайте их процедурами а не методами и все заработает, за исключением остальных ошибок.
Replicant вне форума Ответить с цитированием
Старый 22.01.2017, 17:41   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
  TNotifyThred = procedure(senerThrea;d: TMyTh);  // regular procedure
  TNotifyThred = procedure(senerThread: TMyTh) of object;  // method of object
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 22.01.2017, 18:16   #4
rumawiyu
Новичок
Джуниор
 
Регистрация: 22.01.2017
Сообщений: 6
По умолчанию

Код:
unit Unit1;

interface

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

type
  TmyTh = class;

  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    procedure doGetURL(sender: TMyTh);
    procedure doLoadedURL(sender: TMyTh);
  public
    { Public declarations }
  end;

  TNotifyThred = procedure(senerThread: TMyTh) of object;

  TmyTh = class(TThread)
  private
    http: TIdHTTP;
    FOnGetURL, FOnLoadedURL: TNotifyThred;
    FGetURL: TNotifyThred;
    FcurrURL: string;
    FLoadedURL: TNotifyThred;
    procedure GetURL;
    procedure LoadedURL;
  public
    property OnGetURL: TNotifyThred write FGetURL;
    property OnLoadedURL: TNotifyThred write FLoadedURL;
    property URL: string read FcurrURL write FcurrURL;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TmyTh }

procedure TmyTh.execute;
begin
  while terminated do
  begin
    Synchronize(self.GetURL);
    if self.FcurrURL = '' then
      Break;
    http.Get(self.FcurrURL);
    Synchronize(self.LoadedURL);
  end;
end;

procedure TmyTh.GetURL;
begin
  self.FonGetURL(self);
end;

procedure TmyTh.LoadedURL;
begin
  self.FonLoadedURL(self);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  th1: TMyTh;
begin
  th1 := TMyTh.Create;
  th1.OnGetURL := self.DoGetURL;
  th1.OnLoadedURL := self.DoLoadedURL;
end;

procedure TForm1.doGetURL(sender: TMyTh);
var
  j: integer;
begin
  for j := 0 to self.Memo1.Lines.count - 1 do
  begin
    if self.Memo1.Lines.Objects[j] = nil then
    begin
      self.memo1.lines.objects[j] := sender;
      sender.URL := self.memo1.Lines[j];
      break;
    end;
  end;
end;

procedure TForm1.doLoadedURL(sender: TMyTh);
var
  j: integer;
begin
  j := self.memo1.Lines.Indexof(sender.URL);
  if j < 0 then

  else if self.memo1.lines.objects[j] = sender then
  begin
    self.memo1.lines.Delete(j);
  end;
end;

end.
Компилируется, но почему-то не хочет работать...
rumawiyu вне форума Ответить с цитированием
Старый 23.01.2017, 09:40   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
th1 := TMyTh.Create;
// и ВСЕ теперь уже НАЧАЛ работать Execute ( если стоит "автозапуск" ).
Код:
 while terminated do
  begin
    Synchronize(self.GetURL); // а здесь нет ничего => AV (Access Violation) и конец работы потока
    if self.FcurrURL = '' then 
      Break;
    http.Get(self.FcurrURL);// а тут!  http ведь не был создан (:=THttp.Create) и стало быть опять AV со всеми вытекающими
th1.OnGetURL := self.DoGetURL; // и вот теперь когда поток уже не работает мы начинаем его настраивать :(
а если "автозапуска" нет, то мы не начнем работу даже и после настройки (нет кода по запуску потока).
смотри Resume и параметры Create.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.01.2017, 16:31   #6
rumawiyu
Новичок
Джуниор
 
Регистрация: 22.01.2017
Сообщений: 6
По умолчанию

Цитата:
http ведь не был создан
это уже сам потом заметил)
Цитата:
а если "автозапуска" нет, то мы не начнем работу даже и после настройки (нет кода по запуску потока).
А вот про это не понял что не так...
rumawiyu вне форума Ответить с цитированием
Старый 24.01.2017, 16:35   #7
rumawiyu
Новичок
Джуниор
 
Регистрация: 22.01.2017
Сообщений: 6
По умолчанию

Код:
th1 := TMyTh.Create(true);
th1.OnGetURL := self.DoGetURL;
th1.OnLoadedURL := self.DoLoadedURL;
так чтоли правильно будет?
rumawiyu вне форума Ответить с цитированием
Старый 24.01.2017, 16:40   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
смотри Resume и параметры Create.
Delphi7 Example
Цитата:
This example shows how to create a thread and start it running at a lower priority than the main execution thread. It assumes that the thread’s FreeOnTerminate property is True, so that there is no need to free the thread when it finishes.

Код:
var 

  SecondProcess: TMyThread; { TMyThread is a custom descendant of TThread }
begin
  SecondProcess := TMyThread.Create(True); { create suspended – secondprocess does not run yet } "автозапуска" нет
  SecondProcess.Priority := tpLower; { set the priority to lower than normal }
  SecondProcess.Resume; { now run the thread } запуск потока ПОСЛЕ настройки
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 24.01.2017, 16:47   #9
rumawiyu
Новичок
Джуниор
 
Регистрация: 22.01.2017
Сообщений: 6
По умолчанию

Код:
unit Unit1;

interface

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

type
  TmyTh = class;

  TForm1 = class(TForm)
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    procedure doGetURL(sender: TMyTh);
    procedure doLoadedURL(sender: TMyTh);
  public
    { Public declarations }
  end;

  TNotifyThred = procedure(senerThread: TMyTh) of object;

  TmyTh = class(TThread)
  private
    http: TIdHTTP;
    FOnGetURL, FOnLoadedURL: TNotifyThred;
    FGetURL: TNotifyThred;
    FcurrURL: string;
    FLoadedURL: TNotifyThred;
    procedure GetURL;
    procedure LoadedURL;
  public
    property OnGetURL: TNotifyThred write FGetURL;
    property OnLoadedURL: TNotifyThred write FLoadedURL;
    property URL: string read FcurrURL write FcurrURL;
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TmyTh }

procedure TmyTh.execute;
begin
  http := TIdHTTP.Create(nil);
  while terminated do
  begin
    Synchronize(self.GetURL);
    if self.FcurrURL = '' then
      Break;
    http.Get(self.FcurrURL);
    Synchronize(self.LoadedURL);
  end;
  http.Free;
end;

procedure TmyTh.GetURL;
begin
  self.FonGetURL(self);
end;

procedure TmyTh.LoadedURL;
begin
  self.FonLoadedURL(self);
end;

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var
  th1: TMyTh;
begin
  th1 := TMyTh.Create(true);
  th1.OnGetURL := self.DoGetURL;
  th1.OnLoadedURL := self.DoLoadedURL;
  th1.Resume;
end;

procedure TForm1.doGetURL(sender: TMyTh);
var
  j: integer;
begin
  for j := 0 to self.Memo1.Lines.count - 1 do
  begin
    if self.Memo1.Lines.Objects[j] = nil then
    begin
      self.memo1.lines.objects[j] := sender;
      sender.URL := self.memo1.Lines[j];
      break;
    end;
  end;
end;

procedure TForm1.doLoadedURL(sender: TMyTh);
var
  j: integer;
begin
  j := self.memo1.Lines.Indexof(sender.URL);
  if j < 0 then

  else if self.memo1.lines.objects[j] = sender then
  begin
    self.memo1.lines.Delete(j);
  end;
end;

end.
соровно почему-то не хочет работать...
rumawiyu вне форума Ответить с цитированием
Старый 24.01.2017, 20:44   #10
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Цитата:
Сообщение от rumawiyu Посмотреть сообщение
соровно почему-то не хочет работать...
Что такое "соровно"???
kropotkina-alice вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
string and procedure untyped pointer or untyped parameter UKRtortik Общие вопросы Delphi 1 09.06.2014 10:14
Error: regular procedure and method pointer noname_06 Общие вопросы Delphi 11 19.05.2013 04:06
Regular expression - найти последнюю точку и три символа после неё Enfiol C# (си шарп) 5 28.04.2012 08:58
[DCC Error] Project2.dpr(22): E2009 Incompatible types: 'method pointer and regular procedure' TwiX Общие вопросы Delphi 1 15.02.2010 09:14
Есть ли в делфи regular expression? TwiX Общие вопросы Delphi 3 29.07.2009 07:36