Class-reference types 類引用型別--快要失傳的技術

weixin_30639719發表於2020-04-05

光看幫助你大概搞不清楚這個有什麼用。我舉一個例子,一般mainform都有很多選單按鈕,用來開啟不同的視窗,通常做法要在uses部分新增所有要引用的單元,十分麻煩,用上面的技術就可以避免引用。假設所有的業務視窗都從TAppBasicForm繼承,你可以宣告這樣的型別:

TTAppBasicFormClass = class of TTAppBasicForm;

然後在每個業務視窗程式碼結尾處加上:

initialization
  RegisterClass(TBusMemberNewForm); //TBusMemberNewForm從TAppBasicForm繼承

finalization
  UnRegisterClass(TBusMemberNewForm);

 

最後在Mainform用下面的函式:
procedure TTMainForm.ShowForm(sFormClass: string);
var
  AppFormClass: TTAppBasicFormClass;
begin
  try
    AppFormClass := TTAppBasicFormClass(FindClass(sFormClass));
    with AppFormClass.Create(self) do begin
      Show;
    end;
  except
    ShowMessage('Class ‘+sFormClass+' not exist or not register!');
  end;
end;
這個函式的引數就是要開啟的視窗類名

更進一步,因為專案中Menu的hint屬性不會用到,可以用來儲存要開啟的類名,如下:
procedure TTMainForm.MainFormMenuClick(Sender: TObject);
var
  sFormName: string;
begin
  with sender as TMenuItem do begin
    sFormName := Trim(Hint);
    if sFormName<>'' then ShowForm(sFormName);
  end;
end;

procedure TTMainFaceForm.SetMenuAction;
var
  i: integer;
begin
  for i:=0 to ComponentCount-1 do begin
    if Components[i] is TMenuItem then begin
      with Components[i] as TMenuItem do
        if Trim(Hint)<>'' then OnClick := MainFormMenuClick;
    end;
  end;
end;

這樣的話每增加一個選單,只要指定選單的hint屬性就自動實現開啟對應業務的功能,避免引用單元,也不用寫選單的onclick程式碼,非常簡潔。當然這個還用到了RegisterClass和FindClass的技術,去看幫助就明白了。

 

轉載於:https://www.cnblogs.com/del88/p/6364993.html

相關文章