Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Вниз

DLL   Найти похожие ветки 

 
ChcngerMan   (2004-03-12 13:40) [0]

Мне нужно, чтобы через Дллку появилось окно, делаю так:

Код самой длл:
library twain;

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, ImageEnView, ImageEnIO, ComCtrls,
 Options in "Options.pas" {Form1};
{$R *.res}

function ShowMyDialog: Boolean;
begin
 {Создаем экземпляр Form1 формы TForm1}
 Form1 := TForm1.Create(Application);
 {В Label1 выводим Msg}
 {Возвращаем True только если нажата OK (ModalResult = mrOk)}
 //Result := (Form1.ShowModal = mrOk);
 {Освобождаем память}
 
//  Form1.Free;
end;
EXPORTs ShowMyDialog;
end.

Код формы:

unit oPTIONS;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, ImageEnView, ImageEnIO, ComCtrls;

type
 TForm1 = class(TForm)
   ImageEnIO1: TImageEnIO;
   ImageEnView1: TImageEnView;
   Panel1: TPanel;
   GroupBox1: TGroupBox;
   CheckBox1: TCheckBox;
   GroupBox2: TGroupBox;
   ComboBox1: TComboBox;
   Label1: TLabel;
   Edit1: TEdit;
   Label2: TLabel;
   Edit2: TEdit;
   Label3: TLabel;
   ComboBox2: TComboBox;
   CheckBox2: TCheckBox;
   GroupBox3: TGroupBox;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Edit3: TEdit;
   Edit4: TEdit;
   Edit5: TEdit;
   Edit6: TEdit;
   Button1: TButton;
   Button2: TButton;
   ProgressBar1: TProgressBar;
   CheckBox3: TCheckBox;
   CheckBox4: TCheckBox;
   CheckBox5: TCheckBox;
   Button3: TButton;
   procedure FormActivate(Sender: TObject);
   procedure ComboBox1Change(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure ImageEnIO1Progress(Sender: TObject; per: Integer);
   procedure CheckBox5Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
   procedure FillBack; // copy twain parameters to the controls
   procedure FillIn; // copy controls to twain parameters
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
BitMap:TBitmap;
implementation

{$R *.DFM}

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
// fills TWain sources
for i:=0 to ImageEnIO1.TWainParams.SourceCount-1 do
   ComboBox1.Items.Add( ImageEnIO1.TWainParams.SourceName[i] );
  // Select first scanner
  ComboBox1.ItemIndex:=0;
  ImageEnIO1.TWainParams.SelectedSource:=ComboBox1.ItemIndex;
ImageEnIO1.TWainParams.AppVersionInfo:="1.0";
  ImageEnIO1.TWainParams.AppManufacturer:="Hyrix";
  ImageEnIO1.TWainParams.AppProductFamily:="Image processing";
  ImageEnIO1.TWainParams.AppProductName:="ImageEn demo";
  FillBack;
end;

// Select scanner
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ImageEnIO1.TWainParams.SelectedSource:=ComboBox1.ItemIndex;
  FillBack;
end;

// negotiate parameters (verify that scanner supports Frame rectangle, Dpi...)
procedure TForm1.Button2Click(Sender: TObject);
begin
FillIn;
  ImageEnIO1.TWainParams.Update; // verify here...
  FillBack;
end;

// copy twain parameters to the controls
procedure TForm1.FillBack;
const
COLORS:array [0..2] of string=("Black&White","GrayScale","RGB");
var
i:integer;
begin
  Edit1.Text:=FloatToStr( ImageEnIO1.TWainParams.YResolution.CurrentValue );
Edit2.Text:=FloatToStr( ImageEnIO1.TWainParams.XResolution.CurrentValue );
  // Fill Colors (0=B/W 1=GrayScale 2=RGB) combobox
  ComboBox2.Clear;
for i:=0 to ImageEnIO1.TWainParams.PixelType.Count-1 do
   ComboBox2.Items.Add( COLORS[ ImageEnIO1.TWainParams.PixelType[i] ] );
  ComboBox2.ItemIndex:=ImageEnIO1.TWainParams.PixelType.IndexOf(ImageEnIO1.TWainParams.PixelType.CurrentValue);
// frame
Edit3.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameLeft);
Edit4.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameTop);
  Edit5.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameRight);
  Edit6.Text:=FloatToStr(ImageEnIO1.TWainParams.AcquireFrameBottom);
end;

// copy controls values to twain parameters
procedure TForm1.FillIn;
begin
ImageEnIO1.TWainParams.VisibleDialog:=CheckBox1.Checked;
  ImageEnIO1.TWainParams.ProgressIndicators:=CheckBox2.Checked;
ImageEnIO1.TWainParams.AcquireFrameLeft:=StrToFloat( Edit3.Text );
ImageEnIO1.TWainParams.AcquireFrameTop:=StrToFloat( Edit4.Text );
  ImageEnIO1.TWainParams.AcquireFrameRight:=StrToFloat( Edit5.Text );
  ImageEnIO1.TWainParams.AcquireFrameBottom:=StrToFloat( Edit6.Text );
  ImageEnIO1.TWainParams.PixelType.CurrentValue:=ComboBox2.ItemIndex;
  ImageEnIO1.TWainParams.YResolution.CurrentValue:=StrToInt( edit1.text);
