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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.07.2015, 08:30   #1
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию Вызов процедуры из процедуры

Имеется код:
Код:
procedure TForm1.Chromium1LoadEnd(Sender: TObject;
  const browser: ICefBrowser; const frame: ICefFrame;
  httpStatusCode: Integer);
begin
 if (frame <> nil) and frame.IsMain  then
 begin
    frame.GetSourceProc(callback); //здесь возникает ошибка
  end;
end;
 
procedure callback(const str: ustring);
begin
  Form1.Memo1.Lines.Add(str);
end;
Возникает ошибка:
Incompatible types: 'method pointer and regular procedure'
Вроде как обе процедуры прописаны
Код:
type
TForm1 = class(TForm)
...
procedure callback(const str: ustring);
procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser;
      const frame: ICefFrame; httpStatusCode: Integer);
Прошу помощи, что я сделал не так?

Последний раз редактировалось vipok72; 28.07.2015 в 08:59.
vipok72 вне форума Ответить с цитированием
Старый 28.07.2015, 08:54   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Пиши procedure TForm1.callback(const str: ustring); раз у тебя требует метод
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.07.2015, 09:03   #3
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Пиши procedure TForm1.callback(const str: ustring); раз у тебя требует метод
Судя по тому что я знаю, в type для Form1 не надо перед названием процедуры писать TForm1 ибо выкинет ошибку, так и произошло)
попробовал написать еще и
Код:
frame.GetSourceProc(Form1.callback);
толку ноль
vipok72 вне форума Ответить с цитированием
Старый 28.07.2015, 09:38   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

существуют процедуры как процедуры (regular procedure)
и существуют процедуры-методы какого либо класса (method).

Код:
procedure callback(const str: stinng);
begin
...
end;
ПРИМЕР regular procedure (она не входит не в один класс!!!)

Код:
Tform1 =class
...
procedure callback(const str: string);

end;

procedure TForm1.callback(const str: string);
begin
...
end;
ПРИМЕР процедуры-метода входящей в класс TForm1.

Цитата:
Пиши procedure TForm1.callback(const str: ustring);
TForm1 надо писать не при использовании(вызове) а при реализации(при написании кода процедуры).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.07.2015 в 09:45.
evg_m вне форума Ответить с цитированием
Старый 28.07.2015, 09:57   #5
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
существуют процедуры как процедуры (regular procedure)
и существуют процедуры-методы какого либо класса (method).

Код:
procedure callback(const str: stinng);
begin
...
end;
ПРИМЕР regular procedure (она не входит не в один класс!!!)

Код:
Tform1 =class
...
procedure callback(const str: string);

end;

procedure TForm1.callback(const str: string);
begin
...
end;
ПРИМЕР процедуры-метода входящей в класс TForm1.


TForm1 надо писать не при использовании(вызове) а при реализации(при написании кода процедуры).
Чувствую себя пнем, ладно, как это понял я:
Нужно под классом TForm1 создать еще один класс с названием
Код:
TChromium = class
//сразу под ним собстна и написать
procedure callback(const str: string);
//далее private public и end;
еще есть вариант:
Ничего не менять кроме того что внутри процедуры TForm1.Chromium1LoadEnd обращаться к callback как Form1.callback
vipok72 вне форума Ответить с цитированием
Старый 28.07.2015, 10:47   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
frame.GetSourceProc(callback); //здесь возникает ошибка
Покажи КАК объявлена GetSourceProc ?!
Код:
type
  TXX =procedure(const str: string); //МЫ Объявили тип REGULAR PROCEDURE c одним параметром
.......
procedure GetSourceProc(proc: TXXX);
Так (с точностью до замены имен)?!
------------------------------------------------------------------
Теперь для передачи туда НАМ нужна та самая
procedure CallBack(const str: string);
НО!!!
транслятор при разборе строки
frame.GetSourceProc(callback);
пытается понять что же это за чудо имя такое callback
И "вспоминает" что раньше (ВЫШЕ ПО ТЕКСТУ) у него было
Tform1 =class
procedure Callback(const str: string);
end;
Вроде бы тоже самое, НО это METHOD а не REGULAR PROCEDURE.
А других упоминаний такого имени callback ЕЩЕ(выше разбираемой строки) НЕ БЫЛО!

решение
Вар. 1.
ПЕРЕНЕСТИ код
Код:
procedure callback(const str: string);
begin
...
end;
по тексту ВЫШЕ кода использующего данную процедуру.
и при получении следующей ошибки
Цитата:
[Error]Unsatisfied forward or external declaration: 'Tform1.Callback'
Убрать из TForm1
procedure Callback(const str: string);

Вар 2. ПОСЛЕ описания TForm1 добавить ПРЕДВАРИТЕЛЬНОЕ (forward) объявление нашей процедуры
Код:
type
TForm1 =class
...
end;

procedure Callback(const str: string);

implementation
+ замечание из вар 1 об удалении ( в данном случае сводится к выносу объявления из класса!!)
переводу объявления из method в regular procedure

Вар 3.
Изменить объявление GetSourceProc, точнее тип ее параметра, чтобы туда передавать method.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.07.2015 в 10:54.
evg_m вне форума Ответить с цитированием
Старый 28.07.2015, 11:43   #7
vipok72
Пользователь
 
Регистрация: 26.07.2015
Сообщений: 59
По умолчанию

Спасибо за помощь!
Вариант 1 помог, очень благодарен вам
vipok72 вне форума Ответить с цитированием
Старый 28.07.2015, 11:50   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
Восклицание

Код:
type
      TForm1 = class(TForm)
            ...
      private
            procedure callback(const str: ustring);
            procedure Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; const frame: ICefFrame; httpStatusCode: Integer);
      end;

...

procedure TForm1.callback(const str: string);
begin
...
end;

...

frame.GetSourceProc(callback);

...
В вашем коде в первом посте нету "TForm1." - отсюда и ошибка.

Опоздал, ну да ладно.

Последний раз редактировалось ResourceSpace; 28.07.2015 в 11:52. Причина: опоздал
ResourceSpace вне форума Ответить с цитированием
Старый 28.07.2015, 16:48   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Вариант 1 помог, очень благодарен вам
Хотя ВЕРНЫМ(правильным) был Вар 3.
Изменить тип параметра GetSourceProc, так чтобы передавать method класса TForm1.
Код:
type
TXX =procedure(const str: string) of object; // тип method с одним параметром.
И далее воспользоваться #4, #2.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 28.07.2015, 18:23   #10
саша40
Участник клуба
 
Регистрация: 12.09.2012
Сообщений: 1,030
По умолчанию

Цитата:
Сообщение от vipok72 Посмотреть сообщение
Имеется код:
Прошу помощи, что я сделал не так?
Там где ты передаешь процедуру в качестве параметра напиши это:
Код:
callback^
На это и указывает код ошибки.
Что нужно программисту: Компьютер, Среда программирование, Воображение, Прямые руки, Мозги, Знания этой среды программирования.
Программист-это профессия, а программирование-это моё хобби.
саша40 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов процедуры из процедуры bilibian Общие вопросы Delphi 13 18.07.2014 15:31
C#, вызов процедуры nikitaivanov Помощь студентам 2 30.03.2013 19:58
Вызов процедуры. Leo20 Общие вопросы Delphi 11 23.11.2009 16:30
Вызов процедуры igbizon Общие вопросы Delphi 5 02.09.2008 10:44
Вызов процедуры Илья Кибель Помощь студентам 7 17.09.2007 19:43