特急!超级难题!自当重谢!

yxf 2000-08-11 08:05:00
工程文件:
program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
窗体文件:
object Form1: TForm1
Left = 192
Top = 103
Width = 547
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 8
Top = 272
Width = 28
Height = 13
Caption = 'Name'
end
object label234234: TLabel
Left = 8
Top = 296
Width = 47
Height = 13
Caption = 'IsUsePlus'
end
object Label2: TLabel
Left = 96
Top = 296
Width = 48
Height = 13
Caption = 'PlusName'
end
object Label3: TLabel
Left = 8
Top = 320
Width = 51
Height = 13
Caption = 'JMNumber'
end
object Button1: TButton
Left = 8
Top = 8
Width = 297
Height = 25
Caption = 'procedure CreateProjectFile(OperaFile:string);'
TabOrder = 0
OnClick = Button1Click
end
object Button2: TButton
Left = 8
Top = 40
Width = 297
Height = 25
Caption = 'procedure CreateProjectList(OperaFile,OutputFile:String);'
TabOrder = 1
OnClick = Button2Click
end
object Button3: TButton
Left = 8
Top = 72
Width = 297
Height = 25
Caption = 'function GetVersionInfo(OperaFile:String):string;'
TabOrder = 2
OnClick = Button3Click
end
object Button4: TButton
Left = 8
Top = 104
Width = 297
Height = 25
Caption = 'procedure AppendProjectItem(OperaFile,MapDir:string);'
TabOrder = 3
OnClick = Button4Click
end
object Button5: TButton
Left = 8
Top = 136
Width = 297
Height = 25
Caption = 'Button5'
TabOrder = 4
end
object Button6: TButton
Left = 8
Top = 168
Width = 297
Height = 25
Caption = 'Button6'
TabOrder = 5
end
object Button7: TButton
Left = 8
Top = 200
Width = 297
Height = 25
Caption = 'Button7'
TabOrder = 6
end
object Button8: TButton
Left = 8
Top = 232
Width = 297
Height = 25
Caption = 'Button8'
TabOrder = 7
end
object GroupBox1: TGroupBox
Left = 312
Top = 8
Width = 105
Height = 201
Caption = 'SourceFiles'
TabOrder = 8
object SourceFiles: TMemo
Left = 8
Top = 16
Width = 89
Height = 177
Lines.Strings = (
'SourceFiles')
TabOrder = 0
end
end
object GroupBox2: TGroupBox
Left = 424
Top = 8
Width = 105
Height = 201
Caption = 'Endfiles'
TabOrder = 9
object Endfiles: TMemo
Left = 8
Top = 16
Width = 89
Height = 177
Lines.Strings = (
'Endfiles')
TabOrder = 0
end
end
object nameedit: TEdit
Left = 40
Top = 264
Width = 265
Height = 21
TabOrder = 10
Text = 'nameedit'
end
object GroupBox3: TGroupBox
Left = 312
Top = 216
Width = 217
Height = 129
Caption = 'passwords'
TabOrder = 11
object passwords: TMemo
Left = 8
Top = 16
Width = 201
Height = 105
Lines.Strings = (
'passwords')
TabOrder = 0
end
end
object ComboBox1: TComboBox
Left = 56
Top = 288
Width = 33
Height = 21
Style = csDropDownList
ItemHeight = 13
TabOrder = 12
Items.Strings = (
'T'
'F')
end
object Edit1: TEdit
Left = 144
Top = 288
Width = 161
Height = 21
TabOrder = 13
Text = 'PLusnameedit'
end
object JMNumberedit: TSpinEdit
Left = 64
Top = 312
Width = 241
Height = 22
MaxValue = 0
MinValue = 0
TabOrder = 14
Value = 0
end
end
单元文件:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, inifiles,
StdCtrls, Spin;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
GroupBox1: TGroupBox;
SourceFiles: TMemo;
GroupBox2: TGroupBox;
Endfiles: TMemo;
nameedit: TEdit;
Label1: TLabel;
GroupBox3: TGroupBox;
passwords: TMemo;
label234234: TLabel;
ComboBox1: TComboBox;
Label2: TLabel;
Edit1: TEdit;
Label3: TLabel;
JMNumberedit: TSpinEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

{OK}function GetVersionInfo(OperaFile:String):string;
{OK}procedure CreateProjectList(OperaFile,OutputFile:String);
procedure LoadProjectItem(OperaFile,MapDir:String;Index:integer);
procedure SaveProjectItem(OperaFile,MapDir:String;SaveIndex:Integer);
procedure DeleteProjectItem(OperaFile:String;RemoveIndex:Integer);
{OK}procedure AppendProjectItem(OperaFile,MapDir:string);
{OK}procedure CreateProjectFile(OperaFile:string);
procedure ProjectItemMoveUp(OperaFile,MapDIR:String;MoveUpIndex:Integer);
procedure ProjectItemMoveDown(OperaFile,MapDIR:String;MoveDownIndex:Integer);

var
Form1: TForm1;
mdir,opera:string;

implementation

{$R *.DFM}

{格式:

SizeofVersionInfo(Integer) VersionInfo(String[100])
Integer:0
SizeofName(Integer) Name(String[255])
IsUsePlus(Boolean) SizeofPlusName(Integer) PlusName(String[255])
JMNumber(Integer)
SizeofSourceFiles.Strings[0](integer) SourceFiles.Strings(string) SizeofEndFiles.Strings[0](integer) EndFiles.Strings[0] ... SizeofSourceFiles.Strings[Count-1](integer) SourceFiles.Strings(string) SizeofEndFiles.Strings[Count-1](integer) EndFiles.Strings[Count-1]
Integer:-1 //end of the file lists
sizeofPassword.Strings[0](integer) Password.Strings[0](string) ... sizeofPassword.Strings[Count-1](integer) Password.Strings[Count-1](string)
Integer:-2//end of the password
Integer:-3//end of the ProjectItem

Integer:0
SizeofName(Integer) Name(String[255])
IsUsePlus(Boolean) SizeofPlusName(Integer) PlusName(String[255])
JMNumber(Integer)
SizeofSourceFiles.Strings[0](integer) SourceFiles.Strings(string) SizeofEndFiles.Strings[0](integer) EndFiles.Strings[0] ... SizeofSourceFiles.Strings[Count-1](integer) SourceFiles.Strings(string) SizeofEndFiles.Strings[Count-1](integer) EndFiles.Strings[Count-1]
Integer:-1 //end of the file lists
sizeofPassword.Strings[0](integer) Password.Strings[0](string) ... sizeofPassword.Strings[Count-1](integer) Password.Strings[Count-1](string)
Integer:-2//end of the password
Integer:-3//end of the ProjectItem
...

Integer:-4//end of the Project
Name:String; //名字
SourceFiles,EndFiles,Password:TStrings;//文件列表、密码
IsUsePlus:Boolean;//是否使用插件
PlusName:String;//插件名
JMNumber:Integer;//加密次数
VersionInfo:String;//文件超级锁版本 此版本为 'SuperDock 2000'

}





function GetVersionInfo(OperaFile:String):string;
//获取文件超级锁版本信息
var opf:TFileStream;
vsize:integer;
size,ctlint:integer;
s:string[255];
vstr:string[100];
b:boolean;
begin
opf:=TFileStream.Create(OperaFile,fmOpenRead);
opf.Read(vsize,sizeof(integer));
opf.Read(vstr,vsize);
repeat
opf.Read(ctlint,sizeof(integer));
case ctlint of
0:begin
opf.Read(size,sizeof(integer));
opf.Read(s,size); //name
opf.Read(b,sizeof(boolean));
opf.Read(size,sizeof(integer));
opf.Read(s,size);
opf.Read(size,sizeof(integer));
repeat
opf.Read(size,sizeof(integer));
if size<>-1 then begin
opf.Read(s,size);
opf.Read(size,sizeof(integer));
opf.Read(s,size);
end;
until size=-1;
repeat
opf.Read(size,sizeof(integer));
if size<>-2 then opf.Read(s,size);
until size=-2;
opf.Read(size,sizeof(integer));
end;
-4:break;
end;
until ctlint=-4;
opf.Free;
GetVersionInfo:=vstr;
end;

procedure CreateProjectList(OperaFile,OutputFile:String);
//建立工程项列表
var opf:TFileStream;
optf:TextFile;
size,ctlint:integer;
ver:string[100];
s:string[255];
b:boolean;
begin
AssignFile(optf,OutputFile);
Rewrite(optf);
CloseFile(optf);
opf:=TFileStream.Create(OperaFile,fmOpenRead);
opf.Read(size,sizeof(integer));
opf.Read(ver,size);
repeat
opf.Read(ctlint,sizeof(integer));
case ctlint of
0:begin
opf.Read(size,sizeof(integer));
opf.Read(s,size); //name
AssignFile(optf,Outputfile);
Append(optf);
Writeln(optf,s); //write into list file
CloseFile(optf);
opf.Read(b,sizeof(boolean));
opf.Read(size,sizeof(integer));
opf.Read(s,size);
opf.Read(size,sizeof(integer));
repeat
opf.Read(size,sizeof(integer));
if size<>-1 then begin
opf.Read(s,size);
opf.Read(size,sizeof(integer));
opf.Read(s,size);
end;
until size=-1;
repeat
opf.Read(size,sizeof(integer));
if size<>-2 then opf.Read(s,size);
until size=-2;
opf.Read(size,sizeof(integer));
end;
-4:break;
end;
until ctlint=-4;
opf.Free;
end;

procedure LoadProjectItem(OperaFile,MapDir:String;Index:integer);
//最前一项Index=0
//最后一项Index=Count-1
//MapDir必须以“\”结尾
var opf:TFileStream;
Count,size:integer;
s:string[255];
v:string[100];
Item:Record
Name:String[255]; //名字
SourceFile,EndFile,Password:String[255];//文件列表、密码的其中一行
IsUsePlus:Boolean;//是否使用插件
PlusName:String[255];//插件名
JMNumber:Integer;//加密次数
end;
Files:Record
Info:TIniFile;//工程项基本信息文件
psdf,//密码文件
sff,//源文件列表文件
eff:TextFile;//目标文件列表文件
end;
FileNames:Record
Info,psdf,sff,eff:string;
end;
begin
//init
opf:=TFileStream.Create(OperaFile,fmOpenRead);
FileNames.Info:=MapDir+'pitem.dat';
FileNames.psdf:=MapDir+'Password.dat';
FileNames.sff:=MapDir+'isf.dat';
FileNames.eff:=MapDir+'ise.dat';
AssignFile(Files.psdf,FileNames.psdf);
AssignFile(Files.sff,FileNames.sff);
AssignFile(Files.eff,FileNames.eff);
Rewrite(Files.psdf);
Rewrite(Files.sff);
Rewrite(Files.eff);
Files.Info:=TIniFile.Create('pitem.dat');
Count:=0;
opf.Read(size,sizeof(Integer));
opf.Read(v,size);
//finished init
repeat
opf.Read(size,sizeof(Integer));
case size of
0: begin
opf.Read(size,sizeof(Integer));
opf.Read(Item.Name,size);
if Count=Index then Files.Info.WriteString('Standard','Name',Item.Name);//写入工程项名
opf.Read(Item.IsUsePlus,sizeof(Boolean));
if Count=Index then Files.Info.WriteBool('Standard','IsUsePlus',Item.IsUsePlus);//写入是否使用插件
opf.Read(size,sizeof(Integer));
opf.Read(Item.PlusName,size);
if Count=Index then Files.Info.WriteString('Standard','PlusName',Item.PlusName);//写入插件名字
opf.Read(Item.JMNumber,sizeof(integer));
if Count=Index then Files.Info.WriteInteger('Standard','JMNumber',Item.JMNumber);//写入加密次数
repeat//读写文件列表
opf.Read(size,sizeof(integer));
if size=-1 then break;
opf.Read(Item.SourceFile,size);
if Count=Index then Writeln(Files.sff,Item.SourceFile);
opf.Read(size,sizeof(integer));
opf.Read(Item.EndFile,size);
if Count=Index then writeln(Files.eff,Item.EndFile);
until size=-1;
repeat//读写密码
opf.Read(size,sizeof(integer));
if size=-2 then break;
opf.Read(Item.Password,size);
if Count=Index then writeln(Files.psdf,Item.Password);
until size=-2;
opf.Read(size,sizeof(Integer));
if size=-3 then Count:=Count+1;
end;
-4:Break;
end;
until Count>Index;
//uninit
CloseFile(Files.psdf);
CloseFile(Files.sff);
CloseFile(Files.eff);
Files.Info.Free;
opf.Free;
end;

procedure SaveProjectItem(OperaFile,MapDir:String;SaveIndex:Integer);
var opf,bkf:TFileStream;
Count,size:integer;
s:string[255];
v:string[100];
Item:Record
Name:String[255]; //名字
SourceFile,EndFile,Password:String[255];//文件列表、密码的其中一行
IsUsePlus:Boolean;//是否使用插件
PlusName:String[255];//插件名
JMNumber:Integer;//加密次数
end;
Files:Record
Info:TIniFile;//工程项基本信息文件
psdf,//密码文件
sff,//源文件列表文件
eff:TextFile;//目标文件列表文件
end;
FileNames:Record
Info,psdf,sff,eff,bkname:string;
end;
begin
opf:=TFileStream.Create(OperaFile,fmOpenRead);
FileNames.bkname:=OperaFile+'.tmp';
if FileExists(FileNames.bkname) then DeleteFile(FileNames.bkname);
bkf:=TFileStream.Create(OperaFile,fmCreate);
Count:=0;
FileNames.Info:=MapDir+'pitem.dat';
FileNames.psdf:=MapDir+'Password.dat';
FileNames.sff:=MapDir+'isf.dat';
FileNames.eff:=MapDir+'ise.dat';
Files.Info:=TIniFile.Create(FileNames.Info);
AssignFile(Files.psdf,FileNames.psdf);
AssignFile(Files.sff,FileNames.sff);
AssignFile(Files.eff,FileNames.eff);
//Read&Write Version Info
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(v,size);
bkf.Write(v,size);
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
case size of
0: begin
if Count=SaveIndex then begin
Item.Name:=Files.Info.ReadString('Standard','Name','');
Item.IsUsePlus:=Files.Info.ReadBool('Standard','IsUsePlus',False);
Item.PlusName:=Files.Info.ReadString('Standard','PlusName','');
Item.JMNumber:=Files.Info.ReadInteger('Standard','JMNumber',0);
size:=sizeof(Item.name);
bkf.Write(size,sizeof(integer));
bkf.Write(Item.Name,sizeof(Item.Name));
size:=sizeof(item.isuseplus);
bkf.Write(item.isuseplus,size);
size:=sizeof(item.plusname);
bkf.Write(size,sizeof(integer));
bkf.Write(item.plusname,size);
bkf.Write(item.jmnumber,sizeof(integer));
while not(eof(Files.sff)) do begin
readln(Files.sff,Item.SourceFile);
readln(Files.eff,Item.EndFile);
size:=sizeof(Item.SourceFile);
bkf.Write(size,sizeof(integer));
bkf.Write(Item.SourceFile,size);
size:=sizeof(Item.EndFile);
bkf.Write(size,sizeof(integer));
bkf.Write(Item.Endfile,size);
end;
size:=-1;
bkf.Write(size,sizeof(Integer));
//Finished write file list
while not (eof(Files.psdf)) do begin
readln(Files.psdf,Item.Password);
size:=sizeof(Item.Password);
bkf.Write(size,sizeof(Integer));
bkf.Write(Item.password,size);
end;
//finish write password list
size:=-2;
bkf.Write(size,sizeof(integer));
size:=-3;
bkf.Write(size,sizeof(integer));
//读掉没用的东西
opf.Read(size,sizeof(Integer));
opf.Read(s,size);
opf.Read(Item.IsUsePlus,sizeof(Boolean));
opf.Read(size,sizeof(Integer));
opf.Read(s,size);
opf.Read(size,sizeof(Integer));
repeat
opf.Read(size,sizeof(Integer));
if size=-1 then break;
opf.Read(s,size);
opf.Read(size,sizeof(Integer));
opf.Read(s,size);
until size=-1;
repeat
opf.Read(size,sizeof(Integer));
if size=-2 then break;
opf.Read(s,size);
until size=-2;
opf.Read(size,sizeof(Integer));
end;
if Count<>SaveIndex then begin
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
opf.read(Item.IsUsePlus,sizeof(boolean));
opf.Write(Item.isuseplus,sizeof(boolean));
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
if size=-1 then break;
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
until size=-1;
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
if size=-2 then break;
opf.Read(s,size);
bkf.Write(s,size);
until size=-2;
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
Count:=Count+1;
end;
end;
-4:Break;
end;
until size=-4;
CloseFile(Files.psdf);
CloseFile(Files.sff);
CloseFile(Files.eff);
Files.Info.Free;
opf.Free;
bkf.Free;
DeleteFile(OperaFile);
CopyFile(PChar(FileNames.bkname),PChar(OperaFile),False);
DeleteFile(PChar(FileNames.bkname));
end;

procedure DeleteProjectItem(OperaFile:String;RemoveIndex:Integer);
var opf,bkf:TFileStream;
Count,size:integer;
s:string[255];
v:string[100];
Item:Record
IsUsePlus:Boolean;//是否使用插件
end;
FileNames:Record
bkname:string;
end;
begin
opf:=TFileStream.Create(OperaFile,fmOpenRead);
FileNames.bkname:=OperaFile+'.tmp';
if FileExists(FileNames.bkname) then DeleteFile(FileNames.bkname);
bkf:=TFileStream.Create(OperaFile,fmCreate);
Count:=0;
//Read&Write Version Info
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(v,size);
bkf.Write(v,size);
repeat
opf.Read(size,sizeof(Integer));
case size of
0: begin
if Count=RemoveIndex then begin
//读掉没用的东西
opf.Read(size,sizeof(Integer));
opf.Read(s,size);
opf.Read(Item.IsUsePlus,sizeof(Boolean));
opf.Read(size,sizeof(Integer));
opf.Read(s,size);
opf.Read(size,sizeof(Integer));
repeat
opf.Read(size,sizeof(Integer));
if size=-1 then break;
opf.Read(s,size);
opf.Read(size,sizeof(Integer));
opf.Read(s,size);
until size=-1;
repeat
opf.Read(size,sizeof(Integer));
if size=-2 then break;
opf.Read(s,size);
until size=-2;
opf.Read(size,sizeof(Integer));
end;
if Count<>RemoveIndex then begin
bkf.Write(size,sizeof(Integer));
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
opf.read(Item.IsUsePlus,sizeof(boolean));
opf.Write(Item.isuseplus,sizeof(boolean));
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
if size=-1 then break;
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
until size=-1;
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
if size=-2 then break;
opf.Read(s,size);
bkf.Write(s,size);
until size=-2;
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
Count:=Count+1;
end;
end;
-4:Break;
end;
until size=-4;
opf.Free;
bkf.Free;
DeleteFile(OperaFile);
CopyFile(PChar(FileNames.bkname),PChar(OperaFile),False);
DeleteFile(PChar(FileNames.bkname));
end;

procedure AppendProjectItem(OperaFile,MapDir:string);
var opf,bkf:TFileStream;
size:integer;
s:string[255];
v:string[100];
Item:Record
Name:String[255]; //名字
SourceFile,EndFile,Password:String[255];//文件列表、密码的其中一行
IsUsePlus:Boolean;//是否使用插件
PlusName:String[255];//插件名
JMNumber:Integer;//加密次数
end;
Files:Record
Info:TIniFile;//工程项基本信息文件
psdf,//密码文件
sff,//源文件列表文件
eff:TextFile;//目标文件列表文件
end;
FileNames:Record
Info,psdf,sff,eff,bkname:string;
end;
begin
opf:=TFileStream.Create(OperaFile,fmOpenRead);
FileNames.bkname:=OperaFile+'.tmp';
bkf:=TFileStream.Create(FileNames.bkname,fmCreate);
opf.Read(size,sizeof(Integer)); { Read }
opf.Read(v,size); { and }
bkf.Write(size,sizeof(Integer)); { Write }
bkf.Write(v,size); { Version Info }
FileNames.Info:=MapDir+'pitem.dat';
FileNames.psdf:=MapDir+'Password.dat';
FileNames.sff:=MapDir+'isf.dat';
FileNames.eff:=MapDir+'ise.dat';
Files.Info:=TIniFile.Create(FileNames.Info);
repeat
opf.Read(size,sizeof(Integer));//Control
if size=0 then begin
bkf.Write(size,sizeof(Integer));
opf.Read(size,sizeof(IntegeR));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(item.IsUsePlus,sizeof(Boolean));
bkf.Write(item.isuseplus,sizeof(Boolean));
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(size,sizeof(Integer)); {JMNumber}
bkf.Write(size,sizeof(Integer));{JMNumber}
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
if size=-1 then break;
opf.Read(s,size);
bkf.Write(s,size);
opf.Read(size,sizeof(integer));
bkf.Write(size,sizeof(Integer));
opf.Read(s,size);
bkf.Write(s,size);
until size=-1;
repeat
opf.Read(size,sizeof(Integer));
bkf.Write(size,sizeof(Integer));
if size=-2 then break;
opf.Read(s,size);
bkf.Write(size,sizeof(Integer));
until size=-2;
opf.Read(size,sizeof(IntegeR));
bkf.Write(size,sizeof(Integer));
end;
until size=-4;
//begin to append
AssignFile(Files.psdf,FileNames.psdf);
Reset(Files.psdf);
AssignFile(Files.sff,FileNames.sff);
Reset(Files.sff);
AssignFile(Files.eff,FileNames.eff);
Reset(Files.eff);
{收集信息}
Item.Name:=Files.Info.ReadString('Standard','Name','');
Item.IsUsePlus:=Files.Info.ReadBool('Standard','IsUsePlus',False);
Item.PlusName:=Files.Info.ReadString('Standard','PlusName','');
Item.JMNumber:=Files.Info.ReadInteger('Standard','JMNumber',0);
{信息收集完毕}
{写入信息}
size:=0;
bkf.Write(size,sizeof(Integer));
size:=sizeof(Item.Name);
bkf.Write(size,sizeof(size));
bkf.Write(Item.Name,size);
bkf.Write(Item.IsUsePlus,sizeof(Boolean));
size:=sizeof(Item.PlusName);
bkf.Write(size,sizeof(Integer));
bkf.Write(Item.PlusName,size);
bkf.Write(Item.JMNumber,sizeof(Integer));
{信息写入完毕}
{写入源文件/目标文件信息}
while not(eof(Files.sff)) do begin
Readln(Files.sff,Item.SourceFile);
Readln(Files.eff,Item.endFile);
size:=sizeof(Item.SourceFile);
bkf.Write(size,sizeof(Integer));
bkf.Write(Item.SourceFile,size);
size:=sizeof(Item.endfile);
bkf.Write(size,sizeof(Integer));
bkf.Write(Item.endFile,size);
end;
size:=-1;
bkf.Write(size,sizeof(Integer));
{Finished 写入源文件/目标文件信息}
{start to 写入密码}
while not(eof(Files.psdf)) do begin
readln(Files.psdf,Item.Password);
size:=sizeof(Item.Password);
bkf.Write(size,sizeof(Integer));
bkf.Write(Item.Password,size);
end;
size:=-2;
bkf.Write(size,sizeof(Integer));
{fihished 写入密码}
size:=-3;
bkf.Write(size,sizeof(Integer));
size:=-4;
bkf.Write(size,sizeof(Integer));
//finished append
CloseFile(Files.psdf);
CloseFile(Files.sff);
CloseFile(Files.eff);
Files.Info.Free;
opf.Free;
bkf.Free;
//记住:写入别的文件后记得要覆盖原来的文件!切记!切记!
CopyFile(PChar(FileNames.bkname),PChar(OperaFile),False);
end;

procedure CreateProjectFile(OperaFile:string);
var opf:TFileStream;
i:integer;
s:string[100];
begin
if FileExists(OperaFile) then DeleteFile(PChar(OperaFile));
opf:=TFileStream.Create(OperaFile,fmCreate);
s:='SuperDock 2000';
i:=sizeof(s);
opf.Write(i,sizeof(Integer));
opf.Write(s,i);
i:=-4;
opf.Write(i,sizeof(Integer));
opf.Free;
end;

procedure ProjectItemMoveUp(OperaFile,MapDIR:String;MoveUpIndex:Integer);
var i,Count:Integer;
L:TStrings;
begin
L:=TStrings.Create;
CreateProjectList(OperaFile,OperaFile+'_datalisttemp.tmp');
L.LoadFromFile(OperaFile+'_datalisttemp.tmp');
Count:=L.Count;
CreateProjectFile(OperaFile+'_datatemp.tmp');
if MoveUpIndex-2>=0 then for i:=0 to MoveUpIndex-2 do begin
LoadProjectItem(OperaFile,MapDir,i);
AppendProjectItem(OperaFile+'_datatemp.tmp',MapDir);
end;
LoadProjectItem(OperaFile,MapDir,MoveUpIndex);
AppendProjectItem(OperaFile+'_datatemp.tmp',MapDir);
LoadProjectItem(OperaFile,MapDir,MoveUpIndex-1);
AppendProjectItem(OperaFile+'_datatemp.tmp',MapDir);
if MoveUpIndex<Count-1 then for i:=MoveUpIndex+1 to Count-1 do begin
LoadProjectItem(OperaFile,MapDir,i);
AppendProjectItem(OperaFile+'_datatemp.tmp',MapDir);
end;
L.Free;
L.Destroy;
CopyFile(PChar(OperaFile+'_datatemp.tmp'),PChar(OperaFile),False);
end;

procedure ProjectItemMoveDown(OperaFile,MapDIR:String;MoveDownIndex:Integer);
begin
ProjectItemMoveUp(OperaFile,MapDIR,MoveDownIndex+1);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
unit1.CreateProjectFile(opera);{OK}
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
CreateProjectList(Opera,'list.txt');
end;

procedure TForm1.Button3Click(Sender: TObject);
var s:string;
begin
s:=GetVersionInfo(opera);
ShowMessage(s);
end;

procedure TForm1.Button4Click(Sender: TObject);
var ini:TIniFile;
bool:boolean;
begin
//Savedata
SourceFiles.Lines.SaveToFile(mdir+'isf.dat');
EndFiles.Lines.SaveToFile(mdir+'ise.dat');
passwords.Lines.SaveToFile(mdir+'password.dat');
ini:=TIniFile.Create(mdir+'pitem.dat');
ini.WriteString('Standard','Name',nameedit.Text);
bool:=ComboBox1.ItemIndex=0;
ini.WriteBool('Standard','IsUsePlus',bool);
ini.WriteInteger('Standard','JMNumber',jmnumberedit.Value);
ini.WriteString('Standard','PlusName',edit1.Text);
ini.Free;
AppendProjectItem(opera,mdir);
end;

initialization
mdir:=ExtractFilePath (Application.ExeName);
if mdir[length(mdir)]<>'\' then mdir:=mdir+'\';
opera:=mdir+'operafile.txt';
end.
问题:
procedure AppendProjectItem(OperaFile,MapDir:string);第三次就有问题了,像是错位。所以其它的也没法测试了。
这东西早上我就要了。好朋友,帮忙看看吧!超级感谢!
...全文
181 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxf 2000-08-12
  • 打赏
  • 举报
回复
谢谢dongdong 我的问题已经解决
continue 2000-08-12
  • 打赏
  • 举报
回复
这么长?我把它运行了一下,发现 AppendProjectItem 连用几次就死循环了。检查一下代码,

procedure AppendProjectItem(OperaFile,MapDir:string);
... ...
repeat
opf.Read(size,IntLength);
bkf.Write(size,IntLength);
if size=-2 then break;
opf.Read(s,size);
bkf.Write(size,IntLength);
until size=-2;
... ...

原来是忽略了 opf.position = opf.size,即己到文件尾了。opf.position不能再向前了,size 的值也不会有变化了。只需把 until size=-2; 改成 until (size=-2) or opf.position=opf.size; 即可。其它的循环也有同样的问题。

这只是错误的表象了,更深的BUG可能是文件内容方面的问题,因为没有仔细了解正确的文件结构,所以只能做个“外科代夫”。我想最好的解决之道是在你把 TStream 的帮助读过后用其它算法重写此程序。
dongdong 2000-08-11
  • 打赏
  • 举报
回复
兄弟,有什么问题请说出关键,写个几万行的代码,没有几个人愿意去看,去回答的,时间就是金钱,记住,尤其是在网上。
祝好运!
yxf 2000-08-11
  • 打赏
  • 举报
回复
更正:应该是12号早上

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