Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.055 c
8-1142330520
dracula
2006-03-14 13:02
2006.10.01
ISO 9660 информация о сессиях и трэках?


2-1157791558
oleg_v
2006-09-09 12:45
2006.10.01
DBGridEh и селект


2-1157965203
Opilki_Inside
2006-09-11 13:00
2006.10.01
Как перевести байты в килобайты и мегобайты


2-1158128767
kirik
2006-09-13 10:26
2006.10.01
Record и String: Жить им вместе?


2-1158135307
Chaser
2006-09-13 12:15
2006.10.01
Как определить скорость копирования файла по сети