RAD Studio |  |

Creating a New String List
Short-term string lists | Long-term string lists | See Also
Collapse All

A string list is typically part of a component. There are times, however, when it is convenient to create independent string lists, for example to store strings for a lookup table. The way you create and manage a string list depends on whether the list is short-term (constructed, used, and destroyed in a single routine) or long-term (available until the application shuts down). Whichever type of string list you create, remember that you are responsible for freeing the list when you finish with it.

Short-term string lists

If you use a string list only for the duration of a single routine, you can create it, use it, and destroy it all in one place. This is the safest way to work with string lists. Because the string-list object allocates memory for itself and its strings, you should use a try...finally block to ensure that the memory is freed even if an exception occurs.

To create a short-term string list:

1. Construct the string-list object.
2. In the try part of a try...finally block, use the string list.
3. In the finally part, free the string-list object.

The following event handler responds to a button click by constructing a string list, using it, and then destroying it.
Copy Code

    procedure TForm1.Button1Click(Sender: TObject);
    var  TempList: TStrings;{ declare the list }
    begin
      TempList := TStringList.Create;{ construct the list object }
      try    { use the string list }
      finally    TempList.Free;{ destroy the list object }
      end;
    end;

Copy Code

    void __fastcall TForm1::ButtonClick1(TObject *Sender)
    {
       TStringList *TempList = new TStringList; // declare the list
       try{
          //use the string list
       }
       __finally{
    delete TempList; // destroy the list object
       }
    }

Long-term string lists

If a string list must be available at any time while your application runs, construct the list at start-up and destroy it before the application terminates.

To create a long-term string list:

1. In the unit file for your application's main form, add a field of type TStrings to the form's declaration.
2. Write an event handler for the main form's OnCreate event that executes before the form appears. It should create a string list and assign it to the field you declared in the first step.
3. Write an event handler that frees the string list for the form's OnClose event.

This example uses a long-term string list to record the user's mouse clicks on the main form, then saves the list to a file before the application terminates.
Copy Code

    unit Unit1;
    interface
    uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;
    type  TForm1 = class(TForm)
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
        ClickList: TStrings;{ declare the field }
      end;
    var  Form1: TForm1;
    implementation
    {$R *.DFM}
    procedure TForm1.FormCreate(Sender: TObject);
    begin
            ClickList := TStringList.Create;{ construct the list }
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
        ClickList.SaveToFile(ChangeFileExt(Application.ExeName, '.log'));{ save the list }
     ClickList.Free;{ destroy the list object }
    end;

    procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
    begin
        ClickList.Add(Format('Click at (%d, %d)', [X, Y]));{ add a string to the list }
    end;

    end.

Copy Code

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    ClickList = new TStringList;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
    {
    ClickList->SaveToFile(ChangeFileExt(Application->ExeName, ".log"));//Save the list
    delete ClickList;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
    TShiftState Shift, int X, int Y)
    {
    TVarRec v[] = {X,Y};
    ClickList->Add(Format("Click at (%d, %d)",v,ARRAYSIZE(v) - 1));//add a string to the list

Note: Although you can use events such as OnCreate and OnDestroy to allocate and free classes, using the constructor and destructor for a class is generally safer coding practice.
See Also

Manipulating Strings in a List

Loading and Saving String Lists

Associating Objects with a String List

Copyright(C) 2009 Embarcadero Technologies, Inc. All Rights Reserved.
What do you think about this topic? Send feedback!