Author Topic: Ficedula: S&R  (Read 3921 times)

RPGillespie

  • *
  • Posts: 427
    • View Profile
    • http://www.geocities.com/rpgillespie6
Ficedula: S&R
« on: 2005-06-27 23:16:23 »
Hey, fice, If you are still here, I was wondering if you could help me out. I'm trying to fix your search and replace tool on "cosmo", your text editor, but I'm not really sure what the prob is. The actual code that is causing S&R to malfunction is in cosmosearch.pas right? well this is the code for it: I can't really tell why it gets stuck at initializing (BTW I fixed your spelling error)... anyways, can anyone help?

Code: [Select]
unit cosmosearch;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ComCtrls, Buttons, FF7Edit, LGPStruct, DebugLog,
  BaseUtil, PluginTypes, CosmoUtil, FF7Types;

type
  TfrmSearchReplace = class(TForm)
    radSearchIn: TRadioGroup;
    GroupBox1: TGroupBox;
    Label1: TLabel;
    edtSearch: TEdit;
    Label2: TLabel;
    edtReplace: TEdit;
    btnAdd: TButton;
    btnRemove: TButton;
    lstItems: TListView;
    btnScan: TBitBtn;
    btnClose: TBitBtn;
    ProgAll: TProgressBar;
    lblMsg: TLabel;
    chkCase: TCheckBox;
    GroupBox2: TGroupBox;
    edtMask: TEdit;
    chkConfirm: TCheckBox;
    btnMask: TButton;
    procedure btnRemoveClick(Sender: TObject);
    procedure btnAddClick(Sender: TObject);
    procedure btnScanClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure btnMaskClick(Sender: TObject);
  private
    { Private declarations }
    Exclusions:       TStringList;
    function ProcessLevel(Lvl:TFF7Level):Boolean;
  public
    { Public declarations }
    CurFile:        String;
    Data:           TCosmoPlugin;
  end;

var
  frmSearchReplace: TfrmSearchReplace;

implementation

{$R *.DFM}
{$R EXCLUSIONS.RES}

Uses TxtEdt;

procedure TfrmSearchReplace.btnRemoveClick(Sender: TObject);
begin
If lstItems.Selected <> nil then
  lstItems.Selected.Delete;
end;

procedure TfrmSearchReplace.btnAddClick(Sender: TObject);
begin
If (edtReplace.Text<>'') and (edtSearch.Text<>'') then
  With lstItems.Items.Add do begin
    Caption := edtSearch.Text;
    Subitems.Add(edtReplace.Text);
  end;
end;

