Wenn du auf die globale Variable der User-ID im Hauptformular (Main.pas) verzichtest und im Unterformular (Detail.pas) nicht das Hauptformular inkludierst, sondern gleich ApplicationUser, wird das eine runde Sache.
Außerdem kann man RememberEdit noch ein bisschen straffen, indem man die Settings-Klasse als Member-Variable anlegt.
So kommt es wegen jeder kleinen Änderung nicht ständig zum Erschaffen und Zerstören der TControlSettings-Klasse.
Sicher gibt es noch ein paar andere und ausgefallende Ansätze, aber im Wesentlichen hast du damit erreicht was du wolltest: Die Komponente kennt nicht mehr die UserID.
Ggf. könnte man die UserID per Property o.ä. an das Unterformular (Detail.pas) übergeben, dann muss man hier auch nichts mehr inkludieren. Also weder Main noch ApplicationUser.
Delphi-Quellcode:
unit Main;
interface
uses
System.SysUtils,
System.Classes,
Vcl.Controls,
Vcl.Forms,
Vcl.Dialogs,
Vcl.StdCtrls;
type
TFormMain =
class(TForm)
Button1 : TButton;
procedure Button1Click(Sender : TObject);
procedure FormShow(Sender : TObject);
private
function GetUserId : integer;
function CheckUserId : boolean;
public
end;
var
FormMain : TFormMain;
implementation
{$R *.dfm}
uses
Detail,
ApplicationUser;
procedure TFormMain.Button1Click(Sender : TObject);
var
FormDetail : TFormDetail;
begin
FormDetail := TFormDetail.Create(Self);
try
FormDetail.ShowModal;
finally
FreeAndNil(FormDetail);
end;
end;
function TFormMain.CheckUserId : boolean;
begin
Result := TApplicationUser.UserId >= 0;
if not Result
then
begin
MessageDlg('
UserID ungültig', mtError, [mbOk], 0);
end;
end;
procedure TFormMain.FormShow(Sender : TObject);
begin
TApplicationUser.UserId := GetUserId;
if not CheckUserId
then
Application.Terminate;
Self.Caption := '
Login mit UserID=' + IntToStr(TApplicationUser.UserId);
end;
function TFormMain.GetUserId : integer;
var
UserString :
string;
begin
Result := 0;
UserString := InputBox('
User-ID', '
Bitte die User-ID eingeben:', '
0');
Result := StrToIntDef(UserString, 0);
end;
end.
Delphi-Quellcode:
unit Detail;
interface
uses
System.SysUtils,
System.Classes,
Vcl.Controls,
Vcl.Forms,
Vcl.StdCtrls,
RememberEdit;
type
TFormDetail =
class(TForm)
Label1 : TLabel;
RememberEdit1 : TRememberEdit;
lblHallo : TLabel;
procedure FormCreate(Sender : TObject);
private
public
end;
implementation
{$R *.dfm}
uses
ApplicationUser;
procedure TFormDetail.FormCreate(Sender : TObject);
begin
lblHallo.Caption := lblHallo.Caption + '
' + IntToStr(ApplicationUser.TApplicationUser.UserId);
end;
end.
Delphi-Quellcode:
unit RememberEdit;
interface
uses
SysUtils,
WinTypes,
WinProcs,
Messages,
Classes,
Vcl.StdCtrls,
ControlSettings;
type
TRememberEdit =
class(TEdit)
private
FControlSettings : TControlSettings;
procedure SetTextToSettings(
const Value :
string);
function GetTextFromSettings :
string;
public
constructor Create(AOwner : TComponent);
override;
destructor Destroy;
override;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('
RememberTest', [TRememberEdit]);
end;
constructor TRememberEdit.Create(AOwner : TComponent);
begin
inherited;
FControlSettings := TControlSettings.Create;
Self.Text := GetTextFromSettings;
end;
destructor TRememberEdit.Destroy;
begin
SetTextToSettings(Self.Text);
FControlSettings.Free;
inherited;
end;
function TRememberEdit.GetTextFromSettings :
string;
begin
Result := '
';
if (csDesigning
in ComponentState)
then
exit;
Result := FControlSettings.
Read;
end;
procedure TRememberEdit.SetTextToSettings(
const Value :
string);
begin
if (csDesigning
in ComponentState)
then
exit;
FControlSettings.
Write(Value);
end;
end.