| Autor |
Beitrag |
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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 :
Quelltext 1:
| UserLogin(Application.Handle); |
Die DLL sieht so aus :
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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: 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 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 03.05.03 20:18
hier die Deklaration der create-Methode der Form mit Parameterübergabe:
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 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Sa 03.05.03 22:04
Ganz dumm gefragt, aber wo muß ich das in meinen obrigen Sourcecode reinschreiben ?
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 04.05.03 17:27
In die andere Richtung, sprich von der Form an eine andere Routine gehts so:
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:
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
|
Verfasst: 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
Quelltext 1:
| with TUserLoginMain.Create(Application) Do |
Kannst du mir da weiterhelfen??? Was mache ich falsch????
Danke schon mal im Vorraus!
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Sa 31.05.03 09:20
Sieht Dein Oberer teil von der Unit so aus, dann muss es funktionieren.
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 :
Quelltext 1:
| with TUserLoginMain.Create(Application) Do |
dem entsprechend ändern.
|
|
RudiA
Hält's aus hier
Beiträge: 5
|
Verfasst: Sa 31.05.03 14:38
Die Unit sieht genau so aus:
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... 
|
|