zoukankan      html  css  js  c++  java
  • [Inno Setup] 字符串列表,当要处理一长串文件时很有用

    https://wiki.freepascal.org/TStringList-TStrings_Tutorial

    TStringList-TStrings Tutorial

    Deutsch (de) English (en) español (es) suomi (fi) français (fr) русский (ru)

    Contents

    TStringList

    The TStringList (or its parent TStrings) is much like a fancy dynamic array or Set of Strings (a set of strings is not possible in FPC). It will come in handy a lot when programming and I'm going to teach you basic TStringList usage!

    Simple example

    program StrList;
    {$mode objfpc}
    uses
     Classes, SysUtils;
    var
      Str: TStringList;
    begin
      Str := TStringList.Create; // This is needed when using this class(or most classes)
      Str.Add('Some String!');
      writeln('The stringlist now has ' + IntToStr(Str.Count) + ' string(s).');
      Readln;
      Str.Free; //Release the memory used by this stringlist instance
    end.

    This is a simple console program that will create and add one string to a stringlist. Now here's some things you should know:

    Create - Will create the string list for modifying. If you use Create, you have to later Free it and release the memory it takes. If not, you program will not crash, but it will not release all the memory it occupied: a memory leak.

    Count - This property is a counter for the number of strings in the List.

    Add - This method allows you to add one string to the stringlist. It is a function that will return the Index of the String. This is where the counter comes in handy.

    Delete - Will delete a string from the stringlist. Just know that you do not simply input the string, you have to input the index of the string. Like I said: it's like a fancy Dynamic Array.

    IndexOf - Will return the index of the string in the list. If it is not found it returns -1.

    Clear - Will clear the list.

    Expanded Example

    How about a more juicy example, eh?

    program StrList2;
    {$mode ObjFPC}
    uses
    Classes, SysUtils;
    
    var
      Str: TStringList;
      S: String;
      Counter: Integer;
    begin
      Str := TStringList.Create;
      Writeln('String List Test');
      repeat
        Writeln('Enter a string to add (type EXIT to stop adding strings)');
        Readln(S); 
        if (S = 'EXIT') then 
          Break; // exit the loop
        
        if (S <> '') then
        begin
          Counter := Str.Add(S);
          Writeln('String: ' + S + ' was Added!');
          Writeln('Index is: ' + IntToStr(Counter)); // The counter will always become the index of the last thing added
        end 
        else 
        begin
          Writeln('No data entered...');
        end;
      until (S = 'EXIT');
      writeln('Contents of the TStringList: '+ Str.CommaText);
      Str.Free; //release the memory again
    end.

    However, to avoid possible memory leaks you should always use a Try - Finally block where possible for this, so you get something like:

    var
      slist: TStringList;
    
    ...
    
    slist := TStringList.Create;
    try
      ...
      // do things with your stringlist  
      ...
    finally
      if Assigned(slist) then
        FreeAndNil(slist);
    end;
    // This works perfect, no double creation of stringlist... comments free to send to edgarrod71@gmail.com
    function theStringList: TStringList;
    var
     J: integer;
    begin
      result := TStringList.Create;
      for J:=0 to 10 do
        result.add(intToStr(J));
    end;
    
    procedure Caller;
    var
      SL: TStringList;
      K: integer;
    begin
      SL := theStringList;
      for K:=0 to pred(SL.Count) do
        writeln(SL[K]);
      if assigned(SL) then
        SL.Free;
    end;

    Conversion to and from delimited strings

    Code below will result in a stringlist, containing 4 elements ('1', '2', '3' and '4');

    procedure Sample;
    var
        MyStringList: TStringList=nil;
    begin
         MyStringList:= TStringList.create;
         MyStringList.Delimiter := ';';
         MyStringList.DelimitedText:='1;2;3;4';
         MyStringList.free;
    end;


    Respectively next code will assemble a stringlist into a delimited string ('1;2;3;4'):

    function Sample2 : string;
    var
        MyStringList: TStringList=nil;
    begin
         MyStringList:= TStringList.create;
         MyStringList.Delimiter := ';';
         MyStringList.Add('1');
         MyStringList.Add('2');
         MyStringList.Add('3');
         MyStringList.Add('4');
         Result :=MyStringList.DelimitedText;
         MyStringList.free;
    end;


    Note that Delimter is a character, not a string! If your separator is a string (for example „ ‟), you could use code below, to get a stringlist, containing 4 elements ('1', '2', '3' and '4'):

    procedure Sample;
    var
        MyStringList: TStringList=nil;
    begin
         MyStringList:= TStringList.create;
         MyStringList.text:=StringReplace('1
    2
    3
    4','
    ',Lineending,[rfReplaceAll, rfIgnoreCase]);
         MyStringList.free;
    end;

    Vice versa, next function will return „1 2 3‟:

    Function Sample : string;
    var
        MyStringList: TStringList=nil;
    begin
         MyStringList:= TStringList.create;
         MyStringList.SkipLastLineBreak := True;
         MyStringList.add('1');
         MyStringList.add('2');
         MyStringList.add('3');
         result := StringReplace(MyStringList.Text,Lineending,'
    ', [rfReplaceAll, rfIgnoreCase]);
         MyStringList.free;
    end;

    File Handling

    When using the TStringList you have 2 file handling procedures: SaveToFile and LoadFromFile. SavetoFile will save all strings in the list to a file. LoadFromFile will open the file and add the file data to the list string by string.

    program StrListFile;
    {$mode objfpc}
    uses
     Classes, SysUtils;
    
    var
      Str: TStringList;
    begin
      Str := TStringList.Create;
      try
        Str.LoadFromFile('SomeFile.txt');
        Str.Add('Hello');
        Str.SaveToFile('SomeFile.txt');
      finally
        Str.Free;
      end;
    end.

    You just opened a file, edited it and saved it right back to were it was!

    Dynamic string array comparison

    TStringList is simply an object-oriented version of a dynamic string array. Some methods have analogs:

    Operationarray of stringTStringList
    Variable declaration StringList: array of string; StringList: TStringList;
    Initialization implicit constructor StringList := TStringList.Create
    Set size SetLength(StringList, X); StringList.Size := X;
    Get size X := Length(StringList); X := StringList.Count;
    Add item SetLength(StringList, Length(StringList) + 1); StringList[Length(StringList) - 1] := X; StringList.Add(X);
    Delete item for I := Index to Length(StringList) - 2 do StringList[I] := StringList[I + 1]; SetLength(StringList, Length(StringList) - 1); StringList.Delete(Index);
    Remove all items SetLength(StringList, 0); StringList.Clear;
    Finalization implicit destructor StringList.Free;

    However, TStringList offers much more functionality than a basic structure such as a dynamic array.

    Keep Learning

    TStringList has many other interesting features:

    1. It allows you to sort the strings
    2. It allows you to limit the list to only unique strings
    3. You can get the text of all strings as a single string using the Text property.
    4. You can store an object or other data next to the string

    You can learn all the different procedures, functions and properties. See TStringList documentation... or the help in Lazarus.

    ... and you might like to extend this tutorial if you feel like it.

    See also

  • 相关阅读:
    【vue】饿了么项目-goods商品列表页开发
    【vue】饿了么项目-header组件开发
    转转hybrid app web静态资源离线系统实践
    从列表到详情,没你想的那么简单
    浅谈Async/Await
    小程序代码包压缩 策略&方案
    微信小程序使用场景延伸:扫码登录、扫码支付
    这一次带你彻底了解Cookie
    常见函数错误引发的思考.
    触碰密码世界的大门
  • 原文地址:https://www.cnblogs.com/liujx2019/p/11698216.html
Copyright © 2011-2022 走看看