29. september 2004 - 19:28Der er
13 kommentarer og 2 løsninger
Forme i DLL og Processlinien
Hej,
Jeg har lavet en række DLL-filer der alle indeholder forme... Når jeg starter en DLL-fil op med en form, så ser det ud som om jeg starter endnu et program op i windows ved at der kommer et nyt aktivt program (DLL-filen med formen) nederst i processlinien - hvordan undgår jeg det? - sådan at kun "hovedprogrammet" kan ses som værende aktivt...
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
Er det ikke noget med at du ikke får tilkoblet dit hovedprograms handle?
Når jeg kalder mine Delphi-kreerede DLL-filer så sender jeg "self" med over i kaldet der opretter og viser dll-formen (kunne sikkert nøjes med at sende self.handle, hvilket ville gøre den mere "kompatibel" med andre programmer):
function Properties(aOwner : TComponent): integer; stdcall; var OptionsForm : TOptionsForm; begin // Kunne sikkert oprette med create(nil) og så sætte handle bagefter så jeg slap // for at angive noget VCL-specifikt i min Property-header OptionsForm := TOptionsForm.Create(aOwner);
ja, det ser jo tydeligt ud til at du ved hvad du har med at gøre... det gør jeg bare ikke helt..., he, he, så jeg prøver lige og ser om jeg kan få det til at virke....
nu har jeg prøvet og jeg kan ikke få det det til at virke...
I den unit der er knyttet til formen, skal jeg ikke koble mit handle ind i den..?? I dit tilfælde "aOwner".. altså formen i min DLL-fil skal åbnes og knyttes til handlet "aOwner".. Hvordan gør jeg det inde i unit i DLL-filen der er knyttet til formen?
if DataFileImport_1.OpenDialog1.Execute then begin AssignFile(F1, DataFileImport_1.OpenDialog1.Filename); DataFileImport_1.FileNameString := DataFileImport_1.OpenDialog1.Filename; if FileExists(DataFileImport_1.OpenDialog1.Filename) then DataFileImport_1.Showmodal; end else .....
Både OpenDialog1 dialogboksen og den efterfølgende form bliver oprettet som et selvstændigt program nede i processlinien... Hvad gør jeg forkert..??
Det ved jeg dælme ikke. Du kalder sådan her "GetData(self);" ovre fra din form, ikke?
TDataFileImport_1 - Er det en TForm nedarving eller er det bare en klasse hvorfra du opretter en TOpenDialog og viser den?
Hvis det er det sidste, så kan du prøve at sætte den's Parent = aOwner - har ikke testet det og har ikke tid, da jeg skal ned til et førstehjælpskursus (det har sikkert noget at gøre med de ansattes gennemsnitsalder).
Jo, jeg kalder vha. GetData(self) i selve hovedprogrammet... men virker stadigvæk ikke...
koden til formen i DLL-filen ser sådan ud:
type TForm1 = class(TForm) private { Private declarations } public { Public declarations } end;
skal det ændres???
ved iøvrigt ikke hvad du mener med TForm nedarvning eller "klasse hvorfra du opretter en TOpenDialog"?? Formen i DLL filen er bare en Form der er indsat i DLL filen...
Koden i selve DLL-filens kode ser således ud:
library Project1;
uses SysUtils, Classes, forms, Unit1 in 'Unit1.pas' {DataFileImport_1};
{$R *.RES}
function GetData(aOwner : TComponent):TExportTime; stdcall; var DataFileImport_1 : TDataFileImport_1; begin
Det ser jo rigtigt nok ud. Vil det være forkert om jeg så sourcen til din dll-fil? Hvis du synes kan du sende den på hrc_public@hotmail...
Det jeg mente var om din DataFileImport_1 var en nedarving af eksempelvis TObject (DataFileImport_1 = class(TObject)) eller om den stammede fra TForm (DataFileImport_1 = class(TForm)).
Så virker det!! Tak... så mangler jeg lige et svar fra dig...
Forresten - hvis jeg benytter en "OpenDialog" så vil dialogboxen til OpenDialog blive oprette som endnu et aktivt program nede processlinien - hvad gør jeg ved det??
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.