Mark
While I will probably use Robert's suggestion (my string is strictly
delimitted by commas - no spaces)
I'll certainly pore over your code to try to understand how it works -
always useful
Thanks for this suggestion.

Mark
----- Original Message -----
From: "Mark Derricutt" <[EMAIL PROTECTED]>
To: "Multiple recipients of list delphi" <[EMAIL PROTECTED]>
Sent: Thursday, May 03, 2001 6:32 PM
Subject: Re: Re[2]: [DUG]: Accessing 'Fields' in a String List


> Attached is a copy of my TStringCollection component which I use for this
> list of stringlists.
>
> I use it like:
>
>   StringCollection['name of stringlist'].Lines.Strings[1];
>   StringCollection.StringDefs.Add.Lines.LoadFromFile('somefile');
>
> Mark
>
>
> ---cut here---
> unit StringCollection;
>
> (* $Id: StringCollection.pas,v 1.12 2000/10/24 07:13:47 derricuttm Exp $
>  *
>  * TStringCollection is something I've been wanting to make up for ages
but
>  * never got there.  It basically extends the TStringThing component to
have
>  * multple stringlists and keeping things nice and tidy without cluttering
> up
>  * the form.
>  *
>  * You can access the strings in code with:
>  *
>  *   StringCollection.Strings['Project'].ShowOkMessage;
>  *   StringCollection['Another String'].ShowCustomMessage;
>  *
>  * Mark Derricutt <[EMAIL PROTECTED]>
>  *
>  *)
>
> interface
>
> uses
> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
> Db
> {,ColnEdit};
>
> type
>   TStringDef = class;
> TStringDefs = class(TOwnedCollection)
> public
> constructor Create(AOwner: TPersistent);
> function AddStringDef: TStringDef;
> end;
>
> TStringDef = class(TNamedItem)
> private
> fLines: TStrings;
> fContext: Integer;
> fButtons: TMsgDlgButtons;
> procedure SetLines(const Value: TStrings);
> function GetText: string;
> function GetValues(ItemName: string): string;
> procedure SetValues(ItemName: string; const Value: string);
> public
> constructor Create(Collection: TCollection); override;
> destructor Destroy; override;
> procedure ShowOkMessage;
> function ShowYesNoMessage: Word;
> function ShowCustomMessage: Word;
> property Text: string read GetText;
> property Values[ItemName: string]: string read GetValues write SetValues;
> published
> property Lines: TStrings read fLines write SetLines;
> property Buttons: TMsgDlgButtons read fButtons write fButtons;
> property HelpContext: Integer read fContext write fContext;
> end;
>
> TStringCollection = class(TComponent)
> private
> fStringDefs: TStringDefs;
> function GetStrings: TStringDefs;
> procedure SetStrings(const Value: TStringDefs);
> function GetStringByName(StringName: string): TStringDef;
> { Private declarations }
> protected
> { Protected declarations }
> public
> function HasStrings: Boolean;
> function StringIndex(StringName: string): Integer;
> constructor Create(Owner: TComponent); override;
> destructor Destroy; override;
> property Strings[StringName: string]: TStringDef read GetStringByName;
> default;
> { Public declarations }
> published
> property StringDefs: TStringDefs read GetStrings write SetStrings stored
> HasStrings;
> { Published declarations }
>   end;
>
> procedure Register;
>
> implementation
>
> procedure Register;
> begin
>   RegisterComponents('Additional', [TStringCollection]);
> end;
>
> { TStringCollection }
>
> constructor TStringCollection.Create(Owner: TComponent);
> begin
>   inherited;
>   fStringDefs := TStringDefs.Create(Self);
> end;
>
> destructor TStringCollection.Destroy;
> begin
>   fStringDefs.Free;
>   inherited;
> end;
>
> function TStringDef.GetValues(ItemName: string): string;
> begin
>   Result := Lines.Values[ItemName];
> end;
>
> procedure TStringDef.SetValues(ItemName: string; const Value: string);
> begin
>   Lines.Values[ItemName] := Value;
> end;
>
> function TStringCollection.GetStrings: TStringDefs;
> begin
>   if fStringDefs = nil then
> fStringDefs := TStringDefs.Create(Self);
>   Result := fStringDefs;
> end;
>
> (* Summary:
>  *     Returns true if component has any TStringDef's defined.
>  * Return Value:
>  *     TRUE if there are any TStringDef's defined,
>  *     FALSE if empty.
>  * Description:
>  *     The HasStrings function is used internally by the StringDef's
> property to
>  *     determine if it should be saved into the unit's DFM file.  However
> it can
>  *     also be used by the developer if they so like.
>  *)
>
> function TStringCollection.HasStrings: Boolean;
> begin
>   Result := (FStringDefs <> nil) and (FStringDefs.Count > 0);
> end;
>
> procedure TStringCollection.SetStrings(const Value: TStringDefs);
> begin
>   StringDefs.Assign(Value);
> end;
>
> { TStringsDef }
>
> function TStringDefs.AddStringDef: TStringDef;
> begin
> Result := TStringDef.Create(Self);
> end;
>
> constructor TStringDefs.Create(AOwner: TPersistent);
> begin
> inherited Create(AOwner, TStringDef);
> end;
>
> (* Summary:
>  *     Return a TStringDef object by referring to its name.
>  * Arguments:
>  *     StringName - The name property of the TStringDef object.
>  * Return Value:
>  *     NIL is invalid TStringDef reference,
>  *     TStringDef if valid.
>  * Description:
>  *     The GetStringByName function is the read method of the Strings
> property,
>  *     it is used to access a member of the StringDef's collection.  The
> Strings
>  *     property is also the default property for a TStringCollection
> component so
>  *     you can reference it via
StringCollection1['SomeStringDefName'].Text;
>  *)
>
> function TStringCollection.GetStringByName(StringName: string):
TStringDef;
> var
> i: integer;
> begin
> i := StringIndex(StringName);
> if i > -1 then
> Result := TStringDef(StringDefs.Items[i])
> else
> raise Exception.CreateFmt(
> '"%s" is an unknown String Definition for %s.%s',
> [StringName, Owner.Name, Name]);
>
> {
> for i := 0 to StringDefs.Count - 1 do
> begin
> if TStringDef(StringDefs.Items[i]).Name = StringName then
> begin
> Result := TStringDef(StringDefs.Items[i]);
> Exit;
> end;
> end;
> raise Exception.CreateFmt(
> '"%s" is an unknown String Definition for %s.%s',
> [StringName, Owner.Name, Name]);
> }
> end;
>
> function TStringCollection.StringIndex(StringName: string): Integer;
> var
> i: integer;
> begin
> Result := -1;
> for i := 0 to StringDefs.Count - 1 do
> begin
> if TStringDef(StringDefs.Items[i]).Name = StringName then
> begin
> Result := i;
> Exit;
> end;
> end;
> end;
>
> { TStringDef }
>
> constructor TStringDef.Create(Collection: TCollection);
> begin
>   inherited;
>   fLines := TStringList.Create;
> end;
>
> destructor TStringDef.Destroy;
> begin
>   fLines.Free;
>   inherited;
> end;
>
> procedure TStringDef.SetLines(const Value: TStrings);
> begin
>   fLines.Assign(Value);
> end;
>
> procedure TStringDef.ShowOkMessage;
> begin
>   MessageDlg(Lines.Text,
>              mtInformation,
>              [mbOk],
>              HelpContext);
> end;
>
> function TStringDef.ShowYesNoMessage: Word;
> begin
>   Result := MessageDlg(Lines.Text,
>                        mtConfirmation,
>                        [mbYes, mbNo],
>                        HelpContext);
> end;
>
> function TStringDef.ShowCustomMessage: Word;
> begin
>   Result := MessageDlg(Lines.Text,
>                        mtConfirmation,
>                        Buttons,
>                        HelpContext);
> end;
>
> function TStringDef.GetText: string;
> begin
>   Result := Lines.Text;
> end;
>
> end.
>
> ---cut here---
>
>
>
> --On Friday, 4 May 2001 12:21 p.m. +1200 [EMAIL PROTECTED] wrote:
>
> > A possible ... A TList of TStringLists ...
> >
> > Regards
> > Paul McKenzie
> >
> > =========================
> > Paul McKenzie
> > Jetbet II Developer
> > =========================
> > [EMAIL PROTECTED]
> > Ph: (04) 576-6822
> >
> > T.A.B. National Office
> > 106-110 Jackson Street
> > Petone
> > New Zealand
> >
> >
> >
> > ____________________Reply Separator____________________
> > Subject:  Re: [DUG]:  Accessing 'Fields' in a String List
> > Author:   [EMAIL PROTECTED]
> > Date:          04/05/2001 12:18
> >
> >
> >
> >      In this case we usually create a tempory stringlist and assign one
> > line of      the source list to it
> >
> >      i.e
> >
> >                TempList.Text := SourceList.CommaText;
> >
> >      In your case this leaves templist with 5 items which you can access
> > as      normal, eg TempList[3] would be the third comma seperated item
in
> >      SourceList.
> >
> >      Hope this helps.
> >
> >
> >      Rob
> >      Software engineer
> >      Wild Software Ltd
> >      [EMAIL PROTECTED]
> >        ----- Original Message -----
> >        From: Mark Howard
> >        To: Multiple recipients of list delphi
> >        Sent: Saturday, May 05, 2001 6:15 AM
> >        Subject: [DUG]: Accessing 'Fields' in a String List
> >
> >
> >        Hi
> >
> >        I have a TStringList in which each of the strings is itself a
comma
> >      delimited list of 5 fields.
> >
> >        Is there a TStrings method that lets me access these fields
> > directly, or      do I have to chop the string myself?
> >
> >        TIA
> >
> >        Mark(See attached file: att1.htm)
> >  (See attached file: att2.eml)
>
>
>
>
> --------------------------------------------------------------------------
-
>     New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
>                   Website: http://www.delphi.org.nz
> To UnSub, send email to: [EMAIL PROTECTED]
> with body of "unsubscribe delphi"

---------------------------------------------------------------------------
    New Zealand Delphi Users group - Delphi List - [EMAIL PROTECTED]
                  Website: http://www.delphi.org.nz
To UnSub, send email to: [EMAIL PROTECTED] 
with body of "unsubscribe delphi"

Reply via email to