Solved

select a specific line in a listbox if you know the item index

Posted on 2008-10-20
6
976 Views
Last Modified: 2013-11-23
Delphi 6.

I have a listbox with multiple lines.

What i want to do is somethng like:

1) User Select a line.
2) application remembers the index of the selected line
3) user manipulates/edits the selected line
4) save the new listbox info to a text file (savetofile)
5) automatically scroll and select the originally selected line as I remebered the item index.  so from a user point of view they don't lose their 'place'    <<HELP  REQUIRED FOR STEP 5

Cheers

Brad
0
Comment
Question by:delphinewbie
  • 4
6 Comments
 
LVL 36

Expert Comment

by:Geert Gruwez
Comment Utility
by default a listbox does not allow editing

it may be better to use a StringGrid
in essence nearly the same when you use 1 column
0
 
LVL 36

Expert Comment

by:Geert Gruwez
Comment Utility
here is an example

to see the text of the dfm file
right click on the form and click on "view as text"
unit Unit1;
 

interface
 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, Grids, StdCtrls, Buttons;
 

type

  TForm1 = class(TForm)

    DataGrid: TStringGrid;

    btnAddRow: TBitBtn;

    procedure DataGridSetEditText(Sender: TObject; ACol, ARow: Integer;

      const Value: String);

    procedure btnAddRowClick(Sender: TObject);

  private

    fDataFileName: string;

    procedure LoadData;

  public

    constructor Create(AOwner: TComponent); override;

    property DataFileName: string read fDataFileName;

  end;
 

var

  Form1: TForm1;
 

implementation
 

{$R *.dfm}
 

constructor TForm1.Create(AOwner: TComponent);

begin

  inherited Create(AOwner);

  fDataFileName := ExtractFilePath(Application.ExeName) + 'data.txt';

  LoadData;

end;
 

procedure TForm1.LoadData;

var

  List: TStrings;

  I: Integer;

begin

  DataGrid.ColCount := 2;

  DataGrid.RowCount := 2;

  DataGrid.FixedCols := 1;

  DataGrid.FixedRows := 1;

  DataGrid.ColWidths[0] := 12;

  DataGrid.ColWidths[1] := 500;

  DataGrid.Cells[1, 0] := 'Column Title';

  DataGrid.Cells[1, 1] := '';

  DataGrid.Cells[0, 1] := '1';

  if FileExists(fDataFileName) then

  begin

    List := TStringList.Create;

    try

      List.LoadFromFile(fDataFileName);

      for I := 0 to List.Count -1 do

      begin

        if I > 0 then

          DataGrid.RowCount := DataGrid.RowCount + 1;

        DataGrid.Cells[0, I+1] := IntToStr(I+1);

        DataGrid.Cells[1, I+1] := List[I];

      end;

    finally

      FreeAndNil(List);

    end;

  end;

end;
 

procedure TForm1.DataGridSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: String);

var

  List: TStrings;

  I: Integer;

begin

  List := TStringList.Create;

  try

    for I := 1 to DataGrid.RowCount-1 do

    begin

      if ARow = I then

        List.Add(Value)

      else

        List.Add(DataGrid.Cells[1, I]);

    end;

    List.SaveToFile(DataFileName);

  finally

    FreeAndNil(List);

  end;

end;
 

procedure TForm1.btnAddRowClick(Sender: TObject);

begin

  with DataGrid do

  begin

    RowCount := RowCount + 1;

    Cells[0, RowCount-1] := IntToStr(RowCount-1);

    Cells[1, RowCount-1] := '';

    Row := RowCount-1;

    Col := 1;

  end;

end;
 

end.
 

-- dfm --

object Form1: TForm1

  Left = 221

  Top = 181

  Width = 870

  Height = 640

  Caption = 'Form1'

  Color = clBtnFace

  Font.Charset = DEFAULT_CHARSET

  Font.Color = clWindowText

  Font.Height = -11

  Font.Name = 'MS Sans Serif'

  Font.Style = []

  OldCreateOrder = False

  PixelsPerInch = 96

  TextHeight = 13

  object DataGrid: TStringGrid

    Left = 80

    Top = 35

    Width = 601

    Height = 501

    ColCount = 2

    RowCount = 2

    Options = [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine, goRangeSelect, goEditing]

    TabOrder = 0

    OnSetEditText = DataGridSetEditText

    ColWidths = (

      64

      420)

  end

  object btnAddRow: TBitBtn

    Left = 705

    Top = 45

    Width = 75

    Height = 25

    Caption = 'btnAddRow'

    TabOrder = 1

    OnClick = btnAddRowClick

  end

end

Open in new window

0
 

Expert Comment

by:bluetoe
Comment Utility
Is this the sort of thing you want
unit listboxUnit2;
 

interface
 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;
 

type

  TForm2 = class(TForm)

    ListBox1: TListBox;

    Button1: TButton;

    Edit1: TEdit;

    procedure FormCreate(Sender: TObject);

    procedure ListBox1Click(Sender: TObject);

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

    giListBoxPos : integer;

  public

    { Public declarations }

  end;
 

var

  Form2: TForm2;
 

implementation
 

{$R *.dfm}
 

procedure TForm2.Button1Click(Sender: TObject);

begin

	ListBox1.Items.Delete(giListBoxPos);

	ListBox1.Items.Insert(giListBoxPos, Edit1.text);

	ListBox1.ItemIndex := giListBoxPos;

end;
 

procedure TForm2.FormCreate(Sender: TObject);

var i : integer;

begin

	for i  := 0 to 20 do

		ListBox1.Items.Add( inttostr(i));
 
 

end;
 

procedure TForm2.ListBox1Click(Sender: TObject);

begin

	giListBoxPos := ListBox1.ItemIndex;
 

	edit1.Text := ListBox1.Items[giListBoxPos];

	edit1.SetFocus;
 

end;
 

end.

Open in new window

0
Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

 
LVL 36

Expert Comment

by:Geert Gruwez
Comment Utility
with the stringgrid you get inplace editing
0
 
LVL 1

Accepted Solution

by:
delphinewbie earned 0 total points
Comment Utility
I solved my issue.

listbox2.Selected[MyItemIndex]:=true; << is the line i need

problem i had was the writetofile slowed down the processing, so i needed to insert a delay before the above line.

Thanks for your suggestions!
0
 
LVL 36

Expert Comment

by:Geert Gruwez
Comment Utility
you almost solved your issue ...

if you want the selected item from the Listbox to be in the same place
you need to save the ListBox.TopIndex too

just like you are doing with ListBox.ItemIndex

and you should accept bluetoe's comment
as the code snippet is the same as your solution
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Update (December 2011): Since this article was published, the things have changed for good for Android native developers. The Sequoyah Project (http://www.eclipse.org/sequoyah/) automates most of the tasks discussed in this article. You can even fin…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
The viewer will learn how to use and create keystrokes in Netbeans IDE 8.0 for Windows.
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.

763 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now