Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 15763
  • Last Modified:

Using ListView

I have a ListView component with it´s ViwStyle = vsReport. In it I have 3 Coloumns. Example:
With some values on only two columns, like:

Description   |   Value   |   Total  
Keyboard           245
Mouse              130
CPU                   10      

I want to search the list view for a certain description and edit the column "Total".
For Example I need to search Mouse and put it´s total to 400.

Description   |   Value   |   Total  
Keyboard          245
Mouse             130           400
CPU                  10

Is there a way of doing this ? Or how can I solve it ? It can be with a diferent component.
0
fabyola
Asked:
fabyola
1 Solution
 
esoftbgCommented:
Does it mean that you want to search for multiple rows with Description Mouse ? ( because 130 is not equal of 400 )
0
 
mokuleCommented:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 0 to ListView1.Items.Count - 1 do
    begin
    if ListView1.Items[i].Caption = 'Mouse' then
      begin
      if ListView1.Items[i].SubItems.Count = 1 then
        ListView1.Items[i].SubItems.Add('400')
      else if ListView1.Items[i].SubItems.Count > 1 then
        ListView1.Items[i].SubItems[1] := '700';
      end;
    end;
end;
0
 
esoftbgCommented:
unit Unit1_Q_21090603;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    ListView: TListView;
    btnTotal: TButton;
    ComboBox: TComboBox;
    Memo: TMemo;
    btnClearMemo: TButton;
    procedure btnTotalClick(Sender: TObject);
    procedure btnClearMemoClick(Sender: TObject);
  private   { Private declarations }
  public    { Public declarations }
    function  Get_Total(Descr: string): Boolean;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function  TForm1.Get_Total(Descr: string): Boolean;
var
  Ok:     Boolean;
  I:      Integer;
  J:      Integer;
  K:      Integer;
  L:      Integer;
  M:      Integer;
  N:      Integer;
  S:      string;
begin
  Ok := True;
  try
    try
      J := 0;
      K := -1;
      N := 0;
      for I := 0 to ListView.Items.Count-1 do
      begin
        if (ListView.Items[I].Caption = Descr) then
        begin
          Inc(J);
          if (J=1) then
            K := I;
          S := ListView.Items[I].SubItems[0];
          Val(S, M, L);
          if (L=0) then
            N := N + M;
        end;
      end;
      S := IntToStr(N);
      if (K>=0) then
        ListView.Items[K].SubItems.Add(S);
    except
      Ok := False;
    end;
  finally
    Result := Ok;
  end;
end;

procedure TForm1.btnTotalClick(Sender: TObject);
var
  S:      string;
begin
  if Get_Total(ComboBox.Text) then
    S := 'Total about ' + ComboBox.Text + ' is OK.'
  else
    S := 'Total about ' + ComboBox.Text + ' failed';
  Memo.Lines.Add(S);
end;

procedure TForm1.btnClearMemoClick(Sender: TObject);
begin
  Memo.Clear;
end;

end.

//........

object Form1: TForm1
  Left = 224
  Top = 128
  BorderIcons = [biSystemMenu, biMinimize]
  BorderStyle = bsSingle
  Caption = 'Get Total'
  ClientHeight = 446
  ClientWidth = 504
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  PixelsPerInch = 96
  TextHeight = 13
  object ListView: TListView
    Left = 16
    Top = 32
    Width = 304
    Height = 400
    Columns = <
      item
        Caption = 'Description'
        Width = 128
      end
      item
        Caption = 'Value'
        Width = 64
      end
      item
        Caption = 'Total'
        Width = 80
      end>
    GridLines = True
    Items.Data = {
      C50000000600000000000000FFFFFFFFFFFFFFFF0100000000000000084B6579
      626F6172640332343500000000FFFFFFFFFFFFFFFF0100000000000000054D6F
      7573650331333000000000FFFFFFFFFFFFFFFF01000000000000000343505502
      313000000000FFFFFFFFFFFFFFFF0100000000000000054D6F75736503313435
      00000000FFFFFFFFFFFFFFFF0100000000000000054D6F757365033132350000
      0000FFFFFFFFFFFFFFFF010000000000000003435055023338FFFFFFFFFFFFFF
      FFFFFFFFFF}
    TabOrder = 0
    ViewStyle = vsReport
  end
  object btnTotal: TButton
    Left = 208
    Top = 4
    Width = 80
    Height = 25
    Caption = 'Total'
    TabOrder = 1
    OnClick = btnTotalClick
  end
  object ComboBox: TComboBox
    Left = 16
    Top = 6
    Width = 152
    Height = 21
    Style = csDropDownList
    ItemHeight = 13
    ItemIndex = 0
    TabOrder = 2
    Text = 'Keyboard'
    Items.Strings = (
      'Keyboard'
      'Mouse'
      'CPU')
  end
  object Memo: TMemo
    Left = 320
    Top = 32
    Width = 160
    Height = 400
    ReadOnly = True
    TabOrder = 3
  end
  object btnClearMemo: TButton
    Left = 352
    Top = 4
    Width = 75
    Height = 25
    Caption = 'Clear'
    TabOrder = 4
    OnClick = btnClearMemoClick
  end
end
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
Ivanov_GCommented:
procedure TForm1.FormCreate(Sender: TObject);
var ListItem : TListItem;
begin
  // fill the list view
  ListItem := TListItem.Create(ListView1.Items);
  // fill element 1
  ListItem := ListView1.Items.Add;
  ListItem.Caption := 'Keyboard';
  ListItem.SubItems.Add('245');
  ListItem.SubItems.Add('');
  // element 2
  ListItem := ListView1.Items.Add;
  ListItem.Caption := 'Mouse';
  ListItem.SubItems.Add('130');
  ListItem.SubItems.Add('');
  // element 3
  ListItem := ListView1.Items.Add;
  ListItem.Caption := 'CPU';
  ListItem.SubItems.Add('10');
  ListItem.SubItems.Add('');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  counter       : Integer;
  current_item  : TListItem;
begin
  for counter := 0 to ListView1.Items.Count - 1 do
    begin
      current_item := ListView1.Items[counter];
      if UpperCase(current_item.Caption) = 'MOUSE' then
        current_item.SubItems[1] := '400';
    end;
end;
0
 
fabyolaAuthor Commented:
But now when I try to read it´s value to do a sum, it reads with trash. For example: I found the Caption 'MOUSE' and added 400 to it. But when I return to it to sum 200 (to become 600) I need to read the value then do the addition. But when I read it it comes with trash like: '400' #$D#$A#$D. How can I take this trash out ?
0
 
Ivanov_GCommented:
you read the sum like this:

var
  sum   : Real;
begin
  sum := FloatToStr(ListView1.Items[counter].SubItems[2]);
0
 
esoftbgCommented:
a super example from:
page:        http://www.geocities.com/esoftbg/
  link:        Q_21090603.zip
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now