Newsgroup: it.comp.lang.delphi
Titolo: TShellTreeView e CheckBox

è il 11 agosto, lo so :-)
sto cercando di implementare dei checkbox nel componente TShellTreeView  ma 
mi sono impuntato...
purtroppo per darmi un'opinione credo che bisognerebbe realizzare lo stesso 
progettino e non so quanti di voi ne abbiano voglia...
comunque questo sarebbe il problema:
i checkbox vengono attivati e disattivati (sostituzioni di immagini) 
correttamente ma solo se il nodo non ha il focus perchè utilizzo l'evento 
OnChanging.
in breve (per quanto possibile)
form con il solo componente TShellTreeView
le proprietà
UseShellImages := false;
Root := 'c:\';
Images := ImageList1 (vuota)
var
firstAction : boolean; // per evitare che all'avvio la root venga flaggata
// creo le immagini checkbox per ImageList1 - grazie Google!
procedure TForm1.FormCreate(Sender: TObject);
var
  bmp, temp: TBitmap;
  i: Integer;
begin
  bmp:= TBitmap.create;
  try
    bmp.handle := LoadBitmap( 0, PChar(OBM_CHECKBOXES ));
    // bmp now has a 4x3 bitmap of divers state images
    // used by checkboxes and radiobuttons
    temp:= TBitmap.Create;
    // image1.picture.bitmap := bmp;
    try
      imagelist1.Width := bmp.width div 4;
      imagelist1.Height:= bmp.Height div 3;
      With temp Do Begin
        width := bmp.width div 4;
        height := bmp.height div 3;
        for i:= 0 to 3 Do begin
          canvas.copyrect( canvas.cliprect, bmp.canvas,
                           rect(i*width,0,(i+1)*width, height ));
          imagelist1.AddMasked( temp, clSilver );
        end;
      End;
      label1.Caption := IntToStr( imagelist1.Count );
    finally
      temp.free;
    end;
  finally
    bmp.free
  end;
  firstAction := false;
end;
procedure TForm1.ShellTreeView1Changing(Sender: TObject; Node: TTreeNode;
  var AllowChange: Boolean);
begin
  If (assigned( node ) and (firstAction = true)) then
  begin
      With node Do
      begin
        //edit1.Text := inttostr(imageindex);
        Case imageindex Of
          1: imageindex := 0;
          0: imageindex := 1;
        End;
        //tvs.Repaint;
      end;
  end;
end;
procedure TForm1.ShellTreeView1GetImageIndex(Sender: TObject; Node: 
TTreeNode);
begin
  Node.SelectedIndex := Node.ImageIndex;
end;
procedure TForm1.ShellTreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  Node.SelectedIndex := Node.ImageIndex;
end;
procedure TForm1.ShellTreeView1Click(Sender: TObject);
begin
  firstAction := true;
end;
Il problema, come detto, è che se clicco il checkbox mentre il focus è su 
un'altro item tutto ok ma se ad esempio flaggo un item ed immediatamente 
dopo ci ripenso e lo voglio 'deflaggare' non mi è possibile se prima non 
seleziono un'altro item.
mhhh, suggerimenti pre-festivi?
Ciao
Valter

>[...]
avevo un problema simile con TTreeView e l'evento OnChanging,
e come nel tuo caso se non cambiavo nodo il click su una voce era
inefficace.
ho risolto usando l'evento onClick
procedure Tfrm_Base.TreeView1Click(Sender: TObject);
var Node:TTreeNode;
begin
  Node := TTreeview(sender).Selected;
  if (Assigned(Node)) then
  begin
    if Node.Text='Fondatrice' then
     begin
      TestaToolBar;
      NodoPadre:='Album Fondatrice';
     end
    else if Node.Text='Spiritualità' then
     begin
      TestaToolBar;
      NodoPadre:='Album Noi Oggi';
     end
..........
magari la TShellTreeView si comporta diversamente, ma magari
vale la pena provare. 

 vale la pena provare.
procedure Tfrm_Base.TreeView1Click(Sender: TObject);
var Node:TTreeNode;
begin
  Node := TTreeview(sender).Selected;
  if (Assigned(Node)) then
[cut]
mi hai fornito un sistema utile per far riferimento ad un nodo in un evento
che non lo contempla come parametro (sul TShellTreeView il tuo metodo
funziona a differenza di GetNodeAt che mi restituisce nil - chissà poi
perchè) ma purtroppo non risolve il problema...se riclicco sull'elemento
selezionato non mi sostituisce l'mmagine (ma può darsi che sia io a non
gestire correttamente gli altri eventi).
Grazie
Valter

> gestire correttamente gli altri eventi).
se non l'hai ancora trovato prova a consultare questo articolo
http://delphi.about.com/od/vclusing/l/aa092104a.htm
potrebbe essere vicino a cio' che cerchi.
ciao Maurizio 

 potrebbe essere vicino a cio' che cerchi.
è esattamente quello che cerco...grazie! :-)
Devo solo adattarlo al TShellTreeView...il codice utilizza per visualizzare 
i checkbox StateIndex (permettendo così di avere ImageIndex sfruttabile) ma 
di default StateIndex è disabilitato. Il codice traslato su TShellTreeView 
non visualizza i CheckBox e da verifica risulta StateIndex a -1. Dato che 
gli Items se li genera automaticamente devo vedere se è possibile 
modificarne la proprietà. Essendo presente nell'Object Inspector StateImages 
ne deduco che si dovrebbe poter fare.
Grazie di nuovo
Ciao
Valter

 dovrebbe poter fare.
beccato:
Seems the problem is in the TShellTreeView's overridden WndProc procedure.
The issue is in the routine which handles the TVM_SETIMAGELIST message, it's
basically doing right things, but after all is calling:
SendMessage(Self.Handle, TVM_SETIMAGELIST, TVSIL_NORMAL, ImageListHandle);
and it means that only normal image list could be set, but not state images
(see the TVSIL_NORMAL constant). You can correct it yourself, as you have
sources for this control. I guess, would be enough, if you add additional
checking to the line 2169 of the ShellCtrls unit [cut]
procediamo... :-)
Valter

>[...]
sono io ora ad avere una curisotita' ;
il componente TShellTreeView non lo vedo D2006 Pro Win32,
caricando l'esempio l'esempi odi Zarko , vedi il TreeView con
Check Box e RadioButton , ma non trovo la proprieta' a design time.
in progetti WindowForm e Vcl32.Net riesco ad avere i CheckBox
nel TreeView , ma in Win32 come cavolo si chiama ?
grazie Maurizio


vuoi dire che non hai TTreeView nella palette Win32 sotto VCL Forms
Application - Delphi for Win32?