Newsgroup: it.comp.lang.delphi
Titolo: Modificare le colonne di una lista

Ciao a tutti.
Sono nuovo della programmazione ad oggetti (lavoro con il Borland Pascal
sotto dos da circa 8 anni ma non ho mai utilizzato la prog. ad oggetti) e
sto realizzando un programma in Delphi 4.
Avrei la necessita' di implementare una tabella composta da colonne i cui
elementi siano modificabili quando selezionati con il mouse (tipo Excel o un
qualunque foglio elettronico).
Ho utilizzato la classe TListView, ho creato le colonne ed inserito gli
elementi (items e subitems); il programma funziona ma quando seleziono una
riga e' possibile modificare il valore solo in corrispondenza della prima
colonna.
Come posso risolvere il problema ? (se possibile, inviare il codice sorgente
o modificare quello che segue)
Questo e' il codice (Form1 e' una form vuota):
(********* PROGRAMMA *********)
program blankproj;
uses
  Forms, Blank;
{$R *.RES}
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
(********* UNIT BLANK *********)
unit blank;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
   ListView1: TListView;
   Form1: TForm1;
   TimeElapsed: Boolean;
implementation
{$R *.DFM}
procedure SelectItem(Sender: TObject; Item: TListItem;
  Selected: Boolean);
var
  _Item: TListItem;
  a: TListItem;
begin
{  if Selected then
  begin
    Item.EditCaption;
  end;
}
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  I: integer;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ListView: TListView;
const
  Names: array[0..5, 0..1] of ShortString = (
    ('Rubble', 'Barney'),
    ('Michael', 'Johnson'),
    ('Bunny', 'Bugs'),
    ('Silver', 'HiHo'),
    ('Simpson', 'Bart'),
    ('Squirrel', 'Rockey')
    );
begin
  ListView1 := TListView.Create(Self);
  With ListView1 do
  begin
    Parent := Self;
    Align := alClient;
    ViewStyle := vsReport;
    NewColumn := ListView1.Columns.Add;
    NewColumn.Width := 100;
    NewColumn.Caption := 'Cognome';
    NewColumn := ListView1.Columns.Add;
    NewColumn.Width := 100;
    NewColumn.Caption := 'Nome';
    for I := 0 to High(Names) do
    begin
      ListItem := Items.Add;
      ListItem.Caption := Names[I][0];
      ListItem.SubItems.Add(Names[I][1]);
    end;
  end;
end;
end.
(********* FINE CODICE *********)
Questo esempio permette di modificare solo il Cognome mentre io ho la
necessita' di poter modificare Nome e Cognome in funzione della selezione.
Ciao.
Simone.
==============================
...e Dio disse: "pkunzip universo.zip"
e-mail: 
drfa...@tiscalinet.it
web: 
http://go.to/drfalken
 (internet
su numero verde, pascal, assembler,
mp3 player, tips'n'tricks)
==============================

Le uniche due soluzioni che mi vengono in mente sono
1) Usare TStringGrid al posto della listview, che permette proprio di
editare quello che vuoi (mi permetto di consigliarti ExtStringGrid di Bruno
Fierens che è molto più completa di quella standard -
http://www.tmssoftware.com/
  - Ci troverai anche molti altri componenti
molto carini -- quanti "molto" c'ho messo :)))
2) Cercare un componente ListView che faccia l'editazione anche dei
subitems, ma sinceramente non mi sembra che sia il caso...
Jax
PS: Non postare codice se non piccole parti, alcuni non gradiscono...

 subitems, ma sinceramente non mi sembra che sia il caso...
Beh, forse una cosa di questo genere potrebbe bastare:
quando vuoi andare in edit (OnClick, "F2"...) crei una Edit "sulla"
TlistView (che ne sarà l'Owner e il Parent) e ci copi il valore del SubItems
su cui hai cliccato (puoi saperlo dalla colonna, mi pare ci sia un parametro
nel gestore di evento o cmq puoi calcolarlo sfruttando la dimensione delle
colonne e la posizione del cursore) al primo invio :
- memorizzi nel subitem il nuovo valore
- distruggi la Edit...
Fai attenzione ad accedere all'oggetto (ti consiglio di fare una cosa così:
Edit.Free;
Edit:=Nil;
per distruggerla, e invece quando vuoi crearla fare un controllo così:
if Not Assigned(Edit) then
  begin
  Edit:=TEdit.Create(Listview);
  Edit.Parent:=ListView;
  Edit.Left, Top, width,....
  end;
Edit.Text:=[valore subitem]
Il sistema sembra buono, se vuoi ulteriori dettagli/incontri problemi scrivi
pure e cercherò di essere + preciso... :-)
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

> Il sistema sembra buono
Uhmmmmmmmm ^____^
Non è che sia il massimo dell'eleganza, comunque direi visto che ci siamo,
invece di crearsi tutte le volte una edit, che usi una InputQuery (o
QueryInput non ricordo)... però ripeto, non è che mi piaccia molto, perché
dipende da un fattore troppo aleatorio, cioè la posizione del cursore...
tanti calcoli, tanto codice per una cosa che la StringGrid fa
tranquillamente... IMHO ovviamente. :)
Jax

 tranquillamente... IMHO ovviamente. :)
Sì, se si può usare una StringGrid ok (anzi, ne ho viste di meglio su
Torry...)...
Pensavo solo di evitare a Dr.Falken di riscriversi tutto... [in 7-8 righe si
implementa la casella di edit...]


Grazie per l'aiuto, ho risolto scaricando AdvColumnGrid da
http://www.tmssoftware.com/
 seguendo il consiglio di Jax.
IMHO ottimo!
Sembra fatto su misura per il mio programma!
Purtroppo non potevo risolvere il problema con la sola casella di Edit
perche' avevo la necessita' di inserire delle bitmap nelle caselle. (non
l'avevo specificato nel post perche' era una cosa secondaria...)
Grazie!
Simone.