123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464 |
- unit ProjGatherSelectFme;
- interface
- uses
- sdIDTree, sdDB,
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls, sdGridDBA, sdGridTreeDBA, ZJGrid, ZJCells;
- type
- TAfterSelectEvent = procedure of Object;
- TProjGatherSelectFrame = class(TFrame)
- zgSelectProject: TZJGrid;
- stdSelectProject: TsdGridTreeDBA;
- pnlProjects: TPanel;
- pnlProjectsTitle: TPanel;
- lblProjectList: TLabel;
- pnlProjLeft: TPanel;
- pnlProjRight: TPanel;
- pnlProjBottom: TPanel;
- pnlResults: TPanel;
- pnlResultTitle: TPanel;
- lblResult: TLabel;
- zgResult: TZJGrid;
- pnlResultLeft: TPanel;
- pnlResultBottom: TPanel;
- pnlResultRight: TPanel;
- procedure zgSelectProjectGetCellText(Sender: TObject;
- const ACoord: TPoint; var Value: String; DisplayText: Boolean);
- procedure zgSelectProjectSetCellText(Sender: TObject;
- const ACoord: TPoint; var Value: String; DisplayText: Boolean);
- procedure zgSelectProjectCellTextChanged(Sender: TObject; Col,
- Row: Integer);
- procedure zgSelectProjectDrawCellText(ACanvas: TCanvas;
- const ARect: TRect; const ACoord: TPoint; AGrid: TZJGrid;
- const Text: String; var ADefaultDraw: Boolean);
- procedure zgResultGetCellText(Sender: TObject; const ACoord: TPoint;
- var Value: String; DisplayText: Boolean);
- procedure zgResultSetCellText(Sender: TObject; const ACoord: TPoint;
- var Value: String; DisplayText: Boolean);
- procedure zgSelectProjectCellGetColor(Sender: TObject; ACoord: TPoint;
- var AColor: TColor);
- private
- FProjectID: Integer;
- FValidProjs: TList;
- FSelectProjs: TList;
- FSpecialProjTypes: TStrings;
- FSpecialProjIDs: array of Integer;
- FMarkedProjs: TList;
- FAfterSelectProject: TAfterSelectEvent;
- function HasSelect(AProjectID: Integer): Boolean;
- procedure AddProjs(ANode: TsdIDTreeNode);
- procedure RemoveProjs(ANode: TsdIDTreeNode);
- procedure AssignSelectTenders;
- function GetTopParent: TsdIDTreeNode;
- procedure AddValidProject(ANode: TsdIDTreeNode);
- procedure FilterValidProject;
- function IsValidProj(AID: Integer): Boolean;
- procedure DoOnFilterRecord(ARecord: TsdDataRecord; var AAllow: Boolean);
- public
- constructor Create(AProjectID: Integer; ASpecialProjTypes: TStrings);
- destructor Destroy; override;
- procedure LoadHistorySelects(AProjs: TList);
- procedure AssignResult(AProjs: TList);
- procedure ClearMarkedProj;
- function CheckProjPhaseValid(APhaseIndex: Integer): Boolean;
- property AfterSelectProject: TAfterSelectEvent read FAfterSelectProject write FAfterSelectProject;
- end;
- implementation
- uses
- Globals, GatherProjInfo, MainFrm, Math, ZhAPI;
- {$R *.dfm}
- { TProjGatherSelectFrame }
- procedure TProjGatherSelectFrame.AddProjs(ANode: TsdIDTreeNode);
- var
- iChild: Integer;
- begin
- if FSelectProjs.IndexOf(Pointer(ANode.ID)) = -1 then
- FSelectProjs.Add(Pointer(ANode.id));
- for iChild := 0 to ANode.ChildCount - 1 do
- AddProjs(ANode.ChildNodes[iChild]);
- end;
- procedure TProjGatherSelectFrame.AddValidProject(ANode: TsdIDTreeNode);
- var
- iChild: Integer;
- begin
- FValidProjs.Add(ANode);
- for iChild := 0 to ANode.ChildCount - 1 do
- AddValidProject(ANode.ChildNodes[iChild]);
- end;
- procedure TProjGatherSelectFrame.AssignSelectTenders;
- procedure InitResultGrid;
- var
- i: Integer;
- begin
- zgResult.ColCount := 2;
- zgResult.RowCount := 1;
- zgResult.Cells[1, 0].Text := 'ËùÑ¡ÏîÄ¿';
- zgResult.ColWidths[1] := 308;
- if Assigned(FSpecialProjTypes) then
- begin
- zgResult.ColWidths[1] := 308 - (Min(FSpecialProjTypes.Count, 2)*45);
- for i := 0 to FSpecialProjTypes.Count - 1 do
- begin
- zgResult.ColCount := zgResult.ColCount + 1;
- zgResult.Cells[2+i, 0].Text := FSpecialProjTypes.Strings[i];
- zgResult.ColWidths[2+i] := 45;
- zgResult.CellClass.Cols[2+i] := TZjCheckBoxCell;
- end;
- end;
- end;
- var
- stnNode: TsdIDTreeNode;
- i, iProjectID: Integer;
- begin
- InitResultGrid;
- for i := 0 to FSelectProjs.Count - 1 do
- begin
- iProjectID := Integer(FSelectProjs.Items[i]);
- stnNode := stdSelectProject.IDTree.FindNode(iProjectID);
- if stnNode.Rec.ValueByName('Type').AsInteger = 1 then
- begin
- zgResult.RowCount := zgResult.RowCount + 1;
- zgResult.Cells[1, zgResult.RowCount - 1].Text :=
- stnNode.Rec.ValueByName('Name').AsString;
- zgResult.Cells[1, zgResult.RowCount - 1].Align := gaCenterLeft;
- zgResult.Rows[zgResult.RowCount - 1].Data := stnNode;
- end;
- end;
- end;
- constructor TProjGatherSelectFrame.Create(AProjectID: Integer;
- ASpecialProjTypes: TStrings);
- var
- i: Integer;
- begin
- inherited Create(nil);
- FMarkedProjs := TList.Create;
- FSelectProjs := TList.Create;
- FProjectID := AProjectID;
- FValidProjs := TList.Create;
- // È¡Ïû¹ýÂË
- //FilterValidProject;
- //ProjectManager.sdvProjectsSpare.OnFilterRecord := DoOnFilterRecord;
- ProjectManager.sdvProjectsSpare.Filtered := True;
- stdSelectProject.DataView := ProjectManager.sdvProjectsSpare;
- FSpecialProjTypes := ASpecialProjTypes;
- if FSpecialProjTypes <> nil then
- begin
- SetLength(FSpecialProjIDs, FSpecialProjTypes.Count);
- for i := 0 to ASpecialProjTypes.Count - 1 do
- FSpecialProjIDs[i] := -1;
- end;
- end;
- destructor TProjGatherSelectFrame.Destroy;
- begin
- //ProjectManager.sdvProjectsSpare.Filtered := False;
- //ProjectManager.sdvProjectsSpare.OnFilterRecord := nil;
- FValidProjs.Free;
- FSelectProjs.Free;
- FMarkedProjs.Free;
- inherited;
- end;
- procedure TProjGatherSelectFrame.DoOnFilterRecord(ARecord: TsdDataRecord;
- var AAllow: Boolean);
- begin
- AAllow := Assigned(ARecord) and IsValidProj(ARecord.ValueByName('ID').AsInteger);
- end;
- procedure TProjGatherSelectFrame.FilterValidProject;
- var
- vTopParent: TsdIDTreeNode;
- i: Integer;
- begin
- vTopParent := GetTopParent;
- AddValidProject(vTopParent);
- end;
- function TProjGatherSelectFrame.GetTopParent: TsdIDTreeNode;
- begin
- Result := ProjectManager.ProjectsTree.FindNode(FProjectID);
- while Assigned(Result.Parent) do
- Result := Result.Parent;
- end;
- function TProjGatherSelectFrame.HasSelect(AProjectID: Integer): Boolean;
- begin
- Result := FSelectProjs.IndexOf(Pointer(AProjectID)) <> -1;
- end;
- function TProjGatherSelectFrame.IsValidProj(AID: Integer): Boolean;
- var
- i: Integer;
- vNode: TsdIDTreeNode;
- begin
- Result := False;
- for i := 0 to FValidProjs.Count - 1 do
- begin
- vNode := TsdIDTreeNode(FValidProjs.Items[i]);
- if vNode.ID = AID then
- begin
- Result := True;
- Break;
- end;
- end;
- end;
- procedure TProjGatherSelectFrame.LoadHistorySelects(AProjs: TList);
- var
- i: Integer;
- vGatherProjInfo: TGatherProjInfo;
- begin
- for i := 0 to AProjs.Count - 1 do
- begin
- vGatherProjInfo := TGatherProjInfo(AProjs.Items[i]);
- FSelectProjs.Add(Pointer(vGatherProjInfo.ProjectID));
- if Assigned(FSpecialProjTypes) then
- begin
- if (vGatherProjInfo.ProjType > 0) and (vGatherProjInfo.ProjType <= FSpecialProjTypes.Count) then
- FSpecialProjIDs[vGatherProjInfo.ProjType-1] := vGatherProjInfo.ProjectID;
- end;
- end;
- AssignSelectTenders;
- end;
- procedure TProjGatherSelectFrame.RemoveProjs(ANode: TsdIDTreeNode);
- var
- iChild: Integer;
- i: Integer;
- begin
- if FSelectProjs.IndexOf(Pointer(ANode.ID)) <> -1 then
- begin
- FSelectProjs.Remove(Pointer(ANode.id));
- for i := Low(FSpecialProjIDs) to High(FSpecialProjIDs) do
- if FSpecialProjIDs[i] = ANode.ID then
- FSpecialProjIDs[i] := -1;
- end;
- for iChild := 0 to ANode.ChildCount - 1 do
- RemoveProjs(ANode.ChildNodes[iChild]);
- end;
- procedure TProjGatherSelectFrame.zgSelectProjectGetCellText(
- Sender: TObject; const ACoord: TPoint; var Value: String;
- DisplayText: Boolean);
- var
- stnNode: TsdIDTreeNode;
- begin
- if ACoord.X = 1 then
- begin
- stnNode := stdSelectProject.IDTree.Items[ACoord.Y - 1];
- if Assigned(stnNode) and HasSelect(stnNode.ID) then
- Value := 'True';
- end;
- end;
- procedure TProjGatherSelectFrame.zgSelectProjectSetCellText(
- Sender: TObject; const ACoord: TPoint; var Value: String;
- DisplayText: Boolean);
- var
- stnNode: TsdIDTreeNode;
- begin
- if ACoord.X = 1 then
- begin
- stnNode := stdSelectProject.IDTree.Items[ACoord.Y - 1];
- if Value = 'True' then
- AddProjs(stnNode)
- else
- RemoveProjs(stnNode);
- end;
- zgSelectProject.InvalidateCol(1);
- end;
- procedure TProjGatherSelectFrame.zgSelectProjectCellTextChanged(
- Sender: TObject; Col, Row: Integer);
- begin
- if (Col = 1) then
- begin
- AssignSelectTenders;
- if Assigned(FAfterSelectProject) then
- FAfterSelectProject;
- end;
- end;
- procedure TProjGatherSelectFrame.zgSelectProjectDrawCellText(
- ACanvas: TCanvas; const ARect: TRect; const ACoord: TPoint;
- AGrid: TZJGrid; const Text: String; var ADefaultDraw: Boolean);
- procedure GetBitmap(AImage: TBitmap);
- begin
- with stdSelectProject.IDTree.Items[ACoord.Y - 1] do
- if Rec.ValueByName('Type').AsInteger = 0 then
- if Expanded and HasChildren then
- MainForm.Images.GetBitmap(34, AImage)
- else
- MainForm.Images.GetBitmap(34, AImage)
- else
- MainForm.Images.GetBitmap(11, AImage);
- end;
- const
- rIconWidth = 16;
- rIconHeight = 16;
- var
- Img: TBitmap;
- Cell: TZjCell;
- rImg: TRect;
- begin
- if (ACoord.X = 2) and (ACoord.Y > zgSelectProject.FixedRowCount - 1) then
- begin
- Cell := zgSelectProject.Cells[ACoord.X, ACoord.Y];
- Img := TBitmap.Create;
- try
- GetBitmap(Img);
- case Cell.Align of
- gaTopLeft, gaTopCenter, gaTopRight:
- rImg := Rect(ARect.Left + 2, ARect.Top, ARect.Left + rIconWidth, ARect.Top + rIconHeight);
- gaCenterLeft, gaCenterCenter, gaCenterRight:
- rImg := Rect(ARect.Left + 2, ARect.Top + (ARect.Bottom - ARect.Top - rIconHeight) div 2, ARect.Left + rIconWidth, ARect.Bottom - (ARect.Bottom - ARect.Top - rIconHeight) div 2);
- gaBottomLeft, gaBottomCenter, gaBottomRight:
- rImg := Rect(ARect.Left + 2, ARect.Bottom - rIconHeight, ARect.Left + rIconWidth, ARect.Bottom);
- end;
- ACanvas.StretchDraw(rImg, Img);
- WriteText(ACanvas, Rect(ARect.Left + rIconWidth, ARect.Top, ARect.Right, ARect.Bottom)
- , 2, 2, Text, Cell.Align, False);
- ADefaultDraw := False;
- finally
- Img.Free;
- end;
- end;
- end;
- procedure TProjGatherSelectFrame.zgResultGetCellText(Sender: TObject;
- const ACoord: TPoint; var Value: String; DisplayText: Boolean);
- begin
- if (ACoord.X > 1) and (ACoord.Y > 0) then
- begin
- if Assigned(zgResult.Rows[ACoord.Y].Data) and (TsdIDTreeNode(zgResult.Rows[ACoord.Y].Data).ID = FSpecialProjIDs[ACoord.X-2]) then
- Value := 'True'
- else
- Value := 'False';
- end;
- end;
- procedure TProjGatherSelectFrame.zgResultSetCellText(Sender: TObject;
- const ACoord: TPoint; var Value: String; DisplayText: Boolean);
- var
- iProjID, i: Integer;
- stnNode: TsdIDTreeNode;
- begin
- if (ACoord.X > 1) and (ACoord.Y > 0) then
- begin
- stnNode := TsdIDTreeNode(zgResult.Rows[ACoord.Y].Data);
- iProjID := stnNode.ID;
- if FSpecialProjIDs[ACoord.X-2] <> iProjID then
- begin
- for i := Low(FSpecialProjIDs) to High(FSpecialProjIDs) do
- begin
- if FSpecialProjIDs[i] = iProjID then
- FSpecialProjIDs[i] := -1
- end;
- FSpecialProjIDs[ACoord.X-2] := iProjID;
- end
- else
- FSpecialProjIDs[ACoord.X-2] := -1;
- for i := 0 to FSpecialProjTypes.Count - 1 do
- zgResult.InvalidateCol(i+2);
- end;
- end;
- procedure TProjGatherSelectFrame.AssignResult(AProjs: TList);
- function SpecialProjType(AID: Integer): Integer;
- var
- i: Integer;
- begin
- Result := 0;
- for i := Low(FSpecialProjIDs) to High(FSpecialProjIDs) do
- begin
- if AID = FSpecialProjIDs[i] then
- begin
- Result := i+1;
- Break;
- end;
- end;
- end;
- var
- iRow: Integer;
- stnNode: TsdIDTreeNode;
- vGatherProj: TGatherProjInfo;
- begin
- AProjs.Clear;
- for iRow := 1 to zgResult.RowCount - 1 do
- begin
- stnNode := TsdIDTreeNode(zgResult.Rows[iRow].Data);
- vGatherProj := TGatherProjInfo.Create(stnNode, -1, SpecialProjType(stnNode.ID));
- AProjs.Add(vGatherProj);
- end;
- end;
- function TProjGatherSelectFrame.CheckProjPhaseValid(
- APhaseIndex: Integer): Boolean;
- var
- iRow: Integer;
- stnNode: TsdIDTreeNode;
- begin
- FMarkedProjs.Clear;
- for iRow := 1 to zgResult.RowCount - 1 do
- begin
- stnNode := TsdIDTreeNode(zgResult.Rows[iRow].Data);
- if stnNode.Rec.ValueByName('PhaseCount').AsInteger < APhaseIndex then
- FMarkedProjs.Add(Pointer(stnNode.ID));
- end;
- Result := FMarkedProjs.Count = 0;
- zgSelectProject.Invalidate;
- end;
- procedure TProjGatherSelectFrame.zgSelectProjectCellGetColor(
- Sender: TObject; ACoord: TPoint; var AColor: TColor);
- var
- vProj: TsdIDTreeNode;
- begin
- if ACoord.Y > 0 then
- begin
- vProj := stdSelectProject.IDTree.Items[ACoord.Y - 1];
- if Assigned(vProj) then
- begin
- if FMarkedProjs.IndexOf(Pointer(vProj.ID)) <> -1 then
- AColor := $00646AFE
- else
- AColor := clWindow;
- end;
- end;
- end;
- procedure TProjGatherSelectFrame.ClearMarkedProj;
- begin
- FMarkedProjs.Clear;
- zgSelectProject.Invalidate;
- end;
- end.
|