Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Grosse Probleme mit delphi-dll. (https://www.delphipraxis.net/74886-grosse-probleme-mit-delphi-dll.html)

Explorer 10. Aug 2006 08:39


Grosse Probleme mit delphi-dll.
 
Hallo Forum,
ich habe eine kleine dll geschrieben, die ein InfoFenster mit einem Panel öffnet.
Nun möchte ich die Breite dieses Panels bei geöffnetem InfoFenster verändern, bekomme dies aber partout nicht hin.
Wie aktualisiere ich das Panel im InfoFenster, ohne das bestehende Fenster schließen und neu aufbauen zu müssen.

Im voraus Dank für die Mühe.

Gruß

Karlheinz


Quelltext:
----------


Delphi-Quellcode:
unit dll_mit_Fenster;

interface

uses
  ShareMem, inifiles, Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, ComCtrls, StdCtrls, Buttons, ExtCtrls,
  IdBaseComponent, IdMessage;

type
  TKischAlles = class(TComponent)
  KischFenster : TForm;
  KischPanel : TPanel;

  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;

  Procedure ErstelleFenster(PanelBreite: Integer);

  private
  public { Public declarations }

  end;


///*** die DLL-Deklarationen
function ZeigeFenster(const PanelBreite :Integer) : Integer; stdcall; export;


implementation



constructor TKischAlles.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 KischFenster := TForm.Create(nil);
 KischPanel := Tpanel.Create(nil);
 end;


destructor TKischAlles.Destroy;
begin
 KischFenster.Free;
 KischPanel.Free;
 inherited Destroy;
end;


Procedure TKischAlles.ErstelleFenster(PanelBreite: Integer);
begin
 KischFenster.Top := 200;
 KischFenster.Left := 200;
 KischFenster.Height := 300;
 KischFenster.Width := 500;
 KischFenster.Caption := 'Jippi-ey-hey.';

 KischPanel.Parent := KischFenster;

 KischPanel.Top := 100;
 KischPanel.Left := 100;
 KischPanel.Height := 20;
 KischPanel.Width := PanelBreite;
 KischPanel.Caption := '0,0 % Fett';
 KischFenster.Show;
end;


///*** die DLL-Definitionen
function ZeigeFenster(const PanelBreite :Integer) : Integer; stdcall; export;
var
KischAlles : TKischAlles;
begin
 KischAlles := TKischAlles.Create(nil);
 KischAlles.ErstelleFenster(Panelbreite);
 Result := 0;
end;



end.
[edit=Jelly]Delphi Tags ergänzt... Mfg, Jelly[/edit]

jbg 10. Aug 2006 11:29

Re: Grosse Probleme mit delphi-dll.
 
Zitat:

Zitat von Explorer
Nun möchte ich die Breite dieses Panels bei geöffnetem InfoFenster verändern, bekomme dies aber partout nicht hin.

Ist vielleicht die Align-Eigenschaft des Panels gesetzt? Wenn ja, dann wird sich Width und Height nie ändern.

Explorer 10. Aug 2006 11:40

Re: Grosse Probleme mit delphi-dll.
 
Zitat:

Zitat von jbg
Zitat:

Zitat von Explorer
Nun möchte ich die Breite dieses Panels bei geöffnetem InfoFenster verändern, bekomme dies aber partout nicht hin.

Ist vielleicht die Align-Eigenschaft des Panels gesetzt? Wenn ja, dann wird sich Width und Height nie ändern.

Hallo,
nein, align habe ich nicht gesetzt. Alle Startwerte stehen ausschließlich in obiger dll. Das Problem ist, dass ich über die Host-Anwendung zwar die Panelbreite erstmals setzen kann und diese auch exakt im Fenster dargestellt wird. Wenn ich aber nun im aufgebauten "dll-Fenster" den Panelwert ändern möchte, habe ich keinen Zugriff mehr auf dieses von der dll aufgebaute Fenster.
Deshalb stellt sich mir die Frage: wie erhalte ich den Zugriff auf das dll-Fenster jederzeit aufrecht ?
Hier komme ich leider gar nicht weiter.
Ich hatte bereits daran gedacht, einen Timer zu integrieren, der laufend globale vereinbarte Variable ausliest, die von der Host-Anwendung an die dll übertragen werden. Auch das hat bislang nicht geklappt.

Mit besten Grüßen

Karlheinz

rbonk 10. Aug 2006 12:54

Re: Grosse Probleme mit delphi-dll.
 
Hallo Karlheinz,

der Code Deiner DLL ist etwas konfus (Verzeihung). Hier mein Vorschlag.

Delphi-Quellcode:
unit dll_mit_fenster;

interface

uses
  {### ShareMem,
    Diese Unit - falls notwendig - ganz zuerst in der DLL-Projektdatei
    (*.dpr) einbinden. Siehe Delphi-Doku.}
  inifiles, Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, Dialogs, IdComponent, IdTCPConnection, IdTCPClient,
  IdMessageClient, IdSMTP, ComCtrls, StdCtrls, Buttons, ExtCtrls,
  IdBaseComponent, IdMessage;

{### die Klassendefinitionen können in den Implementation- Teil der Unit}


///*** die DLL-Deklarationen
function ZeigeFenster(const PanelBreite :Integer) : Integer; stdcall; {## export;}
  {### 'export' - Anweisung ist überflüssig.}


implementation

type
  {## TKischAlles = class(TComponent)
    diese Klasse ist überflüsssig, einfacher gleich eine Klasse von TForm
    ableiten:
  }
  TKischFenster = class (TForm)
  private
    FKischPanel : TPanel;
  public { Public declarations }
    constructor Create(AOwner: TComponent); override;
    {### destructor Destroy; override; }
    Procedure ZeigeFenster(PanelBreite: Integer);
  end;

var
  KischFenster : TKischFenster = Nil;
{### Deklariere eine mit Nil initialisierte Instanzvariable des Fensters,
     damit bei jedem Aufruf einer DLL- Funktion(en) die Instanz verwendet
     werden kann }

//----------- TKischFenster

constructor TKischFenster.Create(AOwner: TComponent);
begin
  CreateNew(AOwner);
{### Konstruktor CreateNew verwenden, weil es keine *.DFM- Datei zu dem Form
     gibt!}

  SetBounds (200,200,500,300);
  Caption := 'Jippi-ey-hey.';
  FKischPanel := Tpanel.Create(Self);
  with FKischPanel do begin
    Parent := Self;
{### Initialisiere das Panel mit default-Eigenschaften}
    SetBounds (100, 100, 100, 20);
    Caption := '0,0 % Fett';
  end;
end;

Procedure TKischFenster.ZeigeFenster(PanelBreite: Integer);
begin
  FKischPanel.Width := PanelBreite;
  Show;
end;

//----- DLL-Export
function ZeigeFenster(const PanelBreite :Integer) : Integer; stdcall;
begin
  if KischFenster = Nil then
    KischFenster := TKischFenster.Create(Nil);
  KischFenster.ZeigeFenster(PanelBreite);
end;

//-----------
initialization
finalization
{### das Fenster muss irgendwann wieder gelöscht werden - spätestens jetzt !}
  KischFenster.Free;
end.

Explorer 10. Aug 2006 13:39

Re: Grosse Probleme mit delphi-dll.
 
Jippie.
Es läuft und das auch noch so, wie es sollte.
An meinen code-strukturen werde ich gerne feilen. ;-)

Tausend Dank für deine Mühe.

Mit besten Grüßen

Karlheinz


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz