![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как из DLL изменить свойства объекта? [D7, WinXP]
Blacksus © (2006-09-10 19:55:00)Как из DLL изменить свойства объекта в главном окне программы? Например когда пытаюсь изменить состояние прогрессбара(form1.progressbar1.Position:=i), то выскакивает ошибка EAccessViolation!
Blacksus (2006-09-13 08:30:00) [1]Большое спасибо.:)
Джо (2006-09-12 02:05:00) [2]Т.е, например, как-то так.
Библиотека.
library Project1;
uses
SysUtils,
Classes;
{$R *.res}
type
// Прототип функции обратного вызова, метод объекта
TProgressProc = procedure (Current,Max: Integer) of object;
// Экспортируемая функция (call-back function)
// Параметром служит определяемая пользователем процедуры
// функция обратного вызова
procedure DoSomethingLong (ProgressProc: TProgressProc);
var
I: Integer;
begin
for I := 0 to 1000 do
begin
// вызываем ее на каждой итерации
ProgressProc (i,1000);
// чего-нибудь делаем :)
Sleep(5);
end;
end;
exports
DoSomethingLong;
begin
end.
Главная программа.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
ProgressBar1: TProgressBar;
procedure Button1Click(Sender: TObject);
private
// Наша call-back функция
procedure ProgressProc (Current,Max: Integer);
end;
TProgressProc = procedure (Current,Max: Integer) of object;
procedure DoSomethingLong (ProgressProc: TProgressProc);
external 'Project1.dll';
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
DoSomethingLong(ProgressProc);
end;
procedure TForm1.ProgressProc(Current, Max: Integer);
begin
ProgressBar1.Max := Max;
ProgressBar1.Position := Current
end;
end.
Джо (2006-09-12 01:55:00) [3]> [7] Blacksus (12.09.06 00:47)
> Дело в том, что некоторая функция выполняется внутри dll
> и ход ее выполнения нужно отразить в главном окне на прогрессбаре.
См.:
> [1] Dmitrij_K
"callback function".
Blacksus (2006-09-12 00:47:00) [4]Дело в том, что некоторая функция выполняется внутри dll и ход ее выполнения нужно отразить в главном окне на прогрессбаре.
y-soft (2006-09-10 20:39:00) [5]>Джо © (10.09.06 20:34) [5]
Я разве где-то сказал, что рекоммендую такой идиотский подход? :)
Вы привели редкий пример кода, который при компиляции в одном IDE сработает. Поверят ведь некоторые :)
Джо (2006-09-10 20:34:00) [6]> [4] y-soft © (10.09.06 20:27)
> >Джо © (10.09.06 20:16) [2]
>
> Обращайся, сколько влезет :)
>
> Если скомпилировать Dll и приложение в разных версиях Delphi,
> то при таком подходе Access Violation практически гарантирован
Совершенно согласен.
> Лучше уж передавать в Dll интерфейс или хендл, или вместо
> Dll использовать пакеты времени выполнения
Совершенно согласен.
Я разве где-то сказал, что рекоммендую такой идиотский подход? :)
y-soft (2006-09-10 20:27:00) [7]>Джо © (10.09.06 20:16) [2]
Обращайся, сколько влезет :)
Если скомпилировать Dll и приложение в разных версиях Delphi, то при таком подходе Access Violation практически гарантирован
Лучше уж передавать в Dll интерфейс или хендл, или вместо Dll использовать пакеты времени выполнения
Джо (2006-09-10 20:18:00) [8]> Blacksus
А какая нужда заставила желать странного?
Джо (2006-09-10 20:16:00) [9]> [1] Dmitrij_K (10.09.06 19:59)
> Из Dll нельзя обрацатся к объектам формы. Используй winapi
> или callback function
Ой-ой.
program Project1;
uses
ShareMem,
Windows,
SysUtils,
StdCtrls,
Forms;
procedure ManipulateEdit (Edit: TEdit); external 'Project2.dll';
var
Form: TForm;
Edit: TEdit;
begin
Form := TForm.Create(Application);
Form.Show;
Edit := TEdit.Create(Form);
Edit.Parent := Form;
ManipulateEdit(Edit);
Form.Repaint;
Sleep (5000)
end.
---
library Project2;
uses
ShareMem,
SysUtils,
StdCtrls;
{$R *.res}
procedure ManipulateEdit (Edit: TEdit);
begin
Edit.Text := 'Тут была DLL';
Edit.Left := 50;
Edit.Top := 50;
end;
exports
ManipulateEdit;
end.
Обращайся, сколько влезет :) Другое дело — нужно ли так делать...
Dmitrij_K (2006-09-10 19:59:00) [10]Из Dll нельзя обрацатся к объектам формы. Используй winapi или callback function