Avatar billede friiiiis Novice
29. september 2004 - 19:28 Der 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...
Avatar billede hrc Mester
30. september 2004 - 08:26 #1
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);
 

  try
    OptionsData.ComPort := 1;
    OptionsData.DeviceName := 'devicename';
    ReadOptions; // Read from registry
    OptionsForm.OptionsData := OptionsData;

    result := OptionsForm.ShowModal;

    if result = mrOK then
    begin
      OptionsData := OptionsForm.OptionsData;
      WriteOptions; // Write to registry
    end;
  finally
    OptionsForm.Free;
  end;
end;
Avatar billede hrc Mester
30. september 2004 - 08:28 #2
Der er egentlig heller ingen grund til at angive "stdcall" når jeg samtidigt angiver noget VCL-specifikt i min header - en løsning sådan midt imellem.
Avatar billede friiiiis Novice
30. september 2004 - 09:04 #3
Hej,

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....
Avatar billede hrc Mester
30. september 2004 - 11:59 #4
Det var bare et eksempel jeg lige kopierede (et som tilfældigvis virkede).

Hvordan kalder du dine "eksterne" forme? Er der mulighed for at angive en ejer (self eller handle), som du måske kalder med nil?
Avatar billede friiiiis Novice
30. september 2004 - 15:09 #5
Hej,

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?
Avatar billede friiiiis Novice
30. september 2004 - 15:34 #6
Jeg opretter DLL-filens form på følgende måde (efter korrektion fra dig):

function GetData(aOwner : TComponent):TExportTime; stdcall;
var
  DataFileImport_1 : TDataFileImport_1;
begin

  DataFileImport_1 := TDataFileImport_1.Create(aOwner);

  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..??
Avatar billede hrc Mester
30. september 2004 - 15:58 #7
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).
Avatar billede friiiiis Novice
30. september 2004 - 17:45 #8
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

  DataFileImport_1 := TDataFileImport_1.Create(aOwner);
Avatar billede friiiiis Novice
30. september 2004 - 17:47 #9
Sig iøvrigt til hvis du mener det her spøgsmål er mere værd end de 30 point... volder mig ret store kvaler...
Avatar billede hrc Mester
30. september 2004 - 23:36 #10
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)).
Avatar billede friiiiis Novice
04. oktober 2004 - 09:07 #11
Hej hrc,

har du fået min mail??
Avatar billede borrisholt Novice
06. oktober 2004 - 18:21 #12
Hvis du Sætter BorderStyle til bsToolWindow

Jens B
Avatar billede friiiiis Novice
07. oktober 2004 - 07:54 #13
Hej Borrisholt,

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??
Avatar billede borrisholt Novice
07. oktober 2004 - 08:01 #14
Hmmn .. DET ved jeg ikke jeg skal se hvad jeg kan gøre ved det ....

Skrive en ny feks ;-)

Jens B
Avatar billede friiiiis Novice
07. oktober 2004 - 08:01 #15
ShowWindow(OpenDialog1.Handle,SW_HIDE); virker nemlig ikke...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester