home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2002 September
/
Chip_2002-09_cd1.bin
/
zkuste
/
delphi
/
kompon
/
d123456
/
STR_BIT.ZIP
/
16
/
LINPR
/
LINPR.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
2000-03-29
|
15KB
|
425 lines
program LinPreob;
{$F+,S-,E+,V-}
uses
Dos, StrBit16, HelpFile, LinPr_h, Menus, Pastools,
Objects,dialogs, Drivers, Views, StdDlg, MsgBox, App, Memory, Editors;
const
WildCard : PathStr = '*.*';
Imq_prog : PathStr =
'Åp«úpá¼¼á óδ»«½¡Ñ¡¿∩ ½¿¡Ñ⌐¡δσ »αÑ«íαẫóá¡¿⌐ ñó«¿τ¡«ú« »«Γ«¬á';
HeapSize = 96 * (1024 div 16);
Max_Razm_Bit = 720;
Max_razm_Byte = 90;
type
TTVMy = object(TApplication)
constructor Init;
procedure InitStatusLine; Virtual;
procedure GetEvent(var Event: TEvent); Virtual;
function GetPalette: PPalette; Virtual;
end;
PinpMay = ^TinpMay;
TinpMay = object(TInputLine)
procedure HandleEvent(var Event:TEvent); Virtual;
end;
PinpZn = ^TinpZn;
TinpZn = object(TInputLine)
procedure HandleEvent(var Event:TEvent); Virtual;
end;
PinpMayKon = ^TinpMayKon;
TinpMayKon = object(TInputLine)
procedure HandleEvent(var Event:TEvent); Virtual;
end;
PMatrix = ^TMatrix;
TMatrix = array[1..Max_Razm_Bit,1..Max_razm_Byte] of Byte;
var
Xod_vyp : PRunningLine;
R : TRect;
P: PView;
D: PFileDialog; InWin : PDialog;
T : TTVMy;
Im_prot,
IM_is: PathStr; { ê¼∩ ¿ßσ«ñ¡«ú« «ípáíáΓδóáѼ«ú« Σá⌐½á }
Byte_Razm_matr,
Razm_matr, { Paº¼Ñα¡«ßΓ∞ ¼áΓα¿µδ }
Kol_nul_str, { î¿¡¿¼á½∞¡«Ñ ¬«½-ó« 0 ßΓ᫬ ó óδó«ñ¿¼«⌐ ¡á »ÑτáΓ∞ ¼áΓα¿µÑ}
Sdvig_Strok, { ü¿Γ«óδ⌐ ßñó¿ú ßΓ᫬¿ »α¿ Σ«α¼¿α«óá¡¿¿ ¼áΓα¿µδ }
Sdvig_Matr, { æñó¿ú ¼Ñªñπ ¡áτá½á¼¿ Σ«α¼¿α«óá¡¿∩ ¼áΓα¿µ }
Rang, i, j, Razm_nul, Skor, Stup, Diag, Stroka, Stolb : integer;
Bit_nach, { 쫼Ñα í¿Γá ¡áτá½á «íαáí«Γ¬¿ ¡á »«Γ«¬Ñ }
Kol_iter, Bit_tek : Longint;
ind_osh : word;
ff: text; { öá⌐½ ªπα¡á½á ΓѬπΘÑ⌐ αáí«Γδ }
Im : string[110]; { Åα«¼ÑªπΓ«τ¡á∩ »ÑαѼѡ¡á∩, ¿ß»«½∞ºπÑΓß∩ ñ½∩ «íÑß» F3 }
Dlina : byte absolute Im;
is_file: PBitFile; { êßσ«ñ¡δ⌐ í¿Γ«óδ⌐ »«Γ«¬ }
Matrix : PMatrix;
ClipWindow: PEditWindow;
BitMas : array[1..Max_Razm_Bit] of byte;
{$L Gauss.obj}
Function Gauss ( m: pointer ; Rstr, N : word) : word;
external;
{$L Bybor.obj}
Procedure Bybor(mis,mrez : pointer; Nbis,Hag,kol : word);
external;
procedure TinpMayKon.HandleEvent(var Event:TEvent);
var ob_str : PathStr;
DirInfo: SearchRec;
procedure Dialog;
begin
D := New(PFileDialog, Init(WildCard,'éδíÑp¿ΓÑ ¿¼∩ Σá⌐½á',
'ê¼∩ Σá⌐½á', fdOpenButton , 100));
if Desktop^.ExecView(D) <> cmCancel then begin
D^.GetFileName(ob_str);
data^ :=ob_str end;
Dispose(D, Done);
DrawView end;
begin
OB_STR := DATA^;
if (Event.What = evKeyDown)
and ((Event.KeyCode = kbEnter)OR (Event.KeyCode = kbTab)) then begin
FindFirst(ob_str, Archive, DirInfo);
if DosError <> 0 then dialog
end
ELSE if (Event.What = evKeyDown) { ¡áªáΓá ¬½áó¿Φá F3 }
and (Event.KeyCode = kbF3) then dialog
{ éδípáΓ∞ ¿¼∩ Σá⌐½á ó ñ¿á½«ú«ó«¼ pѪ¿¼Ñ }
else TInputLine.HandleEvent(Event);
end;
{ çá¼Ñ¡á ßΓá¡ñápΓ¡«ú« pÑñ-pá ßΓp«¬ ¡á óδípá¡¡δ⌐ }
{ éó«ñ »«½∩ ¿¼Ñ¡¿ Σá⌐½á }
procedure TInpMay.HandleEvent(var Event:TEvent);
var ob_str : PathStr;
begin
if (Event.What = evKeyDown) { ¡áªáΓá ¬½áó¿Φá F3 }
and (Event.KeyCode = kbF3) then begin
{ éδípáΓ∞ ¿¼∩ Σá⌐½á ó ñ¿á½«ú«ó«¼ pѪ¿¼Ñ }
D := New(PFileDialog, Init(WildCard,'éδíÑp¿ΓÑ ¿¼∩ Σá⌐½á',
'ê¼∩ Σá⌐½á', fdOpenButton , 100));
if Desktop^.ExecView(D) <> cmCancel then begin
D^.GetFileName(ob_str);
data^ :=ob_str end;
Dispose(D, Done);
DrawView end
else TInputLine.HandleEvent(Event);
end;
{ çá¼Ñ¡á ßΓá¡ñápΓ¡«ú« pÑñ-pá ßΓp«¬ ¡á óδípá¡¡δ⌐ }
{ éó«ñ »«½∩ τ¿ß½á }
procedure TInpZn.HandleEvent(var Event:TEvent);
begin
if not( (Event.What = evKeyDown) and { ¡áªáΓá ¬½áó¿Φá }
(Event.CharCode in [':'..chr(255)]) )
then TInputLine.HandleEvent(Event);
end;
procedure TTVMy.InitStatusLine;
{ çáñá¡¿Ñ ßΓ᫬¿ ßΓáΓπßá }
var
R: TRect;
begin
GetExtent(R);
R.A.Y := R.B.Y - 1;
StatusLine := New(PStatusLine, Init(R,
NewStatusDef(0, $FFFF,
NewStatusKey('~Alt-X~ éδσ«ñ', kbAltX, cmQuit,
NewStatusKey('~F1~ Å«¼«Θ∞', kbF1, cmHelp,
NewStatusKey('~F2~ Save', kbF2, cmSave,
NewStatusKey('~Alt-F3~ Close', kbAltF3, cmClose,
NewStatusKey('~F5~ Zoom', kbF5, cmZoom, nil))))), nil)));
end;
function TTVMy.GetPalette: PPalette;
{ Ä»αÑñѽѡ¿Ñ µóÑΓá «¬«¡ }
const
CNewColor = CAppColor + CHelpColor;
CNewBlackWhite = CAppBlackWhite + CHelpBlackWhite;
CNewMonochrome = CAppMonochrome + CHelpMonochrome;
P: array[apColor..apMonochrome] of string[Length(CNewColor)] =
(CNewColor, CNewBlackWhite, CNewMonochrome);
begin
GetPalette := @P[AppPalette];
end;
procedure TTVMy.GetEvent(var Event: TEvent);
{ Åα«ß¼«Γα Σá⌐½á »«¼«Θ¿ }
var
W: PWindow;
HelpFile: PHelpFile;
HelpStrm: PDosStream;
const
HelpInUse: Boolean = False;
begin
inherited GetEvent(Event);
if (Event.What = evCommand) and (Event.Command = cmHelp) and
not HelpInUse then
begin
im := ParamStr(0); Dec(Dlina,4); im := im + '_h.hlp';
HelpStrm := New(PDosStream, Init(im, stOpenRead));
HelpFile := New(PHelpFile, Init(HelpStrm));
if HelpStrm^.Status <> stOk then begin
MessageBox('ìѽ∞º∩ «Γ¬pδΓ∞ Σá⌐½ »«¼«Θ¿', nil,mfOKButton);
Dispose(HelpFile, Done); end
else begin
HelpInUse := True;
W := New(PHelpWindow,Init(Helpfile, GetHelpCtx));
if ValidView(W) <> nil then begin
ExecView(W);
Dispose(W, Done);
end;
HelpInUse := False; ClearEvent(Event);
end end;
end;
constructor TTVMy.Init;
{ Äípáí«Γ¬á ¬«¼á¡ñ¡«⌐ ßΓp«¬¿ »p«úpá¼¼δ }
{ éó«ñ ¡Ññ«ßΓáεΘ¿σ »áαá¼ÑΓα«ó ó ñ¿á½«ú«ó«¼ αѪ¿¼Ñ }
function Kom_str: Boolean;
var i, kol,kode : integer; S, S_vn : PathStr;
rez : Boolean;
function Ob_par : integer;
begin
Val(S_vn,kol,kode);
if (Kode <> 0) or (kol < 1) then rez := True;
Ob_par := kol;
end; {Ob_par}
begin
rez := False;
for I := 1 to ParamCount do
begin
S := ParamStr(I);
if S[1] = '/' then begin
S_vn := Copy(S,3,length(S)-2);
case UpCase(S[2]) of
'i','I': Im_is := S_vn;
'j','J': Im_prot := S_vn;
'n','N': begin Val(S_vn,Bit_nach,kode);
if Kode <> 0 then rez := True end;
'r','R': Razm_matr := Ob_par;
'v','V': Kol_nul_str := Ob_par;
'm','M': Sdvig_Strok := Ob_par;
's','S': Sdvig_Matr := Ob_par;
else rez := True
end end
else rez := True
end;
if rez then MessageBox('HÑ»páó¿½∞¡« ºáñá¡á ¬«¼á¡ñ¡á∩ ßΓp«¬á ',
NIL, mfOKButton);
Kom_str := rez;
end; {Kom_Str}
function kontr : boolean;
{ Åα«óÑα¬á ¡á½¿τ¿∩ óδíαá¡¡δσ Σá⌐½«ó ¡á ñ¿ß¬Ñ ¿ »αáó¿½∞¡«ßΓ¿ ºáñá¡¿∩ º¡áτÑ¡ }
var Pravil : boolean;
DirInfo: SearchRec;
begin
Pravil := False;
FindFirst(im_is, Archive, DirInfo);
if DosError <> 0 then Pravil := True;
if (Kol_nul_str + 4) > Razm_matr then Pravil := True;
if Razm_matr < 8 then Pravil := True;
if Razm_matr >720 then Pravil := True;
kontr := Pravil;
end;
{********************************************************}
{ Äß¡«ó¡«Ñ Γѽ« »p«úpá¼¼δ ß »«ß½Ññ«óáΓѽ∞¡«ßΓ∞ε ñÑ⌐ßΓó¿⌐ }
const lst = 79;
type Datatyp = record
m_is : string[lst];
m_Razm_matr : string[5];
m_Kol_nul_str : String[5];
m_Sdvig_Strok : String[5];
m_Sdvig_Matr : string[5];
m_Bit_nach : String[10];
m_prot : string;
end;
var Data : Datatyp; Bm_is : PinpMayKon;
Bm_prot: PinpMay;
Bm_Razm_matr, Bm_Kol_nul_str, Bm_Sdvig_Strok, Bm_Sdvig_Matr,
Bm_Bit_nach : PinpZn;
kod,kont : integer;
{ ÄíÑß»ÑτÑ¡¿Ñ ¿ß»«½∞º«óá¡¿∩ TURBO VISION 2.0 }
begin
MaxHeapSize := HeapSize;
inherited Init;
RegisterObjects;
RegisterViews;
RegisterMenus;
RegisterDialogs;
RegisterApp;
RegisterHelpFile;
{ ÅαÑñóáα¿Γѽ∞¡«Ñ ºáñá¡¿Ñ ¡áτá½∞¡δσ º¡áτÑ¡¿⌐ »ÑαѼѡ¡δσ }
im_prot := 'protokol.txt'; im_is := '';
Razm_matr := 50; { Paº¼Ñα¡«ßΓ∞ ¼áΓα¿µδ }
Kol_nul_str := 5; { î¿¡¿¼á½∞¡«Ñ ¬«½-ó« 0 ßΓ᫬ ó óδó«ñ¿¼«⌐ ¡á »ÑτáΓ∞ ¼áΓα¿µÑ}
Sdvig_Strok := 1; { ü¿Γ«óδ⌐ ßñó¿ú ßΓ᫬¿ »α¿ Σ«α¼¿α«óá¡¿¿ ¼áΓα¿µδ }
Sdvig_Matr:= 2000;{ æñó¿ú ¼Ñªñπ ¡áτá½á¼¿ Σ«α¼¿α«óá¡¿∩ ¼áΓα¿µ }
Bit_nach :=0; { 쫼Ñα í¿Γá ¡áτá½á «íαáí«Γ¬¿ ¡á »«Γ«¬Ñ }
Kont := 0;
R.Assign(5,0,75,8); { éδó«ñ ß««íΘÑ¡¿∩ « ¡áº¡áτÑ¡¿¿ »p«úpá¼¼δ }
if MessageBoxRect(R, #3+Imq_prog,NIL,
mfOKButton + mfCancelButton) = cmCancel then halt(256-5);
if Kom_Str then halt(256-1);
while (kontr or (Im_is ='')) and (kont <> CmCancel) do
begin { éóÑßΓ¿ »ápá¼ÑΓpδ ¡Ñ ºáñá¡¡δÑ ó ¬«¼á¡ñ¡«⌐ ßΓp«¬Ñ }
Data.m_is := im_is;
Data.m_prot := im_prot;
Str ( Sdvig_Matr, Data.m_Sdvig_Matr);
Str ( Razm_matr, Data.m_Razm_matr);
Str ( Kol_nul_str, Data.m_Kol_nul_str);
Str ( Bit_nach, Data.m_Bit_nach);
STR ( Sdvig_Strok, Data.m_Sdvig_Strok);
R.Assign(0,2,80,20);
InWin := New(Pdialog,init(R,'ìáßΓp«⌐¬á »ápá¼ÑΓp«ó »p«úpá¼¼δ'));
With InWin^ do begin { ö«p¼¿p«óá¡¿Ñ «¬¡á ºá»p«ßá }
R.Assign(22,1,77,2);
Bm_is := New(PinpMayKon,Init(R,lst));
insert (Bm_is);
R.Assign(1,1,17,2);
insert (New(Plabel,Init(R,'êßσ«ñ¡δ⌐ Σá⌐½', Bm_is)));
R.Assign(22,3,28,4);
Bm_Razm_matr := New(PinpZn,Init(R,5));
insert (Bm_Razm_matr);
R.Assign(1,3,20,4);
insert (New(Plabel,Init(R,'Éá¼Ñα¡«ßΓ∞ ¼áΓα¿µδ', Bm_Razm_matr)));
R.Assign(70,3,77,4);
Bm_Kol_nul_str := New(PinpZn,Init(R,5));
insert (Bm_Kol_nul_str);
R.Assign(41,3,68,4);
insert (New(Plabel,Init(R,'諽¿τÑßΓó« ¡π½Ñóδσ ßΓ᫬', Bm_Kol_nul_str)));
R.Assign(49,5,56,6);
Bm_Sdvig_Strok := New(PinpZn,Init(R,5));
insert (Bm_Sdvig_Strok); { Å«½Ñ 使¡δ æè }
R.Assign(1,5,48,6);
insert (New(Plabel,Init(R,'ü¿Γ«óδ⌐ ßñó¿ú ßΓ᫬¿ »α¿ Σ«α¼¿α«óá¡¿¿ ¼áΓα¿µδ', Bm_Sdvig_Strok)));
R.Assign(49,7,56,8);
Bm_Sdvig_Matr := New(PinpZn,Init(R,5));
insert (Bm_Sdvig_Matr); { Å«½Ñ ¿¼Ñ¡¿ }
R.Assign(1,7,48,8);
insert (New(Plabel,Init(R,'æñó¿ú ¼Ñªñπ ¡áτá½á¼¿ Σ«α¼¿α«óá¡¿∩ ¼áΓα¿µ', Bm_Sdvig_Matr)));
R.Assign(44,9,56,10);
Bm_Bit_nach := New(PinpZn,Init(R,10));
insert (Bm_Bit_nach); { Å«½Ñ ¿¼Ñ¡¿ }
R.Assign(1,9,40,10);
insert (New(Plabel,Init(R,'쫼Ñα í¿Γá ¡áτá½á «íαáí«Γ¬¿ ¡á »«Γ«¬Ñ', Bm_Bit_nach)));
R.Assign(22,11,77,12);
Bm_prot := New(PinpMay,Init(R,lst));
insert (Bm_prot); { Å«½Ñ Σá⌐½á ß««íΘÑ¡¿⌐ }
R.Assign(1,11,17,12);
insert (New(Plabel,Init(R,'åπp¡á½ páí«Γδ', Bm_prot)));
{ éßΓáó¿Γ∞ ñóÑ ¬«¼á¡ñ¡δÑ ¬¡«»¬¿ }
R.Assign(4,13,35,15);
insert (New(PButton,
Init(R,'Åápá¼ÑΓpδ ºáñá¡δ »páó¿½∞¡«',cmOk,bfDefault)));
R.Assign(42,13,76,15);
insert (New(PButton,
Init(R,'çáóÑpΦ¿Γ∞ óδ»«½¡Ñ¡¿Ñ »p«úpá¼¼δ',cmCancel,bfNormal)));
R.Assign(1,16,78,17);
insert (New(PStaticText,
Init(R,#3+'~F3~ óδípáΓ∞ Σá⌐½ ¿º ßπΘÑßΓóπεΘ¿σ')));
SelectNext(False); { Ç¬Γ¿ó¿º¿p«óáΓ∞ »Ñpóπε ¬¡«»¬π }
end; { ¬«¡Ñµ Σ-∩ «¬¡á }
InWin^.SetData(Data); { éδ»«½¡Ñ¡¿Ñ óó«ñá ¿ßσ«ñ¡δσ »ápá¼ÑΓp«ó }
Kont := DeskTop^.ExecView(InWin);
Im_is := Bm_is^.data^;
im_prot := Bm_prot^.data^;
Val(Bm_Sdvig_Matr^.Data^, Sdvig_Matr, kod);
Val(Bm_Kol_nul_str^.Data^, Kol_nul_str, kod);
Val(Bm_Sdvig_Strok^.Data^, Sdvig_Strok, kod);
Val(Bm_Bit_nach^.Data^, Bit_nach, kod);
Val(Bm_Razm_matr^.Data^, Razm_matr, kod);
Dispose(InWin, Done);
end;
If Kont = CmCancel then begin
T.Done; halt(256-5) end;
assign (ff,im_prot);
{$I-}
Append(ff);
{$I+}
if IOResult <> 0 then Rewrite(ff);
Writeln(Ff,'');
Writeln(Ff,Imq_prog);
Writeln(Ff,'ÄíαáíáΓδóáÑΓß∩ Σá⌐½ ',Im_is);
Writeln(Ff,'쫼Ñα í¿Γá ¡áτá½á «íαáí«Γ¬¿ ¡á »«Γ«¬Ñ = ',Bit_nach);
Writeln(Ff,'PẼÑα¡«ßΓ∞ ¼áΓα¿µδ = ',Razm_matr);
Writeln(Ff,'î¿¡¿¼á½∞¡«Ñ ¬«½-ó« 0 ßΓ᫬ ó óδó«ñ¿¼«⌐ ¡á »ÑτáΓ∞ ¼áΓα¿µÑ = ',Kol_nul_str);
Writeln(Ff,'ü¿Γ«óδ⌐ ßñó¿ú ßΓ᫬¿ »α¿ Σ«α¼¿α«óá¡¿¿ ¼áΓα¿µδ = ',Sdvig_Strok);
Writeln(Ff,'æñó¿ú ¼Ñªñπ ¡áτá½á¼¿ Σ«α¼¿α«óá¡¿∩ ¼áΓα¿µ = ',Sdvig_Matr);
{*********************************************************}
{* Äíαáí«Γ¬á ºáñá¡¡δσ Σá⌐½«ó *}
{*********************************************************}
{ ê¡¿µ¿á½¿ºáµ¿∩ í¿Γ«óδσ »ÑαѼѡ¡δσ }
Kol_iter := 0; Skor := 10000 div Razm_matr +1;
Byte_Razm_matr := ( Razm_matr + 7 ) div 8;
Razm_nul := Razm_matr - Kol_nul_str;
GetMem(Matrix, (Max_razm_Byte*Max_Razm_Bit));
is_file := New(PBitFile,Init(Max_Razm_Bit,4096));
if is_file^.OpenBitFile(im_is,btOpenRead) <> btOk Then Exit;
New(Xod_vyp,Init('Äíαáí«Γ¬á Σá⌐½á',
is_file^.SizeOfFile,rlFullInf));
{****** éδ»«½¡Ñ¡¿Ñ óδτ¿ß½Ñ¡¿⌐ ¿ ¡á¬«»½Ñ¡¿Ñ αѺπ½∞ΓáΓ«ó ******}
repeat
inc(Kol_iter);
if (Kol_iter mod Skor) = 0 then Xod_vyp^.StatusDisplay( Bit_nach );
Bit_tek := Bit_nach;
for i := 1 to Razm_matr do begin { Σ«α¼¿α«óá¡¿Ñ ¼áΓα¿µδ }
is_file^.SeekStr(Bit_tek);
ind_osh := is_file^.ReadStr(Razm_matr);
is_file^.Val_Array ( Matrix^[i,1], Byte_Razm_matr );
inc(Bit_tek, Sdvig_Strok)
end;
Rang := Gauss(Matrix,Max_razm_Byte,Razm_matr);
if (Rang <= Razm_nul) and (ind_osh = btOk) then
begin { éδó«ñ αѺπ½∞ΓáΓ«ó }
Writeln(ff,'îáΓα¿µá αá¡úá ',Rang,' ¡áτ¿¡áÑΓß∩ ß í¿Γá ', Bit_nach);
{Éáºí«α »«½πτÑ¡¡«⌐ ¼áΓα¿µδ (ñ½∩ »ÑτáΓ¿)}
Stup := 0; Diag := 0;
Stroka := 1; Stolb := 0;
while Stolb < Razm_matr do begin {µ¿¬½ »« ßΓ᫬á¼}
if RBit(@Matrix^[Stroka,1],Stolb) = 0
then begin
Writeln(ff,Stup:6,Diag:8,Stroka:8);
Stup := 0; Diag := 0;
while (Stolb < Razm_matr) and
(RBit(@Matrix^[Stroka,1],Stolb) = 0) do
begin {µ¿¬½ »« ßΓ«½íµá¼}
inc(Stup);
Write(ff,STUP:2,' ');
Bybor(Matrix,@BitMas, Stolb, Max_Razm_Bit, Stroka);
for j := 1 to Stroka do
if (j mod 100) = 0 then begin
write(ff,BitMas[j]); Writeln(ff,''); write(ff,' *');
end
else write(ff,BitMas[j]);
inc(Stolb); Writeln(ff,'');
end; {µ¿¬½á »« ßΓ«½íµá¼}
end;
inc(Diag); inc(Stolb); inc(Stroka);
end; { µ¿¬½á »« ßΓα«¬á¼ }
end;
inc(Bit_nach,Sdvig_Matr);
until (ind_osh <> btOk);
Writeln(ff,'Äíαáí«Γá¡« ', Kol_iter, ' ¼áΓα¿µ');
Dispose(Xod_vyp,Done);
is_file^.CloseBitFile;
Dispose(is_file,Done);
FreeMem(Matrix, (Max_razm_Byte*Max_Razm_Bit));
Close(ff);
DeskTop^.GetExtent(R);
P := Application^.ValidView(New(PEditWindow,
Init(R, im_prot, wnNoNumber)));
DeskTop^.Insert(P);
ClipWindow := PEditWindow(P);
end;
begin
T.init;
T.Run;
T.Done;
end.