Главная страница
    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.47 MB
Время: 0.013 c
15-1158158519
Vlad Oshin
2006-09-13 18:41
2006.10.01
нашел письмо


3-1154020959
a123
2006-07-27 21:22
2006.10.01
Комментарии в SQL запросах


2-1158012114
AndrejG
2006-09-12 02:01
2006.10.01
Как сделать форму прозрачной?


1-1156147536
webpauk
2006-08-21 12:05
2006.10.01
Диагональная заливка


2-1158250956
ph0sgen
2006-09-14 20:22
2006.10.01
перевести тип с С++ на Delphi





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский