rfc10.lzh Delphiソース(delphi5)
program rfc; uses Forms, rfcu in 'rfcu.pas' {Form1}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end.
unit rfcu;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; OpenDialog1: TOpenDialog; procedure FormCreate(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); var flname0,flname1 : string; tofld,inidir,tofile : string; m,m0,m1 : TMemoryStream; lstln,lstno,last : word; keta0,iro0,retu0,lstln0,md0,lstno0 : word; keta1,iro1,retu1,lstln1,md1,lstno1 : word; stx,stx0,stx1 : byte; ln,ln0,ln1: word; afg0,afg1 : array[0..899]of char; sfg0,sfg1 : string; m0size,m1size,mps,m0ps,m1ps : longint;
begin form1.top := -100; form1.Left := -150; tofld := extractfilepath(application.exename); inidir := tofld + 'myfilex\'; tofile := tofld + 'myfilex\temp.myx'; opendialog1.initialdir := inidir; try m :=TmemoryStream.create; m0:=tmemorystream.create; m1:=TMemoryStream.Create; if opendialog1.execute then begin //最初のファイル読出 flname0 := opendialog1.FileName; m0.loadfromfile(flname0); m0.seek(0,0);m0.read(keta0,2);m0.read(iro0,2); //各設定読出し m0.read(retu0,2);m0.read(lstln0,2); m0.seek(22,1);m0.read(md0,2); m0.seek(36,1);m0.read(lstno0,2); m0.seek(76,1);m0.read(stx0,1);
ln := keta0 +110; ln0 := keta0 + 109;
while m0.position<m0.size do begin if stx0=2 then begin //F行を探す m0.seek(1,1);m0.read(afg0,ln0); sfg0 := trim(afg0); break; end; m0.seek(ln0,1);m0.read(stx0,1); if stx0<>2 then begin //F行が無い時setxバーを0にする stx0:=0; m0.seek(-1,1);m0.write(stx0,1); end; sfg0:=''; end;
stx0 := 0; m0.Seek(-ln,2); //最終行よりデータ行を捜す while stx0=0 do begin m0.read(stx0,1);m0.seek(-(ln+1),1); end; m0.seek(ln,1);m0.seek(ln,1); m0.savetofile(tofile); // showmessage(inttostr(m0.position));
lstln := lstln0; while lstln<32000 do begin if opendialog1.execute then begin //2番目以降のファイル読出し flname1 := opendialog1.FileName; m1.loadfromfile(flname1); m1size := m1.size; m1.seek(0,0);m1.read(keta1,2); if keta0<>keta1 then begin showmessage('ページサイズが違います'+#10#13+' 結合できません。'); continue; end; m1.read(iro1,2);m1.read(retu1,2);m1.read(lstln1,2); last := lstln + lstln1; if last>32000 then begin showmessage('結合行数が32000行を越えます'+#10#13+' 結合できません。'); continue; end; m1.seek(22,1);m1.read(md1,2); m1.seek(36,1);m1.read(lstno1,2); m1.seek(76,1);m1.read(stx1,1); ln1 := keta1 + 109; sfg1:=''; while stx1<4 do begin //F行を捜す if stx1=2 then begin m1.seek(1,1);m1.read(afg1,ln1-1); sfg1 := trim(afg1);m1.read(stx1,1); end else begin m1.seek(ln1,1);m1.read(stx1,1); end; if m1.position>=m1.size then break; end; mps:=m1.position; if sfg1='' then begin m1ps:=m1.size - ln1 - 1;stx:=0; while m1ps>146 do begin m1.seek(m1ps,0);m1.write(stx,1); dec(m1ps,ln1+1); end; end; m1ps:=mps;
if sfg0<>'' then begin //元ファイルが表モードの時は { if sfg0<>sfg1 then begin showmessage('F行が違います。'+#10#13+' 結合出来ません。'); continue; end; } if sfg1<>'' then begin //元が表で次も表 m1.Seek(-1,1);m1ps := m1.position; //showmessage(inttostr(m0ps)); // データ行以下のクリアを考える m0ps:=m0.position;m.SetSize(m0ps);m.seek(0,0);m0.seek(0,0); m.copyfrom(m0,m0ps); m0.LoadFromStream(m); m0.seek(m0ps,0); m0.copyfrom(m1, m1size - m1ps );
stx0 := 0; m0.Seek(-ln,2); while stx0=0 do begin m0.read(stx0,1);m0.seek(-(ln+1),1); end; m0.seek(ln,1);m0.seek(ln,1); //元表最終データポジション end else begin m0.seek(0,2); m1.seek(146+ln,0); m0.copyfrom(m1, m1.size-m1.position); end; end else begin //元ファイルがEDモードの時は m0.seek(0,2); m1.seek(146+ln,0); //書き込みはタイトル行の次から m0.copyfrom(m1, m1.size-m1.position);
end; m0size := m0.size; if ln<>0 then lstln := (m0size - 146) div ln;lstno := lstln + 10; m0.seek(6,0);m0.write(lstln,2);m0.Seek(60,1);m0.write(lstno,2);
m0.seek(146,0);m0.read(stx0,1); while m0.position<m0.size do begin if stx0=2 then begin //F行を探す m0.seek(1,1);m0.read(afg0,ln0); sfg0 := trim(afg0); break; end; m0.seek(ln0,1);m0.read(stx0,1); if stx0<>2 then begin //F行が無い時setxバーを0にする stx0:=0; m0.seek(-1,1);m0.write(stx0,1); end; sfg0:=''; end;
stx0 := 0; m0.Seek(-ln,2); //最終行よりデータ行を捜す while stx0=0 do begin m0.read(stx0,1);m0.seek(-(ln+1),1); end; m0.seek(ln,1);m0.seek(ln,1);
m0.savetofile(tofile); //ファイルに書き込み
end else exit; end; end;
finally m1.free;m0.free;m.free; end;
end;
procedure TForm1.Timer1Timer(Sender: TObject); begin close; end;
end:
戻る