Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прогресс от DLL в TEdit, возрат из DLL итерацию в TEdit 
V
    Опции темы
Desperate
Дата 8.11.2018, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Всем привет! 
Уже сломал всю голову, вопрос вот в чем, 
в DLL есть простейшая процедура

procedure MyProc;
var i:integer;
begin
    for i:= 0 to 1000 do begin
        
         Sleep(10);
    end;
end;

В приложении вызываю процедуру и нужно каждую итерацию (i) отображать в TEdit.

пробовал параметром передать 
procedure MyProc(out str:string);
....
str:=inttostr(i);
...

ругается. 

Как можно реализовать?
Спасибо.
PM MAIL   Вверх
Hiori
Дата 9.11.2018, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 29.3.2016

Репутация: нет
Всего: нет



а передать в исполняемую процедуру собственно edit Вы не хотите?
аля 
Код
function MyProc(AObject: TObject): Boolean;

и потом вызывать подпихивая ей уже существующий на форме компонент
Код
MyProc( MyEdit );



Это сообщение отредактировал(а) Hiori - 9.11.2018, 09:25
PM MAIL   Вверх
Snowy
Дата 9.11.2018, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Если нужно передать число, то и передавай число. Зачем строку?
Если так уж нужно передавать именно текст, то используй PChar.
У dll собственный менеджер памяти и гонять между dll и приложением сложные объекты - плохая затея.
Нужно использовать примитивные или простые блоки данных.
String, а тем более TEdit к ним не относится.
Если так уж хочется гонять сложные объекты, то лучше использовать bpl, а не dll
PM MAIL   Вверх
Desperate
Дата 9.11.2018, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Snowy, я то не против, но задание данное мне гласит:
отображать каждое изменение (i) dll в TEdit на форме вызывающего приложения.

Как передать в процедуру DLL это понятно.
Как вернуть ИТОГОВЫЙ результат функции из DLL понятно.
А вот как возвращать каждое приращение в Edit(аля Прогресс). Вот тут и проблемка возникла. 
Текстовый результат т.к. предположил по причине того что Edit.Text хавает только текст.

Возможно есть вариант пробросить число с последующим его отображением в Edit?
PM MAIL   Вверх
Snowy
Дата 9.11.2018, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



То есть проблема в том, что тебе нужно из dll вызывать функцию в приложении?
Ну это можно сделать через callback или отправкой сообщений в основную форму.

В приложении и dll описываешь колбэк:
Код
type
  TCallBackInt = procedure(i: Integer);


В dll делаешь параметр типа колбэк:
Код
procedure MyProc(callback: TCallBackInt);
var
  i: Integer;
begin
  for i := 0 to 100 do begin
    callback(i);
    Sleep(10);
  end;
end;


Приложении реализуешь действия по колбэку:
Код

procedure CallBackInt(i: integer);
begin
  Form3.Edit1.Text := IntToStr(i);
  Application.ProcessMessages;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  MyProc(CallBackInt);
end;


PM MAIL   Вверх
Desperate
Дата 9.11.2018, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Ооо.  smile  
Похоже на истину. Вечерком попробую smile 
Спасибо. О таком варианте применения даже не подозревал.

Верно понимаю такой подход (объявление в типе процедуры) называется CallBack'ом?
PM MAIL   Вверх
Snowy
Дата 9.11.2018, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Да. Callback - это функция для обратного вызова. 
Как раз используется для реакций вызывающего на какие-либо действия.
Посмотри в википедии там подробнее расписано.

PM MAIL   Вверх
Desperate
Дата 9.11.2018, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Цитата(Snowy @ 9.11.2018,  16:55)
Да. Callback - это функция для обратного вызова. 
Как раз используется для реакций вызывающего на какие-либо действия.
Посмотри в википедии там подробнее расписано.

Благодарю.

Уже  нагуглил инфы.  smile 
До этого не знал как правильно обозвать механизм и ничего толком найти не мог
PM MAIL   Вверх
Desperate
Дата 10.11.2018, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Цитата(Snowy @ 9.11.2018,  14:38)
Код

procedure CallBackInt(i: integer);
begin
  Form3.Edit1.Text := IntToStr(i);
  Application.ProcessMessages;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  MyProc(CallBackInt);
end;

Блин, упирается в строчку 
MyProc(CallBackInt);
Ошибка Incompatible types:"Calling conventions differ"
 smile 
PM MAIL   Вверх
Desperate
Дата 12.11.2018, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 11.10.2006

Репутация: нет
Всего: -1



Цитата(Snowy @ 9.11.2018,  14:38)
То есть проблема в том, что тебе нужно из dll вызывать функцию в приложении?
Ну это можно сделать через callback или отправкой сообщений в основную форму.

В приложении и dll описываешь колбэк:
Код
type
  TCallBackInt = procedure(i: Integer);


В dll делаешь параметр типа колбэк:
Код
procedure MyProc(callback: TCallBackInt);
var
  i: Integer;
begin
  for i := 0 to 100 do begin
    callback(i);
    Sleep(10);
  end;
end;


Приложении реализуешь действия по колбэку:
Код

procedure CallBackInt(i: integer);
begin
  Form3.Edit1.Text := IntToStr(i);
  Application.ProcessMessages;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  MyProc(CallBackInt);
end;

Все. Вопрос решен. Заработало smile 

По коду маааленькая правочка
В приложении и dll описываешь колбэк:
Код
type
  TCallBackInt = procedure(i: Integer) of object;


И после этого делфя собрала проект.
PM MAIL   Вверх
Snowy
Дата 12.11.2018, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



of object нужен в том случае, если это не процедура, а метод объекта (формы).
Если он сам по себе, то не нужно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1511 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.