Delphi中的框架和浏览历史记录

时间:2009-11-25 15:18:40

标签: delphi

我目前正在开发一个需要浏览历史记录的delphi应用程序,并试图弄清楚如何实现这一目标。

该应用程序有2种模式。浏览和详细信息。两者都设计为框架。

搜索后,在Panel 1中创建适当数量的浏览框并填充。

在浏览框架中,我们可以打开细节框架,用细节框架的内容替换面板1的内容。或者,可以生成新的搜索,用新的集合替换当前的结果集。

在细节框架中,我们可以编辑细节,或者生成新的搜索。某些搜索仅可从详细信息框中获得。其他来自浏览框架或详细信息框架。

每当用户显示详细信息框架或产生新搜索时,我想记录该操作并能够重复该操作。其他操作(如编辑或“更多详细信息”)将不会被记录。 (显然,如果用户返回几步,然后沿着不同的搜索路径前进,这将从这一点开始新的历史记录)

在我看来,我想记录列表中的过程调用,例如

SearchByName(Search.Text);
SearchByName(ArchName.Text);
DisplayDetails(JobID);
SearchByName(EngineerName.Text);
DisplayDetails(JobID);

然后我可以(以某种方式)按顺序调用每个项目,因为我去bak和前进...

4 个答案:

答案 0 :(得分:1)

跟踪TStringList中的所有内容;当他们“返回”时,你从字符串列表中删除。这是一种原型:

type
  TSearchObject = class
  FSearchFunction,FSearchValue: String;
  constructor Create(mSearchFunction,mSearchValue: string);
end;

type
  TForm1 = class(TForm)
    SearchByName: TButton;
    GoBack: TButton;
    DisplayDetails: TButton;
    searchfield: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure SearchByNameClick(Sender: TObject);
    procedure GoBackClick(Sender: TObject);
    procedure DisplayDetailsClick(Sender: TObject);
  private
    { Private declarations }
    SearchObjectsList: TStringList;
    jobid: String;   //not sure how you get this
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

constructor TSearchObject.Create(mSearchFunction,mSearchValue: string);
begin
  FSearchFunction := mSearchFunction;
  FSearchValue    := mSearchValue;
end;

{$R *.dfm}

