Newsgroup: it.comp.lang.delphi
Titolo: ComboBox multi colonna

Voi che sapete tutto...  :-)
Vorrei derivare un TComboBox per farmi un componente multi colonna,
tipo M. Access per intenderci.
Mi date qualche spunto dal quale partire?
Giovanni

hai gia visto sui soliti siti?
A.

 A.
Premessa importante che ho tralasciato nel precedente messaggio: uso
Delphi Turbo Explorer, quindi non posso installare componenti di terze
parti. O meglio li potrei installare avendone i sorgenti..
Ho trovato il TMS.. che è a pagamento e non me lo posso permettere.
Ho visto il TGridBox che però mi dava centinaia di errori in fase di
compilazione.
O trovato un po' di codice su un sito turco per disegnare le celle del
TcomboBox:
----------------------
procedure TForm1.ComboBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  strVal, strAll: string;
  pos1, pos2: Integer;
  rc: TRect;
  arrWidth: array [0..3] of Integer;
begin
  Combobox1.Canvas.Brush.Style := bsSolid;
  Combobox1.Canvas.FillRect(Rect);
  // the columns must be separated by ';'
  strAll := Combobox1.Items[Index];
  arrWidth[0] := 0;
  arrWidth[1] := 100;  // Width of column 1
  arrWidth[2] := 200;  // Width of column 2
  arrWidth[3] := 300;  // Width of colimn 3
  // Drawingrange for first column
  rc.Left   := Rect.Left + arrWidth[0] + 2;
  rc.Right  := Rect.Left + arrWidth[1] - 2;
  rc.Top    := Rect.Top;
  rc.Bottom := Rect.Bottom;
  // Get text for first column
  pos1   := Pos(';', strAll);
  strVal := Copy(strAll, 1, pos1 - 1);
  // Draw Text
  Combobox1.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);
  // Draw separating line betwenn columns
  Combobox1.Canvas.MoveTo(rc.Right, rc.Top);
  Combobox1.Canvas.LineTo(rc.Right, rc.Bottom);
  // Drawingrange for second column
  rc.Left  := Rect.Left + arrWidth[1] + 2;
  rc.Right := Rect.Left + arrWidth[2] - 2;
  // Get text for second column
  strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);
  pos1   := Pos(';', strAll);
  strVal := Copy(strAll, 1, pos1 - 1);
  // Draw Text
  Combobox1.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);
  // Draw separating line betwenn columns
  Combobox1.Canvas.MoveTo(rc.Right, rc.Top);
  Combobox1.Canvas.LineTo(rc.Right, rc.Bottom);
  // Drawingrange for third column
  rc.Left  := Rect.Left + arrWidth[2] + 2;
  rc.Right := Rect.Left + arrWidth[3] - 2;
  // Get text for third column
  strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);
  pos1   := Pos(';', strAll);
  strVal := Copy(strAll, 1, pos1 - 1);
  // Draw Text
  Combobox1.Canvas.TextRect(rc, rc.Left, rc.Top, strVal);
  // Draw separating line betwenn columns
  Combobox1.Canvas.MoveTo(rc.Right, rc.Top);
  Combobox1.Canvas.LineTo(rc.Right, rc.Bottom);
  strAll := Copy(strAll, pos1 + 1, Length(strAll) - pos1);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  with Combobox1.Items do
  begin
    Add('first;second;third;');
    Add('column1;column2;column3;');
  end;
end;
----------------------
il risultato complessivo non mi dispiace però vorrei capire come:
1) nell'evento DropDown della Combo, mostrare tutte le colonne della
Combo mantenendo la dimensione della Combo piccola (se la metto larga
quanto le colonne sottostanti me le fa vedere tutte, se la metto corta
mi mostra solo una parte della griglia)
2) disegnare la prima riga della griglia conferendole l' aspetto
tipico dei titoli (con sfondo grigetto)
Dopodichè mi concentrerò nella creazione del componente
personalizzato, che metterò a disposizione di tutti.
Saluti.
Giovanni

up
Giovanni