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"