.#mainfrmex.pas.1.40
来自「群星医药系统源码」· 40 代码 · 共 828 行 · 第 1/2 页
40
828 行
NavigationBox.Color := NavigationBack;
Parent := NavigationBox;
BackgroundColor := NavigationBox.Color;
UseColoredTabs := false;
FlatColor := clGradientActiveCaption;
FlatColorAdjustment := 20;
ShowCardFrame := true;
ShowFocusRect := False;
TabColors.Shadow := NavigationGradient;
TabOrientation := toRight;
TabHeight := 32;
TabStyle := tsCutCorner;
HotTrack :=false;
Top := 32;
Left := 32;
Width := NavigationBox.ClientWidth - 64;
Height := NavigationBox.ClientHeight - 64;
Anchors := [akLeft,akTop,akRight,akBottom];
OnDragOver := ParentAcceptDragListItems;
OnDragDrop := ApplyDragListItems;
OnMouseDown := OnNavigationMouseDown;
OnChange := OnNavigationChanged;
NavigationBox.OnMouseDown := OnNavigationMouseDown;
Show;
end;
end;
//接口函数,当前改变导航栏颜色等设置时或需要刷新显示时调用
procedure TMainFormEx.ChangeNavigationColor;
var
i,j: integer;
begin
DisplayNavigationData;
if not FLocSetting.NavVisible then Exit;
NavigationBox.Color := NavigationBack;
FNavList.Color := NavigationBack;
FNavList.TabColors.Shadow := NavigationGradient;
for i:=0 to FNavList.ComponentCount -1 do
begin
if FNavList.Components[i] is TRzListView then
TRzListView(FNavList.Components[i]).Color := NavigationBox.Color;
for j:=0 to FNavList.Components[i].ComponentCount -1 do
if FNavList.Components[i].Components[j] is TRzListView then
TRzListView(FNavList.Components[i].Components[j]).Color := NavigationBox.Color;
end;
end;
//显示导航数据
procedure TMainFormEx.DisplayNavigationData;
var
lvTemp: TRzListView;
ListItem: TListItem;
vSheet: TRzTabSheet;
i,j,k,x: Integer;
CommonImg: TImageList;
begin
FCurListView := nil;
if not IFmMain.NavVisible then
begin
if Assigned(FNavList) then
FreeAndNil(FNavList);
Exit;
end;
if FNavList<>nil then
Exit
else
FNavList := CreateNavList;
x := 10;
CommonImg := IFmMain.GetBigImgList;
FNavList.Images := CommonImg;
with MainMenu do
begin
for i:=0 to Items.Count -1 do
begin
//标题页
vSheet := TRzTabSheet.Create(FNavList);
vSheet.Parent := FNavList;
vSheet.ImageIndex := i;
if x=CommonImg.Count then x:=10;//TListView中的图标从第11个图标开始
Inc(x);
vSheet.Caption := Items[i].Caption;
vSheet.PageControl := FNavList;
//列表视图
lvTemp := TRzListView.Create(vSheet);
lvTemp.Align := alClient;
lvTemp.LargeImages := CommonImg;
lvTemp.Parent := vSheet;
lvTemp.BorderStyle := bsNone;
lvTemp.Font.Color := clWindowText;
lvTemp.ReadOnly := true;
lvTemp.OnMouseDown := OnListViewMouseDown;
lvTemp.OnMouseMove := OnListViewMouseMove;
lvTemp.OnMouseUp := OnListViewMouseUp;
lvTemp.OnDragOver := AcceptDragListItems;
lvTemp.OnKeyDown := PressReturnKeyOnListView;
lvTemp.OnDblClick := CallModuleFunc;
lvTemp.OnResize := OnListViewResize;
lvTemp.MultiSelect := true;
lvTemp.Ctl3D := false;
lvTemp.FlatScrollBars := true;
lvTemp.DoubleBuffered := true;
lvTemp.Color := NavigationBox.Color;
lvTemp.Visible := true;
lvTemp.Parent.DoubleBuffered := true;
lvTemp.IconOptions.AutoArrange := true;
//子项(只搜索三层菜单,如果菜单超过三层,请修改此处代码
for j:=0 to Items[i].Count -1 do
begin
if Items[i].Items[j].Action=nil then
for k:=0 to Items[i].Items[j].Count -1 do
begin
if Items[i].Items[j].Items[k].Action=nil then Continue;
ListItem := lvTemp.Items.Add;
ListItem.Caption := Items[i].Items[j].Items[k].Caption;
ListItem.Data := Items[i].Items[j].Items[k].Action;
ListItem.ImageIndex := x;
inc(x);
if x > CommonImg.Count -1 then x :=0;
end
else
begin
ListItem := lvTemp.Items.Add;
ListItem.Caption := Items[i].Items[j].Caption;
ListItem.Data := Items[i].Items[j].Action;
ListItem.ImageIndex := x;
Inc(x);
if x > CommonImg.Count -1 then x :=0;
end;
end;
end;
end;
//取得当前用户的常用功能并加入到子项中
with dmModules.cdsPublic do begin
//标题页
vSheet := TRzTabSheet.Create(FNavList);
vSheet.Parent := FNavList;
vSheet.ImageIndex := x;
vSheet.Caption := '常用功能';
vSheet.PageControl := FNavList;
FNavList.ActivePage := vSheet;
//列表视图
lvTemp := TRzListView.Create(vSheet);
lvTemp.Align := alClient;
lvTemp.LargeImages := CommonImg;
lvTemp.Parent := vSheet;
lvTemp.BorderStyle := bsNone;
lvTemp.Font.Color := clWindowText;
lvTemp.ReadOnly := true;
lvTemp.OnKeyDown := OnFavoritesKeyDown;
lvTemp.OnDblClick := CallModuleFunc;
lvTemp.OnResize := OnListViewResize;
lvTemp.OnDragOver := AcceptDragListItems;
lvTemp.OnDragDrop := ApplyDragListItems;
lvTemp.MultiSelect := true;
lvTemp.Ctl3D := false;
lvTemp.FlatScrollBars := true;
lvTemp.DoubleBuffered := true;
lvTemp.Color := NavigationBox.Color;
lvTemp.Visible := true;
lvTemp.Parent.DoubleBuffered := true;
lvTemp.IconOptions.AutoArrange := true;
FFavoritesListView := lvTemp;
//子项
Close;
CommandText :='select UserID, ModuleID, IconID from Favorites where UserID='+ FLogonInfo.UserID;
Open;
while not Eof do begin
for i:=0 to Actions.ActionCount -1 do
if Fields[1].AsInteger = TModlAction(Actions.Actions[i]).ActionID then
begin
ListItem := lvTemp.Items.Add;
ListItem.Caption := TModlAction(Actions.Actions[i]).Caption;
ListItem.Data := Actions.Actions[i];
ListItem.ImageIndex := Fields[2].AsInteger;
break;
end;
Next;
end;
Close;
end;
end;
//响应TListView中的鼠标双击事件,调用模块功能
procedure TMainFormEx.CallModuleFunc(Sender: TObject);
var
lvCommon: TRzListView;
Item: TListItem;
pt: TPoint;
act: TAction;
begin
if not (Sender is TRzListView) then exit;
TListView(Sender).Selected := nil;
lvCommon := TRzListView(Sender);
GetCursorPos(pt);
pt := lvCommon.ScreenToClient(pt);
Item := lvCommon.GetItemAt(pt.X ,pt.Y);
if Item = nil then exit;
act := TAction(Item.Data);
try
screen.Cursor := crHourGlass;
if act<>nil then act.Execute;
finally
screen.Cursor := crDefault;
end;
end;
//处理'常用功能'的DragOver事件
procedure TMainFormEx.AcceptDragListItems(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TRzListView)and(TRzListView(Source)<>FFavoritesListView);
end;
//处理'常用功能'的DragDrop事件
procedure TMainFormEx.ApplyDragListItems(Sender, Source: TObject; X,
Y: Integer);
const
sSQL = 'INSERT INTO Favorites(UserID, ModuleID, IconID)VALUES(%s,%d,%d)';
var
lv: TRzListView;
LI: TListItem;
act: TModlAction;
i: integer;
function CheckExistsItem(AListItem: TListItem): boolean;
var i: integer;
begin
Result := false;
With FFavoritesListView.Items do
for i:=0 to Count -1 do
begin
if not Assigned(AListItem.Data) then Continue;
if TModlAction(AListItem.Data).ActionID = TModlAction(Item[i].Data).ActionID then
begin
Result := true;
break;
end;
end;
end;
begin
if (not (Source is TRzListView))or(FFavoritesListView = nil) then exit;
if (Sender is TRzPageControl)and(TRzPageControl(Sender).ActivePage.Caption <>'常用功能') then exit;
lv := TRzListView(Source);
if lv.SelCount>1 then
for i:=0 to lv.Items.Count -1 do
begin
if lv.Items.Item[i].Selected then
begin
act := TModlAction(lv.Items.Item[i].Data);
if act=nil then Continue;
if CheckExistsItem(lv.Items.Item[i]) then Continue;
LI := FFavoritesListView.Items.Add;
LI.Caption :=lv.Items.Item[i].Caption;
LI.Data := lv.Items.Item[i].Data;
LI.ImageIndex := lv.Items.Item[i].ImageIndex;
with dmModules.cdsPublic do
begin
Close;
CommandText := Format(sSQL,[FLogonInfo.UserID,act.ActionID,LI.ImageIndex]);
Execute;
end;
end;
end
else
begin
act := TModlAction(lv.Selected.Data);
if act<>nil then
with dmModules.cdsPublic do
begin
if CheckExistsItem(lv.Selected) then exit;
LI := FFavoritesListView.Items.Add;
LI.Caption :=lv.Selected.Caption;
LI.Data := lv.Selected.Data;
LI.ImageIndex := lv.Selected.ImageIndex;
Close;
CommandText := Format(sSQL,[FLogonInfo.UserID,act.ActionID,LI.ImageIndex]);
Execute;
end;
end;
end;
//处理页面控件的的DragOver事件
procedure TMainFormEx.ParentAcceptDragListItems(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
var
i: integer;
c: string;
begin
Accept := (Source is TRzListView)and(TRzListView(Source)<>FFavoritesListView);
if not Accept then exit;
if State <> dsDragLeave then begin
i :=TRzPageControl(Sender).TabAtPos(x,y);
if (i<0)or(i>TRzPageControl(Sender).PageCount-1) then exit;
c := TRzPageControl(Sender).Pages[i].Caption ;
if c = '常用功能' then
TRzPageControl(Sender).ActivePageIndex := i
else
Accept :=false;
end;
end;
//以下三个过程处理主要功能分类列表视图控件的Mouse事件,开始手动拖放
procedure TMainFormEx.OnListViewMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FMousePressed := (Button = mbLeft);
if Sender is TRzListView then
FCurListView := TRzListView(Sender);
end;
procedure TMainFormEx.OnListViewMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
begin
if (not (Sender is TRzListView))or(not FMousePressed) then exit;
if (TListView(Sender).Selected<>nil)and(not TListView(Sender).Dragging) then
TRzListView(Sender).BeginDrag(true);
end;
procedure TMainFormEx.OnListViewMouseUp(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
FMousePressed := false;
end;
//'常用功能'中的按键(删除或调用功能)
procedure TMainFormEx.OnFavoritesKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
const
sSQL = 'DELETE FROM Favorites WHERE UserID=%s AND ModuleID=%d';
var
i: integer;
act: TModlAction;
begin
if (Key=VK_DELETE)and(ssCtrl in Shift)and(FFavoritesListView.SelCount >0) then
with dmModules.cdsPublic do
begin
for i:= FFavoritesListView.Items.Count -1 Downto 0 do
begin
if not FFavoritesListView.Items.Item[i].Selected then Continue;
Close;
act := TModlAction(FFavoritesListView.Items.Item[i].Data);
CommandText := Format(sSQL,[FLogonInfo.UserID,act.ActionID]);
Execute;
end;
FFavoritesListView.DeleteSelected;
end;
if Key=13 then PressReturnKeyOnListView(sender,key,shift);
end;
//按下回车键时执行
procedure TMainFormEx.PressReturnKeyOnListView(Sender: TObject;
var Key: Word; Shift: TShiftState);
var
lvCommon: TRzListView;
Item: TListItem;
act: TAction;
begin
if (not (Sender is TRzListView))or(key<>13) then exit;
lvCommon := TRzListView(Sender);
Item := lvCommon.Selected;
if Item = nil then exit;
act := TAction(Item.Data);
try
screen.Cursor := crHourGlass;
if act<>nil then act.Execute;
finally
screen.Cursor := crDefault;
end;
end;
procedure TMainFormEx.OnListViewResize(Sender: TObject);
begin
TListView(Sender).Realign;
end;
//用于复位拖放
procedure TMainFormEx.OnNavigationMouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if FCurListView = nil then exit;
with FCurListView do
begin
FMousePressed := false;
EndDrag(false);
end;
end;
//切换页面时,自动设置焦点到TListView,以便用户使用方向键操作
procedure TMainFormEx.OnNavigationChanged(Sender: TObject);
var
nTab: TRzTabSheet;
i: integer;
begin
if not (Sender is TRzPageControl) then exit;
nTab := TRzPageControl(Sender).ActivePage;
if nTab<>nil then
for i :=0 to nTab.ComponentCount - 1 do
if nTab.Components[i] is TRzListView then
begin
if TRzListView(nTab.Components[i]).CanFocus then
TRzListView(nTab.Components[i]).SetFocus;
break;
end;
end;
initialization
RegisterClass(TMainFormEx);
finalization
UnRegisterClass(TMainFormEx);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?