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:
戻る