Solved

Using ListView

Posted on 2004-08-11
7
15,722 Views
Last Modified: 2011-08-18
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
Comment
Question by:fabyola
7 Comments
 
LVL 12

Expert Comment

by:esoftbg
ID: 11778276
Does it mean that you want to search for multiple rows with Description Mouse ? ( because 130 is not equal of 400 )
0
 
LVL 17

Expert Comment

by:mokule
ID: 11778326
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
 
LVL 12

Expert Comment

by:esoftbg
ID: 11778940
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 12

Expert Comment

by:Ivanov_G
ID: 11781129
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
 

Author Comment

by:fabyola
ID: 11782680
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
 
LVL 12

Expert Comment

by:Ivanov_G
ID: 11782781
you read the sum like this:

var
  sum   : Real;
begin
  sum := FloatToStr(ListView1.Items[counter].SubItems[2]);
0
 
LVL 12

Accepted Solution

by:
esoftbg earned 125 total points
ID: 11783591
a super example from:
page:        http://www.geocities.com/esoftbg/
  link:        Q_21090603.zip
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Windows 10 is mostly good. However the one thing that annoys me is how many clicks you have to do to dial a VPN connection. You have to go to settings from the start menu, (2 clicks), Network and Internet (1 click), Click VPN (another click) then fi…
This is used to tweak the memory usage for your computer, it is used for servers more so than workstations but just be careful editing registry settings as it may cause irreversible results. I hold no responsibility for anything you do to the regist…

895 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

12 Experts available now in Live!

Get 1:1 Help Now