ImageEnIO1.TWainParams.XResolution.CurrentValue:=StrToInt( edit2.text);
  ImageEnIO1.TWainParams.BufferedTransfer:=CheckBox4.Checked;
end;

// Acquire
procedure TForm1.Button1Click(Sender: TObject);
begin
Bitmap.Width := 640 ;
Bitmap.Height := 480 ;
FillIn;
  ImageEnIO1.Acquire;
  ProgressBar1.Position:=0;
end;

// progress
procedure TForm1.ImageEnIO1Progress(Sender: TObject; per: Integer);
begin
ProgressBar1.Position:=per;
  if CheckBox3.Checked then begin
   ImageEnView1.Update;
   application.processmessages;
  end;
end;

// enable/disable acquire frame
procedure TForm1.CheckBox5Click(Sender: TObject);
begin
edit3.enabled:=CheckBox5.Checked;
edit4.enabled:=CheckBox5.Checked;
  edit5.enabled:=CheckBox5.Checked;
  edit6.enabled:=CheckBox5.Checked;
  ImageEnIO1.TWainParams.AcquireFrameEnabled:=CheckBox5.Checked;
  ImageEnIO1.TWainParams.Update;
FillBack;
end;


Так вот почему, когда я из своей программы вызываю показ этого окна, оно появляется, вот только никаких действий не выполняет, постоянно ошибки вылетают, хотя в проекте(программе) все работает нормально (все что на форме), а как вызваю то появляются ошибки

function ShowMyDialog: Boolean; stdcall; external "twain.DLL";

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
ShowMyDialog);
end;



Почему?


 
clickmaker ©   (2004-03-12 13:41) [1]

в длл
function ShowMyDialog: Boolean; stdcall;


 
Alx2 ©   (2004-03-12 13:43) [2]

Код не читал. Только секцию uses посмотрел. Попробуй поставить на первое место в uses модуль ShareMem. Причем hostе - в головной модуль.


 
Alx2 ©   (2004-03-12 13:45) [3]

>clickmaker ©   (12.03.04 13:41)
Точно. Спецификаторы разные. :)


 
ChcngerMan   (2004-03-12 13:58) [4]

Все сделал как сказали :)
Все равно ошибка(когда форма появляется)
тут:

procedure TForm1.FormActivate(Sender: TObject);
var
i:integer;
begin
// fills TWain sources
for i:=0 to ImageEnIO1.TWainParams.SourceCount-1 do
  ComboBox1.Items.Add( ImageEnIO1.TWainParams.SourceName[i] );
 // Select first scanner
 ComboBox1.ItemIndex:=0;
 ImageEnIO1.TWainParams.SelectedSource:=ComboBox1.ItemIndex;
ImageEnIO1.TWainParams.AppVersionInfo:="1.0";
 ImageEnIO1.TWainParams.AppManufacturer:="Hyrix";
 ImageEnIO1.TWainParams.AppProductFamily:="Image processing";
 ImageEnIO1.TWainParams.AppProductName:="ImageEn demo";
 FillBack;
end;

Из-за чго может быть?


 
evvcom   (2004-03-12 14:03) [5]

То что соглашения о вызовах разные - это в данном случае замечание, но на ошибку никак не влияет, т.к. функция эта без параметров. В данном случае stdcall и fastcall идентичны.

А трассировать свою dll пробовал? И что дает?


 
Alx2 ©   (2004-03-12 14:07) [6]

А что за ошибка?


 
ChcngerMan   (2004-03-12 14:10) [7]

"Access violation ..." :(


 
ChcngerMan   (2004-03-12 14:11) [8]

Еще пишет при закрытии: Invalid pointer operation


 
Alx2 ©   (2004-03-12 14:20) [9]

Кажется, нужно сделать где-то один раз Application.Initialize. Но, если не нужно раздельных экземпляров Application, лучше передавать его из приложения-хоста как параметр.


 
Alx2 ©   (2004-03-12 14:38) [10]

Сейчас проверил в простейшем случае. У меня работает без ошибок.

Есть вопросы: глобальная переменная BitMap где инициализируется? Или до procedure TForm1.Button1Click(Sender: TObject) дело пока не доходит?


 
ChcngerMan   (2004-03-12 21:29) [11]

До нее пока дело не дошло :)
Какие еще есть вариянты?
:(


 
ChcngerMan   (2004-03-12 21:45) [12]

Еще прикол в том, что весь код формы прекрасно работает, когда является просто формой программы, а как в Дллку ее запихал, появились такие вот ошибки


 
Defunct ©   (2004-03-13 00:42) [13]

Попробуйте:

Form1 := TForm1.Create(Nil);


 
ChcngerMan   (2004-03-13 12:10) [14]

Все равно глючит :(
А нужно самому вручную создавать свои объекты (точней компоненты), или можно просто на форму поставить???
Че то никак не пойму почему не работает :(


 
ChcngerMan   (2004-03-13 19:38) [15]

.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.036 c
3-1078463921
avkar
2004-03-05 08:18
2004.04.04
cxDBEdit


8-1070365735
Denis555
2003-12-02 14:48
2004.04.04
Медлительность TImage


3-1078920200
Kein
2004-03-10 15:03
2004.04.04
Сохранение массива в базе


4-1074793449
.Влад
2004-01-22 20:44
2004.04.04
информация по написанию плагинов.


3-1078070701
Desdechado
2004-02-29 19:05
2004.04.04
обработка BLOB-поля при сохранении изменений в ClientDataSet





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский