扩展现有示例的功能

时间:2014-07-09 06:27:39

标签: delphi

这只是为了学习:在这个例子Delphi application with login / logout - how to implement?中使用接受的答案,你如何展示一个特定的表格(如果你有很多表格)? 我在LoginForm上放置了一个查询(显示了可以选择和显示的各种表单)。

enter image description here

我应该如何更改现有代码,以便我可以保持相同的功能,这意味着无论我选择哪种形式并单击“打开”它将成为主要形式并显示?

1 个答案:

答案 0 :(得分:0)

主窗体是使用Application.CreateForm创建的第一个窗体。因此,使用ifcase语句有条件地切换以这种方式创建的表单。

在伪代码中:

if Form1 is main form then
  Application.CreateForm(TForm1, Form1)
else if Form2 is main form then
  Application.CreateForm(TForm2, Form2)
....

有很多方法可以做到这一点,但这是基本原则。

所以,你可能会创建一个函数来返回主窗体的类,使用你选择它的任何机制:

function GetMainFormClass: TFormClass;
begin
  Result :=...; // your logic here
end;

然后在你写的.dpr文件中

Application.CreateForm(GetMainFormClass, MainForm);

你似乎真的在努力解决这个问题。我会尝试更详细地说出来。 GetMainFormClass的实现可能如下所示:

function GetMainFormClass: TFormClass;
var
  FormClassName: string;
begin
  FormClassName := ...; // somehow get the name of the form class, e.g. 'TForm1'
  if FormClassName = 'TForm1' then
    Result := TForm1
  else if FormClassName = 'TForm2' then
    Result := TForm2
  else
    raise EUnrecognisedFormClassName.Create(...);
end;

就个人而言,我不明白为什么要向用户呈现网格控件。对我来说,这似乎是一个非常弱的用户界面,用于进行选择。我会提出一个广播组。然后你可以写这样的代码:

type
  TMainFormType = (mftForm1, mftForm2, mftForm3);

const 
  MainFormClass = array [TMainFormType] of TFormClass = (
    TForm1,
    TForm2,
    TForm3
  );

然后你可以有一个函数返回TMainFormType,通过向用户显示一个表单并显示一个带有三个按钮的无线电组。您可以将广播组的ItemIndex转换为相应的TMainFormType值。

function GetMainFormType: TMainFormType;
begin
  // ... your UI shows now, presenting the radio group
  Result := TMainFormType(RadioGroup.ItemIndex);
end;

然后在您编写的.dpr文件中

Application.CreateForm(MainFormClass[GetMainFormType], MainForm);

有很多不同的方法可以做到这一点,但您需要了解分支代码的基础知识。 if语句或查找表。如果你不明白这些是如何运作的,那么在你继续之前需要充分尊重这些技能。