procedure TForm1.SearchByNameClick(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  mSearchObject := TSearchObject.Create('SearchByName',SearchField.Text);
  SearchObjectsList.AddObject(SearchField.Text,mSearchObject);
end;

procedure TForm1.DisplayDetailsClick(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  mSearchObject := TSearchObject.Create('DisplayDetails',JobID);
  SearchObjectsList.AddObject(JobId,mSearchObject);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SearchObjectsList := TStringList.Create;

end;

procedure TForm1.GoBackClick(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  if SearchObjectsList.count=0 then
    showmessage('Cannot go Back!')
  else begin
    mSearchObject := TSearchObject(SearchObjectsList.Objects[SearchObjectsList.count-1]);
    if mSearchObject.FSearchFunction ='SearchByName' then
      ShowMessage('Value of Search Field:'+mSearchObject.FSearchValue)
    else
      ShowMessage('Value of JobID:'+mSearchObject.FSearchValue);
    SearchObjectsList.Delete(SearchObjectsList.count-1);

  end;
end;

答案 1 :(得分:1)

回应Dan Kelly要求存储该功能:   然而,我仍然看不到的是我如何调用存储的函数 -

您所指的是存储方法处理程序。下面的代码演示了这一点。但是,当你表明自己的时候,你可以做一个很大的if..then或case声明。

这一切都会奏效。但是,更加“雄辩”的做法是存储对象指针。例如,如果搜索打开另一个搜索,则将第一个指针传递给第二个。然后在第二个如果你想引用它,你有一个指针(首先检查它不是零/免费)。这是一种更加面向对象的方法,并且可以更好地适用于有人可能不按顺序关闭其中一个帧的情况。

unit searchit;

interface

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

type
  TSearchObject = class
  FSearchValue: String;
  FOnEventClick: TNotifyEvent;
  constructor Create(mSearchValue: string; mOnEventClick: TNotifyEvent);
  procedure FireItsEvent;  
end;

type
  TForm1 = class(TForm)
    SearchByName: TButton;
    GoBack: TButton;
    DisplayDetails: TButton;
    searchfield: TEdit;
    jobid: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure SearchByNameClick(Sender: TObject);
    procedure GoBackClick(Sender: TObject);
    procedure DisplayDetailsClick(Sender: TObject);
  private
    { Private declarations }
    SearchObjectsList: TStringList;
    procedure DisplayDetailFunction(Sender: TObject);
    procedure SearchByNameFunction(Sender: TObject);        
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

constructor TSearchObject.Create(mSearchValue: string;mOnEventClick: TNotifyEvent);
begin
  FOnEventClick   := mOnEventClick;
  FSearchValue    := mSearchValue;
end;

{$R *.dfm}

procedure TSearchObject.FireItsEvent;
begin
  if Assigned(FOnEventClick) then
    FOnEventClick(self);
end;

procedure TForm1.SearchByNameClick(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  mSearchObject := TSearchObject.Create(SearchField.Text,SearchByNameFunction);
  SearchObjectsList.AddObject(SearchField.Text,mSearchObject);
end;

procedure TForm1.DisplayDetailFunction(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  mSearchObject := TSearchObject(Sender);
  ShowMessage('This is the Display Detail Event.  The value of the JobID is '+mSearchObject.FSearchValue);
end;

procedure TForm1.SearchByNameFunction(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  mSearchObject := TSearchObject(Sender);
  ShowMessage('This is the SearchByName Event.  The value of the Search Field is '+mSearchObject.FSearchValue);
end;


procedure TForm1.DisplayDetailsClick(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  mSearchObject := TSearchObject.Create(jobid.text,DisplayDetailFunction);
  SearchObjectsList.AddObject(jobid.text,mSearchObject);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SearchObjectsList := TStringList.Create;
end;

procedure TForm1.GoBackClick(Sender: TObject);
var
  mSearchObject: TSearchObject;
begin
  if SearchObjectsList.count=0 then
    showmessage('Cannot go Back!')
  else begin
    mSearchObject := TSearchObject(SearchObjectsList.Objects[SearchObjectsList.count-1]);
    mSearchObject.FireItsEvent;

    SearchObjectsList.Delete(SearchObjectsList.count-1);

  end;
end;

end.

答案 2 :(得分:0)

另一种选择是使用我的wizard framework,它使用TForms执行此操作,但也可以轻松调整以使用框架。这个概念是每个摘要表格都知道如何创建适当的细节。在您的情况下,框架更像是一个如何做的示例,而不是即插即用的解决方案。

答案 3 :(得分:0)

补充MSchenkel回答。

要在程序运行之间坚持列表,请使用 ini文件

这是个主意。你必须适应它。特别地,您必须弄清楚将对象转换为字符串并将字符串转换为对象的方式,在此处勾勒为ObjectToString()StringToStringIDStringToObject()

OnClose事件中,将列表写入ini文件。

const 
  IniFileName = 'MYPROG.INI';
  MaxPersistedObjects = 10;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
 var 
   ini: TIniFile;  
   i: integer;
   cnt: integer;
 begin
   ini:=TIniFile.Create(iniFileName);
   cnt:=SearchObjectsList.Count;
   if cnt>MaxPersistedObjects then 
     cnt:=MaxPersistedObjects;
   for i:=1 to MaxPersistedObjects do
     if i>cnt then
       ini.WriteString('SearchObjects','SearchObject'+intToStr(i),'');
     else 
       ini.WriteString('SearchObjects','SearchObject'+intToStr(i),
         ObjectToString(SearchObjectsList[i-1],SearchObjectsList.Objects[i-1]) );
   ini.Free;
 end;

并在OnCreate事件中阅读。

procedure TForm1.FormCreate(Sender: TObject);
 var 
   ini: TIniFile;
   i: integer;
 begin
   SearchObjectsList := TStringList.Create;
   ini:=TIniFile.Create(IniFileName);  
   for i:=1 to MaxPersistedObjects do 
    begin
      s:=ini.ReadString('SearchObjects','SearchObject'+intToStr(i),'');
      if s<>'' then
        SearchObjectsList.AddObject(StringToID(s),StringToObject(s));
    end;
   ini.Free;
 end;