Autor Beitrag
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 03.05.03 16:22 
Hallo,

ich stehe vor folgendem Problem. Ich habe in einer DLL ein Formular. An dieses Formular möchte ich gerne einen Wert einer Variable übergeben. Ich rufe das Forumlar aus der DLL so auf :
ausblenden Quelltext
1:
    UserLogin(Application.Handle);					


Die DLL sieht so aus :
ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
library FormDialog;

uses
  SysUtils,
  Classes,
  Windows,
  Forms,
  PasswordDialogUnit in 'PasswordDialogUnit.pas' {UserLoginMain};

{$R *.res}

procedure UserLogin(appHandle: THandle); stdcall;
begin
  if appHandle = 0 then apphandle := GetActiveWindow;
  Application.Handle := appHandle;
  try
    with TUserLoginMain.Create(Application) Do
      try
        ShowModal
      finally
        Free;
      end
  except
    On E: Exception Do Application.HandleException(E);
  end;
  Application.Handle := 0;
end;

exports
  UserLogin;
  
begin

end.


Das ist nur ein Beispiel. In der PasswordDialogUnit.pas steht nur eine Procedure drin FormCreate. Und ein Label ist auf dem Formular. Ich möchte nun einen String an dieses Formular übergeben aus dem ich es aufrufe und dieses soll im Label1 ausgegeben werden. Ist das möglich, und wenn ja wie mache ich das ? Ein kleines Beispiel wäre nicht schlecht.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 03.05.03 18:39 
Vorsicht mit Strings und Dlls. Da musst du die Unit SharedMem (oder so ähnlich) mit einbinden.

Ich würds so machen, dass alles was du brauchst als Übergabeparameter an die Dll übegeben werden (entsprechende Funktionen) und diese wiederum das Form mit entsprechenden Create() Parametern aufrufen.
Das gleiche wieder zurück, wenn Du Infos aus der Dll brauchst.

Immer davon ausgeben, soweit wie möglich kapseln, d.h. nicht das Hauptprogramm greift auf Variablen der Dll/Form zu sondern die DLL exportiert entsprechende Funktionen die diese Werte zurückgeben.

Ich hab momentan kein Beispiel.
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 03.05.03 19:48 
Es sollen ja keine Werte von der DLL an das Hauptprog wieder zurückgegeben werden. Sondern nur einmalig soll vom Hauptprog ein Wert übergeben werden an die DLL-Form. Ob das jetzt ein String oder ein PChar ist, dass ist mir egal. Hat keiner ein Beispiel für mich, ich habe das noch nie gemacht mit Create() Parametern.
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 03.05.03 20:18 
hier die Deklaration der create-Methode der Form mit Parameterübergabe:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type  myForm=Class(TForm)
    ...    
    constructor Create(AOwner:TCompoenten; MeinVar: PChar); reintroduce;

...

procedure myForm.Create;
begin
  inherited Create(AOwner);
  Variable:= MeinVar;
end;

grez
msch
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 03.05.03 22:04 
Ganz dumm gefragt, aber wo muß ich das in meinen obrigen Sourcecode reinschreiben ?
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 03.05.03 22:19 
Ich habe meinen Fehler gefunden. Es funktioniert jetzt so wie ich es wollte, danke dir MSCH. Hast Du irgendwelche Tutorials für dieses Thema, wo das contructor erklärt wird ? Und wie funktioniert das ganze in die andere Richtung, alles gleiche Ausgangssituation ?
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 04.05.03 17:27 
In die andere Richtung, sprich von der Form an eine andere Routine gehts so:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  myForm =Class(TForm)
  private
    MyWert: Integer;
    procedure SetMyWert(I:Integer);
    function GetMyWert:Integer;
  public
    property Wert: integer read GetMyWert write SetMyWert;
  end;


...
   function MyForm.GetMyWert:Integer;
   begin result:= myWert;end;
  
   procedure MyForm.SetMyWert;
   begin
     myWert:=I;
     ...
   end;


und in einer beliebigen Funktion ausserhalb der Form:
ausblenden Quelltext
1:
2:
    Zahl := MyForm.Wert; // lesen
    MyForm.Wert:= Zahl; // schreiben

Wichtig: Form muss da sein !

grez
msch
RudiA
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 30.05.03 17:17 
Titel: Frage...
Also, wenn ich deinen obigen Quelltext nutze um ein Formular aus einer Dll zu laden bekomme ich einen Systemfehler bei der Zeile

ausblenden Quelltext
1:
with TUserLoginMain.Create(Application) Do					


Kannst du mir da weiterhelfen??? Was mache ich falsch????

Danke schon mal im Vorraus!
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Fr 30.05.03 18:59 
Was für einen Fehler bekommst Du ? Wie sieht Dein Quelltext aus ?
RudiA
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Fr 30.05.03 22:35 
Ich hab deinen Quelltext 1:1 übernommen. Und ich bekomme folgende Fehlermeldung:
Im Projekt ... ist eine Exception der Klasse EOSError aufgetreten. Meldung: 'Systemfehler. Code: 1400. Ungültiges Fensterhandle'. Prozess wurde angehalten...
bis11 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Sa 31.05.03 09:20 
Sieht Dein Oberer teil von der Unit so aus, dann muss es funktionieren.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
unit PasswordDialogUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TUserLoginMain = class(TForm)
    Panel1: TPanel;
    OKButton: TButton;
    UserIDEdit: TEdit;
    passwordEdit: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    CancelButton: TButton;
    procedure OKButtonClick(Sender: TObject);
    procedure CancelButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  UserLoginMain: TUserLoginMain;


Hast Du bei Var einen anderen Wert stehen, dann musst Du den Wert aus der Zeile :

ausblenden Quelltext
1:
with TUserLoginMain.Create(Application) Do					


dem entsprechend ändern.
RudiA
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Sa 31.05.03 14:38 
Die Unit sieht genau so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
unit PasswordDialogUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TUserLoginMain = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  UserLoginMain: TUserLoginMain;

implementation

{$R *.dfm}

end.


und wie gesagt, ich bekomme dann mit dem Code diesen Fehler... und ich hab deinen Quelltext genau übernommen... :(