unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, StrUtils, Buttons, OleCtnrs, ExtCtrls, StdCtrls, ComCtrls; type TForm1 = class(TForm) Image1: TImage; PopupMenu1: TPopupMenu; PopupMenu2: TPopupMenu; N1: TMenuItem; N2: TMenuItem; N5: TMenuItem; MainMenu1: TMainMenu; N3: TMenuItem; N4: TMenuItem; N6: TMenuItem; N9: TMenuItem; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; N15: TMenuItem; N16: TMenuItem; N14: TMenuItem; N17: TMenuItem; PopupMenu3: TPopupMenu; N10: TMenuItem; Edit0: TEdit; N12: TMenuItem; N13: TMenuItem; N20: TMenuItem; N21: TMenuItem; Tabl: TMenuItem; N7: TMenuItem; N23: TMenuItem; N24: TMenuItem; B1: TMenuItem; H1: TMenuItem; N8: TMenuItem; N18: TMenuItem; ListView1: TListView; N29: TMenuItem; N22: TMenuItem; N25: TMenuItem; OleContainer1: TOleContainer; N19: TMenuItem; N26: TMenuItem; N30: TMenuItem; N31: TMenuItem; N33: TMenuItem; M100: TMenuItem; M50: TMenuItem; M25: TMenuItem; N11: TMenuItem; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure N1Click(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure N2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure N5Click(Sender: TObject); procedure N15Click(Sender: TObject); procedure N16Click(Sender: TObject); procedure Undo1Click(Sender: TObject); procedure N6Click(Sender: TObject); procedure N4Click(Sender: TObject); procedure N17Click(Sender: TObject); procedure FormActivate(Sender: TObject); procedure N10Click(Sender: TObject); procedure Edit0KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure N9Click(Sender: TObject); procedure N20Click(Sender: TObject); procedure N21Click(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure N12Click(Sender: TObject); procedure N7Click(Sender: TObject); procedure N23Click(Sender: TObject); procedure N24Click(Sender: TObject); procedure B1Click(Sender: TObject); procedure H1Click(Sender: TObject); procedure TablClick(Sender: TObject); procedure N25Click(Sender: TObject); procedure N26Click(Sender: TObject); procedure N30Click(Sender: TObject); procedure M100Click(Sender: TObject); procedure FormResize(Sender: TObject); private { Private declarations } myFunc: ^TImage; procedure Tekst(n:Integer); procedure Line(); procedure UdalWex(); procedure NewZad(n:Word); procedure Zad(n,na,ko,dli,fi:Word); procedure NewKrug(n,x,y,i:Integer); procedure Krug(n,m:Word); procedure Vid(); procedure TeZa(i,n,k:Word); procedure SpravkaFile(n:Word); function DoloiZpt(S:String):String; function Raschet(Sender: TObject):Boolean; function Cikl(j,k,n:Word):Boolean; procedure Mashtab(R1,R2:Word); procedure Masha(n:Word); public { Public declarations } Cvet:Boolean; PeredastFile,Spravka,Director: String; bm,kr : array [1..300] of TImage; NaKo,Wex : array [1..300,1..9] of Integer; TextZad, OtchZad,TextWex,ResZad : array [1..300] of String; KolZad,KolFlg,WibZad,WZ,Razmer,KolWex : Word; OldX,OldY,OldX1,OldY1,FormMous,Sdwig:Word; function Direktoria():String; end; const Gabarit: array[1..6] of Word = (60,35,16,24,12,6); var Form1: TForm1; implementation uses Unit2; {$R *.dfm} function TForm1.DoloiZpt(S:String):String; Var S1,S2:String; j:Word; begin S2:=''; For j:=1 to Length(S) do begin S1:=MidStr(S,j,1); if S1=chr(13) then S2:=S2+'/' else if S1=',' then S2:=S2+'.' else if not(S1=chr(10)) then S2:=S2+S1; end; Result:=S2; end; procedure TForm1.NewZad(n:Word); begin bm[n]:=TImage.Create(Self); With bm[n] do begin Tag:=KolZad; ControlStyle:=ControlStyle+[csOpaque]; Parent:=self; Visible:=true; PopupMenu:=PopupMenu2; ShowHint:=True; OnMouseDown:=Image1.OnMouseDown; OnMouseUp:=Image1.OnMouseUp; OnMouseMove:=Image1.OnMouseMove; Width:=70;//Trunc(Razmer/1.1); Height:=70;//Trunc(Razmer/1.1); Canvas.Rectangle(0,0,Width,Height); Width:=Razmer; Height:=Razmer; Left:=OldX; Top:=OldY; end; end; procedure TForm1.Zad(n,na,ko,dli,fi:Word); Var S:String; i,k:Word; begin KolZad:=KolZad+1; NaKo[KolZad][1]:=na; //Начало NaKo[KolZad][2]:=ko; //Конец NaKo[KolZad][3]:=dli; //Длительность NaKo[KolZad][4]:=fi; //Фиктивная или обычная NaKo[KolZad][5]:=0; //Ранний срок начала работы NaKo[KolZad][6]:=0; //Поздний срок окончания работы NaKo[KolZad][7]:=1; //Резерв времени NaKo[KolZad][8]:=OldX; // NaKo[KolZad][9]:=OldY; // TeZa(KolZad,na,ko); NewZad(KolZad); // Составление подсказки при создании задачи S:=OKBottomDlg.Memo1.Text; i:=Pos(chr(10),S); While i>0 do begin S:=LeftStr(S,i-1)+RightStr(S,Length(S)-i); i:=Pos(chr(10),S) end; k:=Length(S); For i:=1 to k do begin if S[k-i+1]>chr(13) then begin S:=LeftStr(S,k-i+1); break end; end; if S>'' then S:=chr(13)+S; bm[KolZad].Hint:=OKBottomDlg.Edit1.Text+S; end; Procedure TForm1.UdalWex(); Var i,j,k,l:Word; begin // Удаление вех For i:=1 to KolWex do begin k:=0; For j:=3 to KolZad do if (Wex[i][1]=NaKo[j][1])or(Wex[i][1]=NaKo[j][2]) then k:=1; if k<1 then begin For l:=i to KolWex-1 do begin Wex[l]:=Wex[l+1]; With kr[l] do begin Tag:=kr[l+1].Tag; Left:=kr[l+1].Left; Top:=kr[l+1].Top; TextWex[l]:=TextWex[l+1]; Hint:=kr[l+1].Hint; end; end; kr[KolWex].Free; KolWex:=KolWex-1; end else For j:=3 to KolZad do if (Wex[i][1]=NaKo[j][1])and(NaKo[j][4]=4) then kr[i].Hint:='Начало'; end; end; procedure TForm1.NewKrug(n,x,y,i:Integer); begin kr[n]:=TImage.Create(Self); With kr[n] do begin Tag:=n; Left:=x; Top:=y; Wex[n][1]:=i; //номер Вехи Wex[n][2]:=0; //Раннее начало Wex[n][3]:=0; //Поздний конец Wex[n][4]:=0; //Резерв Wex[n][8]:=x; // Left Wex[n][9]:=y; // Top ControlStyle:=ControlStyle+[csOpaque]; Parent:=self; Visible:=true; ShowHint:=True; PopupMenu:=PopupMenu3; OnMouseDown:=Image1.OnMouseDown; OnMouseUp:=Image1.OnMouseUp; OnMouseMove:=Image1.OnMouseMove; Width:=70; Height:=70; Canvas.Rectangle(0,0,Width,Height); Width:=Razmer; Height:=Razmer; end; end; procedure TForm1.Krug(n,m:Word); Var i,j,k,h:Integer; S:String; begin h:=0; for i:=1 to KolWex do if NaKo[n][2]=Wex[i][1] then begin h:=i; break; end; if h<1 then begin // Создаем новую веху посередине между работами KolWex:=KolWex+1; NewKrug(KolWex,Trunc((bm[n].Left+ bm[m].Left)/2)+Razmer, Trunc((bm[n].Top + bm[m].Top )/2),NaKo[n][2]); TextWex[KolWex]:=IntToStr(Wex[KolWex][1]); kr[KolWex].Visible:=false; kr[KolWex].Hint:=OtchZad[n]; if n=1 then kr[KolWex].Hint:='Начало'; if (m=2)and(OtchZad[n]='') then kr[KolWex].Hint:='Конец'; end else begin //Добавляем к существующей вехе текст kr[h].Hint:=chr(13); for i:=1 to KolZad do if NaKo[i][2]=Wex[h][1] then begin if NaKo[i][3]>0 then begin if OtchZad[i]>'' then S:=OtchZad[i] else S:=bm[i].Hint; if S>'' then begin j:=Pos(chr(13),S)-1; if j<1 then j:=Length(S); S:=LeftStr(S,j); if S>'' then kr[h].Hint:=kr[h].Hint+chr(13)+S; end end else begin k:=1; For j:=1 to KolWex do if NaKo[i][1]=Wex[j][1] then begin k:=j; break; end; S:=kr[k].Hint; kr[h].Hint:=kr[h].Hint+chr(13)+S; end; For j:=1 to Length(kr[h].Hint) do if MidStr(kr[h].Hint,j,1)>chr(13) then begin kr[h].Hint:=RightStr(kr[h].Hint,Length(kr[h].Hint)-j+1); break; end; end; end; end; procedure TForm1.Tekst(n:Integer); Var i,R,w,h:Word; OldBkMode: Integer; Function Dl(S:String):Word; begin Result:=Trunc(Length(S)*3.2); end; Function sdw(n:Word):Word; Var i:Word; begin if n=0 then i:=1 else begin i:=0; While n>0 do begin i:=i+1; n:=Trunc(n/10); end; end; Result:=Trunc(i*7); end; procedure Ser(n,r1,r2,r3,r4:Word); begin bm[n].Canvas.Brush.Color:=RGB(220,220,220); bm[n].Canvas.FillRect(Rect(r1+1,r2+1,r3-1,r4-1)); bm[n].Canvas.Brush.Color:=clWhite; end; begin if n>0 then begin // Надписи для задачи w:=bm[n].Width; h:=Trunc(w/3); R:=Trunc(w/2); if bm[n].Visible=true then begin With bm[n].Canvas do begin if NaKo[n][7]<1 then bm[n].Canvas.Pen.Color:=clRed; Rectangle(0,0,w,w); if not M25.Checked then begin if not M50.Checked then begin MoveTo(R,0); LineTo(R,w); Rectangle(0,h,w,w-h); end; if (NaKo[n][4]=4)and(Cvet) then Ser(n,0,h,w-R,w-h); //Начало if (NaKo[n][4]=5)and(Cvet) then Ser(n,R,h,w,w-h-1); //Конец //Работа на критическом пути if (NaKo[n][3]=0)and(Cvet) then Ser(n,0,w-h-1,R+1,W); //Фиктивная Brush.Color:=clWhite; OldBkMode := SetBkMode(Handle, TRANSPARENT); Font.Style:=[fsBold]; TextOut(R-Dl(TextZad[n]),R-6,TextZad[n]); Font.Style:=[]; if M100.Checked then begin TextOut(Trunc(R/2-sdw(NaKo[n][5])/2),3,IntToStr(NaKo[n][5])); TextOut(Trunc(3*R/2-sdw(NaKo[n][6])/2),3,IntToStr(NaKo[n][6]-NaKo[n][3])); TextOut(Trunc(R/2-sdw(NaKo[n][3])/2),Trunc(w-18),IntToStr(NaKo[n][3])); TextOut(Trunc(3*R/2-sdw(NaKo[n][7])/2),Trunc(w-18),IntToStr(NaKo[n][7])); end; SetBkMode(Handle, OldBkMode); end; end; end; end else begin // Надписи для События n:=-n; R:=Razmer; With kr[n].Canvas do begin if Cvet then begin Brush.Color:=Color; Pen.Color:=Color; end else begin Brush.Color:=clWhite; Pen.Color:=clWhite; end; Rectangle(Rect(0, 0, R, R)); Brush.Color:=clWhite; Pen.Color:=clBlack; Ellipse(Rect(0,0,R,R)); Font.Style:=[fsBold]; if M100.Checked then begin i:=Trunc(0.15*R); MoveTo(i,i); LineTo(R-i,R-i); MoveTo(i,R-i); LineTo(R-i,i); TextOut(Trunc(R/2-sdw(Wex[n][1])/2),6,IntToStr(Wex[n][1]-4)); Font.Style:=[]; TextOut(Trunc((R/2-sdw(Wex[n][2]))/2),Trunc(R/2)-7,IntToStr(Wex[n][2])); TextOut(Trunc(3/4*R-sdw(Wex[n][3])/3),Trunc(R/2)-7,IntToStr(Wex[n][3])); TextOut(Trunc(R/2-sdw(Wex[n][4])/3),Trunc(R/2)+12,IntToStr(Wex[n][4])) end else if M50.Checked then TextOut(Trunc(R/2-sdw(Wex[n][1])/2),12,IntToStr(Wex[n][1]-4)); Font.Style:=[]; end; end; end; procedure TForm1.Line(); Var i,j,x1,x2,y1,y2,w,h,kx,ky,r:Integer; a,b:Real; kk:Integer; begin if N21.Checked=true then for j:=1 to KolWex do Tekst(-j); Form1.Repaint; w:=Trunc(Razmer/2); h:=Trunc(Razmer/2); r:=Trunc(Sqrt(Sdwig*7)); For i:=1 to KolZad do begin //Линии между задачами if N20.Checked=true then begin if bm[i].Visible=true then begin x1:=bm[i].Left+w; y1:=bm[i].Top+w; For j:=1 to KolZad do if (not(NaKo[j][1]=0))and(not(NaKo[i][2]=0))and (NaKo[i][2]=NaKo[j][1])and((NaKo[j][4]<2)or(NaKo[j][4]>3))then With Canvas do begin x2:=bm[j].Left+w; y2:=bm[j].Top+w; if x1=x2 then a:=3.14/2 else a:=arctan((y1-y2)/(x1-x2)); MoveTo(x1,y1); if a*a*16<3.14*3.14 then begin kx:=Trunc(x2-w); ky:=Trunc(y2-w*sin(a)); end else begin kx:=Trunc(x2-w*cos(a)); if a<0 then ky:=Trunc(y2+w) else ky:=Trunc(y2-w); end; b:=20/180*3.14; if x10)and(NaKo[i][2]>0) then With Canvas do begin x1:=0; x2:=0; y1:=0; y2:=0; For j:=1 to KolWex do if NaKo[i][1]=Wex[j][1] then begin x1:=kr[j].Left+h; y1:=kr[j].Top+h; break; end; For j:=1 to KolWex do if NaKo[i][2]=Wex[j][1] then begin x2:=kr[j].Left+h; y2:=kr[j].Top+h; break; end; if (x1>0)and(x2>0)and(y1>0)and(y2>0) then begin if NaKo[i][3]=0 then Pen.Style:=psDot; if x1=x2 then a:=3.14/2 else a:=arctan((y1-y2)/(x1-x2)); if NaKo[i][7]<1 then Pen.Color:=clRed; if (NaKo[i][7]<1)and(Pen.Style=psSolid)and(not M25.Checked) then Pen.Width:=2; kx:=Trunc(h*cos(a)); ky:=Trunc(h*sin(a)); if x19 then kk:=6 else kk:=3; if M100.Checked then TextOut(Trunc((x1+x2)/2)-kk,Trunc((y1+y2)/2)-6,IntToStr(NaKo[i][3])); Pen.Color:=clBlack; Pen.Width:=1; end; end; end; end; if N20.Checked=true then for j:=1 to KolZad do Tekst(j); end; procedure TForm1.N1Click(Sender: TObject); begin With OKBottomDlg do begin Edit2.Text:=''; Edit3.Text:=''; Caption:='Новая задача'; if ShowModal=1 then begin Zad(KolZad,0,0,SpinEdit4.Value,0); if bm[KolZad].LeftForm1.ClientWidth then begin bm[KolZad].Left:=Form1.ClientWidth-Razmer-Sdwig; NaKo[KolZad][8]:=Trunc(Image1.Tag*bm[KolZad].Left/2); end; if bm[KolZad].Top+Razmer>Form1.ClientHeight-Sdwig then begin bm[KolZad].Top:=Form1.ClientHeight-Razmer-Sdwig; NaKo[KolZad][8]:=Trunc(Image1.Tag*bm[KolZad].Top/2); end; if RadioButton7.Checked=true then //Начало begin NaKo[KolZad][1]:=2; NaKo[KolZad][4]:=4; Krug(1,KolZad); end; if RadioButton4.Checked=true then //Конец begin NaKo[KolZad][2]:=3; NaKo[KolZad][4]:=5; Krug(KolZad,2); end; ResZad[KolZad]:=Edit2.Text; OtchZad[KolZad]:=Edit3.Text; TeZa(KolZad,NaKo[KolZad][1],NaKo[KolZad][2]); Line; end; end; end; procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); Var i,j,n,m,k,l,Oldn,OldWZ:Word; begin n:=(Sender as TImage).Tag; m:=WZ; if Cursor=crHandPoint then if NaKo[n][4]=5 then ShowMessage('У конечной работы нет последователей!') else if NaKo[m][4]=4 then ShowMessage('У начальной работы нет предшественников!') else begin Oldn:=NaKo[n][2]; OldWZ:=NaKo[m][1]; k:=0; l:=1; //Предварительные прикидки if NaKo[m][1]<1 then begin if NaKo[n][2]<1 then begin KolFlg:=KolFlg+1; NaKo[m][1]:=KolFlg; NaKo[n][2]:=KolFlg; end else begin NaKo[m][1]:=NaKo[n][2]; end; end else begin if NaKo[n][2]<1 then NaKo[n][2]:=NaKo[m][1] else begin if not(NaKo[n][2]=NaKo[m][1]) then begin For i:=1 to KolZad do if ((NaKo[i][1]=NaKo[n][2])and(NaKo[i][2]=NaKo[m][1]))or ((NaKo[i][2]=NaKo[n][2])and(NaKo[i][1]=NaKo[m][1])) then k:=1; if k>0 then l:=0 else begin if MessageDlg('Создать фиктивную работу?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin OKBottomDlg.Memo1.Clear; OKBottomDlg.Edit1.Text:='Фиктивная'; OKBottomDlg.SpinEdit4.Value:=0; OKBottomDlg.RadioButton6.Checked:=true; i:=KolZad; N1Click(Sender); if i0 then begin if (NaKo[n][1]=NaKo[i][1])and(NaKo[n][2]=NaKo[i][2]) then k:=1; if (NaKo[n][2]=NaKo[i][1])and(NaKo[n][1]=NaKo[i][2]) then k:=1; end; if NaKo[m][2]>0 then begin if (NaKo[m][1]=NaKo[i][1])and(NaKo[m][2]=NaKo[i][2]) then k:=1; if (NaKo[m][2]=NaKo[i][1])and(NaKo[m][1]=NaKo[i][2]) then k:=1; end; end; if NaKo[n][1]=NaKo[n][2] then k:=1; if NaKo[m][1]=NaKo[m][2] then k:=1; if (NaKo[m][1]>0)and(NaKo[n][1]>0) then if ((NaKo[m][1]=NaKo[n][1])and(NaKo[m][2]=NaKo[n][2]))or ((NaKo[m][1]=NaKo[n][2])and(NaKo[m][2]=NaKo[n][1])) then k:=1; if (k>0)and(l>0) then begin if MessageDlg('Создать фиктивную работу?',mtConfirmation,[mbYes,mbNo],0)=mrYes then begin OKBottomDlg.Memo1.Clear; OKBottomDlg.Edit1.Text:='Фиктивная'; OKBottomDlg.SpinEdit4.Value:=0; OKBottomDlg.RadioButton6.Checked:=true; i:=KolZad; N1Click(Sender); if i0 then With (Sender as TImage) do begin kx:=Left; ky:=Top; if kx>0 then kx:=0; if ky>0 then ky:=0; xm:=Sdwig; ym:=Sdwig; if N20.Checked=true then begin For i:=1 to KolZad do begin if xm>bm[i].Left then xm:=bm[i].Left; if ym>bm[i].Top then ym:=bm[i].Top; end; For i:=1 to KolZad do begin bm[i].Left:=bm[i].Left-kx; bm[i].Top:=bm[i].Top-ky; NaKo[i][8]:=Trunc(Image1.Tag*(bm[i].Left-xm)/2); NaKo[i][9]:=Trunc(Image1.Tag*(bm[i].Top-ym)/2); end; end else begin For i:=1 to KolWex do begin if xm>kr[i].Left then xm:=kr[i].Left; if ym>kr[i].Top then ym:=kr[i].Top; end; For i:=1 to KolWex do begin kr[i].Left:=kr[i].Left-kx; kr[i].Top:=kr[i].Top-ky; Wex[i][8]:=Trunc(Image1.Tag*(kr[i].Left-xm)/2); Wex[i][9]:=Trunc(Image1.Tag*(kr[i].Top-ym)/2); end; end; end; WZ:=WibZad; WibZad:=0; Line; end; procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin if WibZad>0 then With (Sender as TImage) do begin Left:=Left+X-OldX; Top:=Top+Y-OldY; end; end; procedure TForm1.N2Click(Sender: TObject); Var i,j,n,k:Word; begin n:=myFunc.Tag; // Перемещение задач For i:=n to KolZad-1 do begin NaKo[i]:=NaKo[i+1]; TextZad[i]:=TextZad[i+1]; bm[i].Left:=bm[i+1].Left; bm[i].Top:=bm[i+1].Top; bm[i].Hint:=bm[i+1].Hint; end; // Удаление задачи bm[KolZad].Free; KolZad:=KolZad-1; // Обнуление коцов For i:=3 to KolZad do begin k:=0; For j:=1 to KolZad do if (NaKo[i][2]>0)and(NaKo[i][2]=NaKo[j][1]) then k:=1; if k=0 then NaKo[i][2]:=0; k:=0; For j:=1 to KolZad do if (NaKo[i][1]>0)and(NaKo[i][1]=NaKo[j][2]) then k:=1; if k=0 then NaKo[i][1]:=0; TeZa(i,NaKo[i][1],NaKo[i][2]); end; UdalWex; Line; end; procedure TForm1.FormActivate(Sender: TObject); begin Cvet:=True; Razmer:=Gabarit[2]; Sdwig:=Gabarit[5]; KolZad:=0; KolWex:=0; WibZad:=0; WZ:=0; FormMous:=0; KolFlg:=2; Masha(2); //Создание начала и конца (невидимы) Zad(KolZad,KolFlg-1,KolFlg,0,2); bm[KolZad].Visible:=false; bm[KolZad].Left:=Sdwig; bm[KolZad].Top:=Sdwig; NaKo[KolZad][1]:=KolFlg-1; NaKo[KolZad][2]:=KolFlg; NaKo[KolZad][3]:=0; NaKo[KolZad][8]:=Trunc(Image1.Tag*Sdwig/2); NaKo[KolZad][9]:=Trunc(Image1.Tag*Sdwig/2); KolFlg:=4; Zad(KolZad,KolFlg-1,KolFlg,0,3); bm[KolZad].Visible:=false; bm[KolZad].Left:=ClientWidth-Razmer-Sdwig; bm[KolZad].Top:=ClientHeight-Razmer-Sdwig; NaKo[KolZad][1]:=KolFlg-1; NaKo[KolZad][2]:=KolFlg; NaKo[KolZad][3]:=0; NaKo[KolZad][8]:=Trunc(Image1.Tag*bm[KolZad].Left/2); NaKo[KolZad][9]:=Trunc(Image1.Tag*bm[KolZad].Top/2); if PeredastFile>'' then N4Click(Sender); N20Click(Sender); //Задачи end; procedure TForm1.N5Click(Sender: TObject); begin Cursor:=crHandPoint; end; procedure TForm1.N15Click(Sender: TObject); Var i:Word; begin if Application.MessageBox('Создать новый документ?'+chr(13)+ 'Старый документ будет удален.', 'ВНИМАНИЕ', MB_OKCANCEL)=1 then begin For i:=1 to KolZad do bm[i].Free; For i:=1 to KolWex do kr[i].Free; FormActivate(Sender); Line; end; end; procedure TForm1.N16Click(Sender: TObject); begin // Удаление связи if NaKo[WZ][1]>1 then Cursor:=crNoDrop; end; procedure TForm1.Undo1Click(Sender: TObject); begin // Возвращение на один ход назад end; procedure TForm1.N6Click(Sender: TObject); Var F:TextFile; i,j,k:Word; S,S1:String; begin SaveDialog1.FileName:=Direktoria+'\*.csv'; if SaveDialog1.Execute then begin S:=SaveDialog1.FileName; if Pos('.csv',S)<1 then S:=S+'.csv'; i:=0; if FileExists(S) then if Application.MessageBox('Такой файл уже существует.'+chr(13)+ 'Заменить его?','ВНИМАНИЕ',MB_OKCANCEL)=1 then i:=0 else i:=1; if i<1 then begin Masha(2); //Нажали размер Нормальный // Сохраняем в csv-файл S1:=RightStr(Caption,Length(Caption)-Length(OleContainer1.Caption)-3); S1:=InputBox('Название проекта','Введите название проекта:',S1); OleContainer1.Caption:=ExtractFileName(S); Caption:=OleContainer1.Caption+' - '+S1; AssignFile(F,S); Rewrite(F); k:=0; if N20.Checked=true then k:=1 else N20Click(Sender); Writeln(F,S1); Writeln(F,'Pred,Posl,Dlit,Fiktiv,X,Y,Text'); For i:=3 to KolZad do begin S:=''; For j:=1 to 4 do S:=S+IntToStr(NaKo[i][j])+','; S:=S+IntToStr(NaKo[i][8])+','+IntToStr(NaKo[i][9])+','+DoloiZpt(OtchZad[i])+','; S:=S+DoloiZpt(bm[i].Hint); Writeln(F,S+','+ResZad[i]); end; N21Click(Sender); Writeln(F,'X,Y,№,Hint'); For i:=1 to KolWex do begin S:=IntToStr(Wex[i][8])+','+IntToStr(Wex[i][9])+','; Writeln(F,S+TextWex[i]+','+DoloiZpt(kr[i].Hint)); end; CloseFile(F); if k>0 then N20Click(Sender); end; end; Line; end; procedure TForm1.N4Click(Sender: TObject); Var F:TextFile; S,S1:String; i,j,m,k,l:Word; n:array [1..6] of Integer; begin if PeredastFile>'' then OpenDialog1.FileName:=PeredastFile else OpenDialog1.FileName:=Direktoria+'\*.csv'; k:=0; if PeredastFile='' then begin if OpenDialog1.Execute then k:=1 end else k:=1; PeredastFile:=''; if k>0 then begin S1:=OpenDialog1.FileName; if FileExists(S1) then begin For i:=1 to KolZad do bm[i].Free; For i:=1 to KolWex do kr[i].Free; FormActivate(Sender); k:=0; // Загрузка csv-файла AssignFile(F,S1); Reset(F); Readln(F,S); //название проекта OleContainer1.Caption:=ExtractFileName(S1); Caption:=OleContainer1.Caption+' - '+S; Readln(F,S); if Pos('Pred,Posl,Dlit,Fiktiv,X,Y,Text',S)=0 then ShowMessage('Нет заголовка') else while not(Eof(F)) do begin Readln(F,S); if S>'' then begin // Загрузка Enter-ов m:=Pos('/',S); While m>0 do begin S:=LeftStr(S,m-1)+chr(13)+RightStr(S,Length(S)-m); m:=Pos('/',S); end; if Pos('X,Y,№,Hint',S)>0 then begin k:=1; //Автоматическая расстановка Вех // N21Click(Sender); // События For i:=1 to KolZad do if NaKo[i][2]>0 then For l:=1 to KolZad do if NaKo[i][2]=NaKo[l][1] then Krug(i,l); end else if k>0 then begin // Загрузка Вех For i:=1 to 3 do begin n[i]:=StrToInt(LeftStr(S,Pos(',',S)-1)); S:=RightStr(S,Length(S)-Pos(',',S)); end; For i:=1 to KolWex do begin if Wex[i][1]=n[3] then begin kr[i].Left:=n[1]; kr[i].Top:=n[2]; n[3]:=Pos(',',S); if n[3]>0 then TextWex[i]:=LeftStr(S,n[3]-1) else TextWex[i]:=IntToStr(Wex[i][1]); kr[i].Hint:=RightStr(S,Length(S)-Pos(',',S)); Wex[i][2]:=0; Wex[i][3]:=0; Wex[i][4]:=1; Wex[i][8]:=Trunc(Image1.Tag*kr[i].Left/2); Wex[i][9]:=Trunc(Image1.Tag*kr[i].Top/2); end; end; end else begin // Загрузка задач KolZad:=KolZad+1; For i:=1 to 6 do begin n[i]:=StrToInt(LeftStr(S,Pos(',',S)-1)); S:=RightStr(S,Length(S)-Pos(',',S)); end; OtchZad[KolZad]:=LeftStr(S,Pos(',',S)-1); S:=RightStr(S,Length(S)-Pos(',',S)); j:=Pos(',',S); if j<1 then j:=Length(S); ResZad[KolZad]:=RightStr(S,Length(S)-j); NaKo[KolZad][1]:=n[1]; NaKo[KolZad][2]:=n[2]; NaKo[KolZad][3]:=n[3]; NaKo[KolZad][4]:=n[4]; NaKo[KolZad][5]:=0; NaKo[KolZad][6]:=0; NaKo[KolZad][7]:=1; if n[4]=4 then NaKo[KolZad][1]:=2; if n[4]=5 then NaKo[KolZad][2]:=3; TeZa(KolZad,NaKo[KolZad][1],NaKo[KolZad][2]); NewZad(KolZad); bm[KolZad].Hint:=LeftStr(S,j-1); bm[KolZad].Left:=n[5]; bm[KolZad].Top:=n[6]; NaKo[KolZad][8]:=Trunc(Image1.Tag*n[5]/2); NaKo[KolZad][9]:=Trunc(Image1.Tag*n[6]/2); if (NaKo[KolZad][4]=2)or(NaKo[KolZad][4]=3) then bm[KolZad].Visible:=false; end; end; end; CloseFile(F); if k<1 then For i:=1 to KolZad do if NaKo[i][2]>0 then For l:=1 to KolZad do if NaKo[i][2]=NaKo[l][1] then Krug(i,l); // Последняя (невидимая) работа i:=0; For j:=3 to KolZad do if i0 do begin S:=RightStr(S,Length(S)-k); k:=Pos(chr(13),S); if k=0 then Memo1.Lines.Add(S) else Memo1.Lines.Add(LeftStr(S,k-1)); end; SpinEdit4.Value:=NaKo[n][3]; if NaKo[n][4]=4 then RadioButton7.Checked:=true else if NaKo[n][4]=5 then RadioButton4.Checked:=true else RadioButton6.Checked:=true; Edit2.Text:=ResZad[n]; Edit3.Text:=OtchZad[n]; //Открываем окно диалога if (NaKo[n][1]=0)or(NaKo[n][2]=0) then Caption:='Задача' else Caption:='Задача '+TextZad[n]; if ShowModal=1 then begin S:=Memo1.Text; i:=Pos(chr(10),S); While i>0 do begin S:=LeftStr(S,i-1)+RightStr(S,Length(S)-i); i:=Pos(chr(10),S) end; k:=Length(S); For i:=1 to k do begin if S[k-i+1]>chr(13) then begin S:=LeftStr(S,k-i+1); break end; end; if S>'' then S:=chr(13)+S; bm[n].Hint:=Edit1.Text+S; NaKo[n][3]:=SpinEdit4.Value; if OKBottomDlg.RadioButton7.Checked=true then begin NaKo[n][1]:=2; For j:=3 to KolZad do if NaKo[j][1]=NaKo[n][2] then begin m:=1; For l:=3 to KolZad do if (not(n=l))and(NaKo[l][2]=NaKo[j][1]) then m:=0; if m>0 then NaKo[j][1]:=0; end; NaKo[n][2]:=0; NaKo[n][4]:=4; NaKo[1][2]:=2; Krug(1,n); end; if OKBottomDlg.RadioButton4.Checked=true then begin NaKo[n][2]:=3; For j:=3 to KolZad do if NaKo[j][2]=NaKo[n][1] then begin m:=1; For l:=3 to KolZad do if (not(n=l))and(NaKo[l][1]=NaKo[j][2]) then m:=0; if m>0 then NaKo[j][2]:=0; end; NaKo[n][1]:=0; NaKo[n][4]:=5; NaKo[2][1]:=3; Krug(n,2); end; if OKBottomDlg.RadioButton6.Checked=true then begin if NaKo[n][4]=5 then NaKo[n][2]:=0; if NaKo[n][4]=4 then NaKo[n][1]:=0; NaKo[n][4]:=0; end; OtchZad[n]:=Edit3.Text; ResZad[n]:=Edit2.Text; TeZa(n,NaKo[n][1],NaKo[n][2]); end; end; Line; end; procedure TForm1.TeZa(i,n,k:Word); begin if n=2 then TextZad[i]:='1-'+IntToStr(k-4) //начало else if k=3 then TextZad[i]:=IntToStr(n-4)+'-'+IntToStr(KolWex+1) //конец else TextZad[i]:=IntToStr(n-4)+'-'+IntToStr(k-4); end; procedure TForm1.N10Click(Sender: TObject); Var i:Word; begin //Название для Вехи i:=Trunc(Razmer/2); Edit0.Left:=kr[myFunc.Tag].Left+i; Edit0.Top:=kr[myFunc.Tag].Top+i; Edit0.Visible:=true; Edit0.Text:=kr[myFunc.Tag].Hint; end; procedure TForm1.Edit0KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key=27 then begin Edit0.Visible:=false; Line; end; if Key=13 then begin Edit0.Visible:=false; kr[myFunc.Tag].Hint:=Edit0.Text; Line; end; end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin OldX:=X; OldY:=Y; Cursor:=crDefault; Edit0.Visible:=false; OKBottomDlg.RadioButton6.Checked:=true; end; procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin OldX:=X; OldY:=Y; end; // ПОИСК КРИТИЧЕСКОГО ПУТИ Function TForm1.Raschet(Sender: TObject):Boolean; Var i,j,k:Integer; wrem: array[1..100,1..2] of Integer; Resultat: Boolean; Function RN(n:Word):Word; Var i,j,Max: Word; begin Max:=0; For i:=1 to KolZad do if NaKo[i][2]=NaKo[n][1] then begin j:=RN(i); if Max0 then begin For i:=1 to k do begin NaKo[i][5]:=0; NaKo[i][6]:=0; NaKo[i][7]:=1; end; For i:=1 to KolWex do begin Wex[i][2]:=0; Wex[i][3]:=0; Wex[i][4]:=1; end; N20Click(Sender); Line; bm[k].Canvas.Brush.Color:=clYellow; Tekst(k); bm[k].Canvas.Brush.Color:=clWhite; end else begin // Сортировка ВЕХ For i:=1 to KolWex do begin wrem[i][1]:=Wex[i][2]; wrem[i][2]:=i end; For i:=1 to KolWex do For j:=i+1 to KolWex do if wrem[i][1]>wrem[j][1] then begin k:=wrem[i][1]; wrem[i][1]:=wrem[j][1]; wrem[j][1]:=k; k:=wrem[i][2]; wrem[i][2]:=wrem[j][2]; wrem[j][2]:=k; end; For i:=1 to KolWex do For j:=1 to KolZad do begin k:=wrem[i][2]; if Wex[k][1]=NaKo[j][1] then NaKo[j][1]:=-i-4; if Wex[k][1]=NaKo[j][2] then NaKo[j][2]:=-i-4; end; For j:=1 to KolZad do begin NaKo[j][1]:=Abs(NaKo[j][1]); NaKo[j][2]:=Abs(NaKo[j][2]); end; For j:=1 to KolWex do Wex[wrem[j][2]][1]:=j+4; For j:=1 to KolZad do TeZa(j,NaKo[j][1],NaKo[j][2]); KolFlg:=0; For j:=1 to KolZad do if KolFlgNaKo[i][2] then begin n:=NaKo[i][1]; m:=NaKo[i][2]; For j:=3 to KolZad do begin if NaKo[j][1]=n then NaKo[j][1]:=m else if NaKo[j][1]=m then NaKo[j][1]:=n; if NaKo[j][2]=n then NaKo[j][2]:=m else if NaKo[j][2]=m then NaKo[j][2]:=n; end; For j:=1 to KolWex do begin if Wex[j][1]=n then Wex[j][1]:=-m; if Wex[j][1]=m then Wex[j][1]:=-n; end; For j:=1 to KolWex do begin Wex[j][1]:=Abs(Wex[j][1]); TextWex[j]:=IntToStr(Wex[j][1]); end; end; end; For j:=3 to KolZad do Teza(j,NaKo[j][1],NaKo[j][2]); Line; end; end; function TForm1.Cikl(j,k,n:Word):Boolean; Var i:Word; begin n:=n+1; Result:=False; if n>KolZad then Result:=True else if (j=k)and(n>1) then Result:=True else begin For i:=3 to KolZad do if NaKo[i][2]=NaKo[j][1] then begin Result:=Cikl(i,k,n); end; end; if Result then begin bm[j].Canvas.Pen.Color:=clRed; bm[j].Canvas.Font.Color:=clRed; Tekst(j); end; end; procedure TForm1.N20Click(Sender: TObject); begin N9.Enabled:=true; Tabl.Checked:=false; ListView1.Visible:=false; if N20.Checked=false then begin PopupMenu:=PopupMenu1; N20.Checked:=true; N21.Checked:=false; Vid; end; end; procedure TForm1.Vid(); Var i:Word; begin For i:=3 to KolZad do bm[i].Visible:=N20.Checked; For i:=1 to KolWex do kr[i].Visible:=not N20.Checked; Line; end; procedure TForm1.N21Click(Sender: TObject); begin N9.Enabled:=true; Tabl.Checked:=false; ListView1.Visible:=false; if N21.Checked=false then begin PopupMenu:=nil; N21.Checked:=true; N20.Checked:=false; Vid; end; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); Var S:Char; begin S:=chr(Key); if (Shift=[ssAlt]) then begin // if S>chr(27) then ShowMessage(IntToStr(Key)); //Сдвиг сетевого графика if Key=36 then N7Click(Sender); if Key=37 then N23Click(Sender); if Key=38 then B1Click(Sender); if Key=39 then N24Click(Sender); if Key=40 then H1Click(Sender); // Масштаб графика if (Key in [49,97]) then Masha(1); // Большой размер if (Key in [50,98]) then Masha(2); // Нормальный размер if (Key in [51,99]) then Masha(3); // Мелкий размер //Переключение между вехами и задачами if (S in ['Q','q','Й','й']) then if N20.Checked=true then N21Click(Sender) else N20Click(Sender); end; if (Shift=[ssCtrl]) then begin if (S in ['N','n','Т','т']) then N15Click(Sender); // New if (S in ['O','o','Щ','щ']) then N4Click(Sender); // Open if (S in ['S','s','Ы','ы']) then N6Click(Sender); // Save end; end; procedure TForm1.N12Click(Sender: TObject); Var F:TextFile; OldBkMode,MaxX,MaxY,MinX,MinY,R,c : Integer; i,j,x1,x2,y1,y2,w,h,kx,ky,kk: Integer; Bitmap : TImage; a,b: Real; SS:String; S1: PAnsiChar; Function Dl(S:String):Word; begin Result:=Trunc(Length(S)*3.2); end; Function sdw(n:Word):Word; Var i:Word; begin if n=0 then i:=1 else begin i:=0; While n>0 do begin i:=i+1; n:=Trunc(n/10); end; end; Result:=Trunc(i*7); end; const Tabliza: array[0..7] of String = ('Код','t','Трн','Тро','Тпн','Тпо','Rп','Rс'); begin if Tabl.Checked=false then begin // Рисуем белые задачи и события Cvet:=False; Line; // Находим размеры сетевого графика MinX:=10000; MinY:=10000; MaxX:=0; MaxY:=0; if N20.Checked then begin For i:=3 to KolZad do begin if MinX>bm[i].Left then MinX:=bm[i].Left; if MinY>bm[i].Top then MinY:=bm[i].Top; if MaxXkr[i].Left then MinX:=kr[i].Left; if MinY>kr[i].Top then MinY:=kr[i].Top; if MaxXСетевой график'+chr(13)+ ''+chr(13)+ ''+chr(13)+ RightStr(Caption,Length(Caption)-Length(OleContainer1.Caption)-3)+'
'+chr(13)+ ''+chr(13)+'
'+chr(13)+'
'); CloseFile(F); // Рисуем сетевой график Bitmap := TImage.Create(Self); Bitmap.Width:=MaxX; Bitmap.Height:=MaxY; with Bitmap.Canvas do begin CopyMode:=cmSrcCopy; if N20.Checked then begin // Рисуем задачи For i:=3 to KolZad do begin R:=bm[i].Width; w:=Trunc(R/2); x1:=bm[i].Left+w-MinX; y1:=bm[i].Top+w-MinY; // Линии между задачами For j:=1 to KolZad do if (not(NaKo[j][1]=0))and(not(NaKo[i][2]=0))and (NaKo[i][2]=NaKo[j][1])and((NaKo[j][4]<2)or(NaKo[j][4]>3))then begin x2:=bm[j].Left+w-MinX; y2:=bm[j].Top+w-MinY; if x1=x2 then a:=3.14/2 else a:=arctan((y1-y2)/(x1-x2)); MoveTo(x1,y1); if a*a*16<3.14*3.14 then begin kx:=Trunc(x2-w); ky:=Trunc(y2-w*sin(a)); end else begin kx:=Trunc(x2-w*cos(a)); if a<0 then ky:=Trunc(y2+w) else ky:=Trunc(y2-w); end; b:=20/180*3.14; c:=Trunc(Sqrt(Sdwig*7)); if x10)and(NaKo[i][2]>0) then begin x1:=0; x2:=0; y1:=0; y2:=0; h:=w; For j:=1 to KolWex do if NaKo[i][1]=Wex[j][1] then begin x1:=kr[j].Left+h-MinX; y1:=kr[j].Top+h-MinY; break; end; For j:=1 to KolWex do if NaKo[i][2]=Wex[j][1] then begin x2:=kr[j].Left+h-MinX; y2:=kr[j].Top+h-MinY; break; end; if (x1>0)and(x2>0)and(y1>0)and(y2>0) then begin if NaKo[i][3]=0 then Pen.Style:=psDot; if x1=x2 then a:=3.14/2 else a:=arctan((y1-y2)/(x1-x2)); if NaKo[i][7]<1 then Pen.Color:=clRed; if (NaKo[i][7]<1)and(Pen.Style=psSolid)and(not M25.Checked) then Pen.Width:=2; kx:=Trunc(h*cos(a)); ky:=Trunc(h*sin(a)); if x19 then kk:=6 else kk:=3; if M100.Checked then TextOut(Trunc((x1+x2)/2)-kk,Trunc((y1+y2)/2)-6,IntToStr(NaKo[i][3])); Pen.Color:=clBlack; Pen.Width:=1; end; end; end; end; // Сохраняем сетевой график в файл Bitmap.Picture.SaveToFile(Director+'\graf.bmp'); Bitmap.Free; Cvet:=True; Line; end else begin // Рисуем таблицу // Создаем html-файл AssignFile(F,Director+'\graf.htm'); Rewrite(F); SS:='Таблица'+ ''+ '

'+ 'Print(Для печати щелкни сюда правой мышкой)

'+''; For i:=0 to 7 do SS:=SS+''; For i:=3 to KolZad do begin SS:=SS+''; SS:=SS+''; SS:=SS+''; SS:=SS+''; SS:=SS+''; SS:=SS+''; SS:=SS+''; kk:=0; For j:=3 to KolZad do if NaKo[i][2]=NaKo[j][1] then begin kk:=j; break end; if kk>0 then SS:=SS+'' else SS:=SS+''; end; SS:=SS+'
'+Tabliza[i]+'
'+TextZad[i]+''+IntToStr(NaKo[i][3])+''+IntToStr(NaKo[i][5])+''+IntToStr(NaKo[i][5]+NaKo[i][3])+''+IntToStr(NaKo[i][6]-NaKo[i][3])+''+IntToStr(NaKo[i][6])+''+IntToStr(NaKo[i][6]-NaKo[i][5]-NaKo[i][3])+''+ IntToStr(NaKo[kk][5]-NaKo[i][5]-NaKo[i][3])+'0

В таблице использованы следующие сокращения:

'+ 't - длительность работы'+ '
Трн - ранний срок начала работы'+ '
Тро - ранний срок окончания работы'+ '
Тпн - поздний срок начала работы'+ '
Тпо - ранний срок окончания работы'+ '
Rп - полный резерв времени'+ '
- свободный резерв времени'+ '

Расшифровка работ, приведенных в таблице

'; For j:=3 to KolZad do SS:=SS+''+TextZad[j]+' - '+bm[j].Hint+'
'; SS:=SS+'

Расшифровка событий

'; For j:=1 to KolWex do SS:=SS+''+IntToStr(j)+' - '+kr[j].Hint+'
'; SS:=SS+''; Writeln(F,SS); CloseFile(F); end; // Просмотр результата OleContainer1.CreateLinkToFile(Director+'\graf.htm',true); OleContainer1.DoVerb(0); end; procedure TForm1.N7Click(Sender: TObject); Var i,MinX,MinY: Integer; begin // Сдвиг графика MinX:=0; MinY:=0; if N20.Checked=true then begin if KolZad>2 then begin MinX:=bm[3].Left; MinY:=bm[3].Top; For i:=3 to KolZad do begin if MinX>bm[i].Left then MinX:=bm[i].Left; if MinY>bm[i].Top then MinY:=bm[i].Top; end end end else begin if KolWex>0 then begin MinX:=kr[1].Left; MinY:=kr[1].Top; For i:=1 to KolWex do begin if MinX>kr[i].Left then MinX:=kr[i].Left; if MinY>kr[i].Top then MinY:=kr[i].Top; end end end; if N20.Checked=true then For i:=3 to KolZad do begin bm[i].Left:=bm[i].Left-MinX+Sdwig; bm[i].Top:=bm[i].Top-MinY+Trunc(Sdwig/2); NaKo[i][8]:=Trunc(Image1.Tag*bm[i].Left/2); NaKo[i][9]:=Trunc(Image1.Tag*bm[i].Top/2); end else For i:=1 to KolWex do begin kr[i].Left:=kr[i].Left-MinX+Sdwig; kr[i].Top:=kr[i].Top-MinY+Trunc(Sdwig/2); Wex[i][8]:=Trunc(Image1.Tag*kr[i].Left/2); Wex[i][9]:=Trunc(Image1.Tag*kr[i].Top/2); end; Line; end; procedure TForm1.N23Click(Sender: TObject); Var i:Word; begin // Сдвиг влево if N20.Checked=true then begin For i:=3 to KolZad do if bm[i].Left>Sdwig then begin bm[i].Left:=bm[i].Left-Sdwig; NaKo[i][8]:=Trunc(Image1.Tag*bm[i].Left/2); end else break; end else begin For i:=1 to KolWex do if kr[i].Left>Sdwig then begin kr[i].Left:=kr[i].Left-Sdwig; Wex[i][8]:=Trunc(Image1.Tag*kr[i].Left/2); end else break; end; Line; end; procedure TForm1.B1Click(Sender: TObject); Var i:Word; begin // Сдвиг вниз if N20.Checked=true then begin For i:=3 to KolZad do if bm[i].Top>Sdwig then begin bm[i].Top:=bm[i].Top-Sdwig; NaKo[i][9]:=Trunc(Image1.Tag*bm[i].Top/2); end else break; end else begin For i:=1 to KolWex do if kr[i].Top>Sdwig then begin kr[i].Top:=kr[i].Top-Sdwig; Wex[i][9]:=Trunc(Image1.Tag*kr[i].Top/2); end else break; end; Line; end; procedure TForm1.N24Click(Sender: TObject); Var i:Word; begin // Сдвиг вправо if N20.Checked=true then For i:=3 to KolZad do begin bm[i].Left:=bm[i].Left+Sdwig; NaKo[i][8]:=Trunc(Image1.Tag*bm[i].Left/2); end else For i:=1 to KolWex do begin kr[i].Left:=kr[i].Left+Sdwig; Wex[i][8]:=Trunc(Image1.Tag*kr[i].Left/2); end; Line; end; procedure TForm1.H1Click(Sender: TObject); Var i:Word; begin // Сдвиг вверх if N20.Checked=true then For i:=3 to KolZad do begin bm[i].Top:=bm[i].Top+Sdwig; NaKo[i][9]:=Trunc(Image1.Tag*bm[i].Top/2); end else For i:=1 to KolWex do begin kr[i].Top:=kr[i].Top+Sdwig; Wex[i][9]:=Trunc(Image1.Tag*kr[i].Top/2); end; Line; end; procedure TForm1.TablClick(Sender: TObject); Var i,j,k: Word; ListItem: TListItem; begin N9.Enabled:=false; Tabl.Checked:=true; ListView1.Visible:=true; ListView1.Clear; For i:=3 to KolZad do begin ListItem := ListView1.Items.Add; Listitem.Caption := TextZad[i]; ListItem.SubItems.Add(IntToStr(NaKo[i][3])); ListItem.SubItems.Add(IntToStr(NaKo[i][5])); ListItem.SubItems.Add(IntToStr(NaKo[i][5]+NaKo[i][3])); ListItem.SubItems.Add(IntToStr(NaKo[i][6]-NaKo[i][3])); ListItem.SubItems.Add(IntToStr(NaKo[i][6])); ListItem.SubItems.Add(IntToStr(NaKo[i][6]-NaKo[i][5]-NaKo[i][3])); k:=0; For j:=3 to KolZad do if NaKo[i][2]=NaKo[j][1] then begin k:=j; break end; if k>0 then ListItem.SubItems.Add(IntToStr(NaKo[k][5]-NaKo[i][5]-NaKo[i][3])) else ListItem.SubItems.Add(IntToStr(0)); end; ListView1.Columns.Add; ListView1.Column[ListView1.Columns.Count-1].Free; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); Var i:Word; begin For i:=1 to KolZad do bm[i].Free; For i:=1 to KolWex do kr[i].Free; KolZad:=0; KolWex:=0; SpravkaFile(0); end; procedure TForm1.SpravkaFile(n:Word); Var F:TextFile; S:String; begin AssignFile(F,Director+'\Options.ini'); if n=0 then begin Rewrite(F); if not(WindowState=wsNormal) then WindowState:=wsNormal; Writeln(F,'[SPU]'); Writeln(F,'Width='+IntToStr(Width)); Writeln(F,'Height='+IntToStr(Height)); Writeln(F,'Left='+IntToStr(Left)); Writeln(F,'Top='+IntToStr(Top)); // Writeln(F,'Spravka='+Spravka); end; if n=1 then begin Reset(F); Readln(F,S); Readln(F,S); Width:=StrToInt(RightStr(S,Length(S)-Pos('=',S))); Readln(F,S); Height:=StrToInt(RightStr(S,Length(S)-Pos('=',S))); Readln(F,S); Left:=StrToInt(RightStr(S,Length(S)-Pos('=',S))); Readln(F,S); Top:=StrToInt(RightStr(S,Length(S)-Pos('=',S))); // Readln(F,S); Spravka:=RightStr(S,Length(S)-Pos('=',S)); end; CloseFile(F); end; procedure TForm1.FormCreate(Sender: TObject); begin new(myFunc); if (paramcount>0)and(FileExists(paramstr(1))) then PeredastFile:=paramstr(1) else PeredastFile:=''; ListView1.Align:=alClient; Director:=Direktoria(); if FileExists(Director+'\Options.ini') then SpravkaFile(1); end; function TForm1.Direktoria():String; Var S:String; i:Word; begin S:=GetCurrentDir(); i:=1; repeat if (RightStr(S,1)='\')or(RightStr(S,1)='/') then S:=LeftStr(S,Length(S)-1) else i:=0; until i=0; Result:=S; end; procedure TForm1.N25Click(Sender: TObject); Var i,k:Word; begin N20Click(Sender); For i:=1 to KolWex do kr[i].Free; KolWex:=0; KolFlg:=0; For i:=1 to KolZad do if NaKo[i][2]>0 then For k:=1 to KolZad do if NaKo[i][2]=NaKo[k][1] then Krug(i,k); N21Click(Sender); end; procedure TForm1.N30Click(Sender: TObject); begin MessageDlg('Сетевое Планирование и Управление'+chr(13)+chr(13)+ 'Автор: Канунников Г.Н. (г.Снежинск)'+chr(13)+ 'e-mail: gazodin@bk.ru'+chr(13)+ 'Сайт: http://motosnz.narod.ru'+chr(13) ,mtInformation,[mbOk],0); end; procedure TForm1.N26Click(Sender: TObject); begin Close; end; procedure TForm1.Mashtab(R1,R2:Word); Var i: Word; R3:Real; procedure RisMas(Krt:TImage;x,y:Integer); begin Krt.Width:=R1; Krt.Height:=R1; Krt.Left:=Trunc(x*R3); Krt.Top:=Trunc(y*R3); end; begin R3:=R2/2; // Процедура работы с масштабами For i:=1 to KolWex do RisMas(kr[i],-10000,-10000); For i:=1 to KolZad do RisMas(bm[i],-10000,-10000); Form1.Refresh; For i:=1 to KolWex do RisMas(kr[i],Wex[i][8],Wex[i][9]); For i:=1 to KolZad do RisMas(bm[i],NaKo[i][8],NaKo[i][9]); end; procedure TForm1.M100Click(Sender: TObject); begin // Масштаб нажатием меню With (Sender as TMenuItem) do if not Checked then Masha(Tag); end; procedure TForm1.Masha(n:Word); begin //Программый Запуск масштаба if n=1 then begin Sdwig:=Gabarit[4]; Mashtab(Gabarit[1],4); Razmer:=Gabarit[1]; M25.Checked:=false; M50.Checked:=false; M100.Checked:=true; Image1.Tag:=1; end else if n=2 then begin Sdwig:=Gabarit[5]; Mashtab(Gabarit[2],2); Razmer:=Gabarit[2]; M25.Checked:=false; M50.Checked:=true; M100.Checked:=false; Image1.Tag:=2; end else if n=3 then begin Sdwig:=Gabarit[6]; Mashtab(Gabarit[3],1); Razmer:=Gabarit[3]; M25.Checked:=true; M50.Checked:=false; M100.Checked:=false; Image1.Tag:=4; end; Line; end; procedure TForm1.FormResize(Sender: TObject); begin if KolZad>1 then begin bm[2].Left:=ClientWidth-Razmer; end; end; end.