Текущий архив: 2006.10.01;
Скачать: CL | DM;
Вниз
Как из DLL изменить свойства объекта? Найти похожие ветки
← →
Blacksus (2006-09-10 19:55) [0]Как из DLL изменить свойства объекта в главном окне программы? Например когда пытаюсь изменить состояние прогрессбара(form1.progressbar1.Position:=i), то выскакивает ошибка EAccessViolation!
← →
Dmitrij_K (2006-09-10 19:59) [1]Из Dll нельзя обрацатся к объектам формы. Используй winapi или callback function
← →
Джо © (2006-09-10 20:16) [2]> [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.
Обращайся, сколько влезет :) Другое дело — нужно ли так делать...
← →
Джо © (2006-09-10 20:18) [3]> Blacksus
А какая нужда заставила желать странного?
← →
y-soft © (2006-09-10 20:27) [4]>Джо © (10.09.06 20:16) [2]
Обращайся, сколько влезет :)
Если скомпилировать Dll и приложение в разных версиях Delphi, то при таком подходе Access Violation практически гарантирован
Лучше уж передавать в Dll интерфейс или хендл, или вместо Dll использовать пакеты времени выполнения
← →
Джо © (2006-09-10 20:34) [5]> [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:39) [6]>Джо © (10.09.06 20:34) [5]
Я разве где-то сказал, что рекоммендую такой идиотский подход? :)
Вы привели редкий пример кода, который при компиляции в одном IDE сработает. Поверят ведь некоторые :)
← →
Blacksus (2006-09-12 00:47) [7]Дело в том, что некоторая функция выполняется внутри dll и ход ее выполнения нужно отразить в главном окне на прогрессбаре.
← →
Джо © (2006-09-12 01:55) [8]> [7] Blacksus (12.09.06 00:47)
> Дело в том, что некоторая функция выполняется внутри dll
> и ход ее выполнения нужно отразить в главном окне на прогрессбаре.
См.:
> [1] Dmitrij_K
"callback function".
← →
Джо © (2006-09-12 02:05) [9]Т.е, например, как-то так.
Библиотека.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.
← →
Blacksus (2006-09-13 08:30) [10]Большое спасибо.:)
Страницы: 1 вся ветка
Текущий архив: 2006.10.01;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.013 c