function TfrmSearchReplace.ProcessLevel(Lvl:TFF7Level):Boolean;
var
I,J,K:    Integer;
Item:     TFF7TextItem;
S,S2:     String;
Conf:     Boolean;
begin
Result := False;
Conf := chkConfirm.Checked;
For I := 0 to Lvl.NumTextItems-1 do begin
  Item := Lvl.TextItems[I];
  If radSearchIn.ItemIndex <> 1 then begin //search in text
    For J := 0 to lstItems.Items.Count-1 do begin
      If chkCase.Checked then begin
        S := Item.Text; S2 := lstItems.Items[J].Caption;
      end else begin
        S := Uppercase(Item.Text); S2 := Uppercase(lstItems.Items[J].Caption);
      end;
      K := Pos(S2,S);
      If K<>0 then
        If (Not Conf) or (MessageDlg('In text:'#13#13+Item.Name+#13+Item.Text+#13#13+' change '+S2+' to '+lstItems.Items[J].Subitems[0]+'?',mtConfirmation,[mbYes,mbNo],0)=mrYes) then
          While K<>0 do begin
            Item.Text := Copy(Item.Text,1,K-1) + lstItems.Items[J].Subitems[0] + Copy(Item.Text,K+Length(S2),Length(S));
            Result := True;
            If chkCase.Checked then S := Item.Text else S := Uppercase(Item.Text);
            K := Pos(S2,S);
          end;
    end;
  end;
  If radSearchIn.ItemIndex <> 0 then begin //search in name
    For J := 0 to lstItems.Items.Count-1 do begin
      If chkCase.Checked then begin
        S := Item.Name; S2 := lstItems.Items[J].Caption;
      end else begin
        S := Uppercase(Item.Name); S2 := Uppercase(lstItems.Items[J].Caption);
      end;
      K := Pos(S2,S);
      If K<>0 then
        If (Not Conf) or (MessageDlg('In text:'#13+Item.Name+#13+Item.Text+#13+' change '+S2+' to '+lstItems.Items[J].Subitems[0]+'?',mtConfirmation,[mbYes,mbNo],0)=mrYes) then
          While K<>0 do begin
            Item.Name := Copy(Item.Name,1,K-1) + lstItems.Items[J].Subitems[0] + Copy(Item.Name,K+Length(S2),Length(S));
            Result := True;
            If chkCase.Checked then S := Item.Name else S := Uppercase(Item.Name);
            K := Pos(S2,S);
          end;
    end;
  end;
  Lvl.TextItems[I] := Item;
end;
end;

procedure TfrmSearchReplace.btnScanClick(Sender: TObject);
var
RawLGP:       TRawLGPFile;
SR:           TSearchRec;
Tbl:          TLGP_TableEntry;
J,MS,Sz,I,Cnt,Scan,Empty:     Integer;
Mem:          TMemoryStream;
Lvl:          TFF7Level;
Details:      TStringList;
Skip:         Boolean;
begin
If GetFileRec(CurFile,SR) then Sz := SR.Size else Sz := 0;
If edtMask.Text='' then begin
  ShowMessage('You must enter a file mask. Try ''*'' for all files.');
  Exit;
end;
If lstItems.Items.Count=0 then begin
  ShowMessage('You must first add at least one search/replace pair to the list.');
  Exit;
end;
MS := GetTickCount;
lblMsg.Caption := 'Initializing...';
lblMsg.Refresh;
frmTextView.ClearList(True);
RawLGP := TRawLGPFile.CreateFromFile(CurFile);
ProgAll.Max := RawLGP.NumEntries;
ProgAll.Position := 0; Cnt := 0; Scan := 0; Empty := 0;
//Callback := Updater;
Mem := TMemoryStream.Create;
Lvl := TFF7Level.Create;
Details := TStringList.Create;
Data.Log('Starting search/replace...');
For I := 0 to RawLGP.NumEntries-1 do begin
  ProgAll.Position := I;
  Tbl := RawLGP.TableEntry[I];
  lblMsg.Caption := Tbl.Filename;
  lblMsg.Refresh;
  If Not MatchWildcard(edtMask.Text,Tbl.Filename) then Continue;
  Skip := False;
  For J := 0 to Exclusions.Count-1 do
    If (Exclusions[J]<>'') and MatchWildcard(Uppercase(Exclusions[J]),Uppercase(Tbl.Filename)) then Skip := True;
  If Skip then Continue;
  Inc(Scan);
  Mem.Clear;
  RawLGP.Extract(I,Mem);
  Lvl.LoadFromStream(Mem);
  If Lvl.NumTextItems = 0 then Inc(Empty);
  If ProcessLevel(Lvl) then begin
    Data.Log('File '+Tbl.Filename+' changed - updating LGP');
    Inc(Cnt);
    Lvl.MidiIndex := $FF; //don't change midi
    lblMsg.Caption := Tbl.Filename+' - compressing';
    lblMsg.Refresh;
    Mem.Clear;
    Lvl.SaveToStream(Mem);
    RawLGP.UpdateFile(I,Mem);
    Details.Add(Tbl.Filename+' - edited and updated');
  end else
    If Lvl.NumTextItems=0 then Details.Add(Tbl.Filename+' - error opening text')
      else Details.Add(Tbl.Filename+' - not changed');
end;
ProgAll.Position := ProgAll.Max;
Data.Log('Search/replace done');
Lvl.Free;
Mem.Free;
MS := GetTickCount - MS;
ShowMessage('Search/Replace is complete.'#13+
            Format('Took %d:%.2d to process files',[ (MS div 60000), (MS div 1000) mod 60 ] )+#13+
            'Files in archive: '+IntToStr(RawLGP.NumEntries)+#13+
            'Files actually examined: '+IntToStr(Scan)+#13+
            'Files successfully opened: '+IntToStr(Scan-Empty)+#13+
            'Files actually edited/changed: '+IntToStr(Cnt));
RawLGP.Free;
Data.Log(Details.Text);
Details.Free;
If Sz <> 0 then
  If GetFileRec(CurFile,SR) then
    If SR.Size > (Sz * 11) div 10 then
      If MessageDlg('Archive has increased noticeably in size. Do you wish to pack the archive now?',mtConfirmation,[mbYes,mbNo],0)=mrYes then
        LGP_Pack(CurFile);

end;

procedure TfrmSearchReplace.FormCreate(Sender: TObject);
begin
Exclusions := TStringList.Create;
end;

procedure TfrmSearchReplace.FormDestroy(Sender: TObject);
begin
Exclusions.Free;
end;

procedure TfrmSearchReplace.FormShow(Sender: TObject);
var
Strm:     TStream;
begin
Strm := Data.InputStream('Search_Exclusions');
Exclusions.LoadFromStream(Strm);
Data.Log('Search/Replace tool: '+IntToStr(Exclusions.Count)+' exclusions loaded');
Strm.Free;
end;

procedure TfrmSearchReplace.btnMaskClick(Sender: TObject);
begin
ShowMessage('This lets you specify which files to scan. Wildcard expressions (* and ?) are allowed.'#13+
            'For example, "a*" means all files beginning with a, "?????" is all files with 5 letters in the name.'#13+
            'In addition, the following files have been excluded automatically:'#13#13+
            Exclusions.Text);
end;

end.

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Ficedula: S&R
« Reply #1 on: 2005-06-28 12:34:22 »
What is S&R ? And by the way try harder, just try and you can find it, its your job now.

L. Spiro

  • *
  • Posts: 797
    • View Profile
    • http://www.memoryhacking.com/index.php
Ficedula: S&R
« Reply #2 on: 2005-06-28 12:40:40 »
“S&R” = Search & Replace.


L. Spiro

ficedula

  • *
  • Posts: 2178
    • View Profile
    • http://www.ficedula.co.uk
Ficedula: S&R
« Reply #3 on: 2005-06-28 16:55:11 »
I have no idea what the cause of the problem is because I don't know what problem you're having. But I'd firstly doubt it's in the visual code for the form you've posted; secondly, my spelling was correct, at least if you write English the way the English do... :P

RPGillespie

  • *
  • Posts: 427
    • View Profile
    • http://www.geocities.com/rpgillespie6
Ficedula: S&R
« Reply #4 on: 2005-06-29 00:05:07 »
The problem I'm having is that when I try to search and replace damn with darn, It just sits there saying "initialising" forever (well, at least for the 15 minutes I had the patience for)  Anyways, MS Word says that initializing is correct so maybe England is different? anyways, That is the code for your S&R tool, correct?

--RPGillespie

James Pond

  • *
  • Posts: 880
  • Forums Grumpy Bastard....At The Best Of Times.
    • View Profile
Ficedula: S&R
« Reply #5 on: 2005-06-29 08:22:16 »
Yeah, quite a few of our words are slightly different to you Americans...

mirex

  • *
  • Posts: 1645
    • View Profile
    • http://mirex.mypage.sk
Ficedula: S&R
« Reply #6 on: 2005-06-29 08:35:10 »
RPGillespie: heh hehe why are you trying to fix the english language syntax in the code instead of fixing the code ? I don't think that it is the reason for program not to work ;)

Try researching, debugging step by step and you will find out what is the problem. And by that you will learn programming.

RPGillespie

  • *
  • Posts: 427
    • View Profile
    • http://www.geocities.com/rpgillespie6
Ficedula: S&R
« Reply #7 on: 2005-06-30 04:00:31 »
Heh, heh, I know, but I really don't know where to begin so I just changed words so the spelling was American-correct. Ya, right now I'm getting used to fice's different functions and such so I can try and locate where the prob is...  :-?

RPGillespie