Прежде всего, поздравляю всех с наступившим Новым годом и приближающимся рождеством.
А теперь суть проблемы.
Есть библиотека в которой хранится форма с 13-ю фрэймами на которых размещены различные контролы (RadioButton, Label, Edit...). В процессе работы с этой формой осуществляется переход по фреймам (что-то вроде Wizard-а). В результате формируется строка, которую необходимо передать при закрытии формы в приложение из которого она была вызвана. Я использовал стандартный метод. Однако, необходимо использовать стиль оформления XP. Помещая компонент (Delphi 7) или присоединяя манифест (что в принципе одно и тоже) после завершения работы с программой появляется следующее сообщение: ..\Project1.exe raised too many consecutive exeptions.... Если число фрэймов не более двух, то всё работает нормально. Пробовал с панелями, но не помогло.
ЧТО ДЕЛАТЬ???
Код формы в DLL:
| Код | unit uClassForm;
interface
uses Windows, StdCtrls, ComCtrls, Controls, ExtCtrls, Classes, Forms;
type TClassForm = class(TForm) BRestBtn: TButton; BBackBtn: TButton; BNextBtn: TButton; BExitBtn: TButton; Panel0: TPanel; Label01: TLabel; Label02: TLabel; RadioButton01: TRadioButton; RadioButton02: TRadioButton; Bevel1: TBevel; PanelA1: TPanel; LabelA11: TLabel; LabelA12: TLabel; Bevel2: TBevel; RadioButtonA11: TRadioButton; RadioButtonA12: TRadioButton; PanelA2: TPanel; LabelA21: TLabel; LabelA22: TLabel; Bevel3: TBevel; RadioButtonA21: TRadioButton; RadioButtonA22: TRadioButton; GroupBoxA2: TGroupBox; RadioButtonA23: TRadioButton; RadioButtonA24: TRadioButton; PanelG1: TPanel; LabelG11: TLabel; LabelG12: TLabel; Bevel4: TBevel; RadioButtonG11: TRadioButton; RadioButtonG12: TRadioButton; RadioButtonG13: TRadioButton; PanelG2: TPanel; LabelG21: TLabel; LabelG22: TLabel; Bevel5: TBevel; RadioButtonG21: TRadioButton; RadioButtonG22: TRadioButton; RadioButtonG23: TRadioButton; PanelG3: TPanel; LabelG31: TLabel; LabelG32: TLabel; Bevel6: TBevel; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;
var ClassForm: TClassForm; ClssID:ShortString; CurrentFrm:integer;
procedure CreateClassForm(AppHandle: THandle); stdcall; function GetLabelText:ShortString; stdcall; procedure DestroyClassForm; stdcall;
implementation
{$R *.dfm}
//---Экспортируемые процедуры и функции-----------------------------------------
procedure CreateClassForm(AppHandle: THandle); begin Application.Handle:=AppHandle; ClassForm:=TClassForm.Create(Application); ClassForm.ShowModal; end;
function GetLabelText:ShortString; begin // Result:=ClssID; end;
procedure DestroyClassForm; begin ClassForm.Free; end;
//---Внутренние процедуры и функции---------------------------------------------
procedure TClassForm.FormCreate(Sender: TObject); begin Panel01.BringToFront; end;
procedure TClassForm.BNextBtnClick(Sender: TObject); var i:integer; begin //переходы но фрэймам ClssID:=LabelR3.Caption; Close; end;
end;
|
Код DLL:
| Код | library classdef;
uses ShareMem, SysUtils, Classes, uClassForm in 'uClassForm.pas' {ClassForm};
{$R *.res}
exports CreateClassForm, GetLabelText, DestroyClassForm;
begin end.
|
Код приложения:
| Код | unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, XPMan;
type TForm1 = class(TForm) Button1: TButton; Bevel1: TBevel; Label1: TLabel; Label2: TLabel; XPManifest1: TXPManifest; procedure Button1Click(Sender: TObject); function DecodeClassID1(ClassificationID:string):string; private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure CreateClassForm(AppHandle: THandle); stdcall; external 'classdef.dll'; function GetLabelText:ShortString; stdcall; external 'classdef.dll'; procedure DestroyClassForm; stdcall; external 'classdef.dll';
procedure TForm1.Button1Click(Sender: TObject); var IDRT:string; begin CreateClassForm(Application.Handle); IDRT:=GetLabelText; DestroyClassForm; Label2.Caption:=IDRT; end;
end;
|
|