4

I have ListView (vsReport) and StringGrid and what I want is if I click on some element in ListView, particular cells in StringGrid have to change colors. How do I do it?

Path is filled with 1 (move up) and 0(move right), it starts in left bottom and ends in right top corner, and I have to color these cells.


Thanks for the answers, I handled with my problem, but there's another little issue, how can I leave text in cells visible? FillRect fills the entire cell.

procedure TForm1.ListView1SelectItem(Sender: TObject; Item: TListItem; Selected: Boolean);
var aRect: TRect;
     a,x,y:integer;
     path:string;
begin
  path:=ListView1.Items[Item.Index].Caption;

  x:=0;
  y:=StringGrid1.RowCount;
for a := 0 to length(path) do
  begin
   if path[a]='1' then y:=y-1 else x:=x+1;
   aRect := StringGrid1.CellRect(x-1,y-1);
   StringGrid1.Canvas.Brush.Color := clBlue;
   StringGrid1.Canvas.FillRect(aRect);
   end;
end; 
4

1 に答える 1

6
  1. セルの色の変更は永続的であるべきであることを認識してください。これにより、StringGrid が再び描画されるとき (たとえば、StringGrid がダイアログによって難読化されたとき) に、特別な色も再度描画される必要があります。
  2. したがって、目的の色をどこかに保存する必要があります。そのために配列を使用したい場合は、次のいずれかを選択します。
    • 特別な色をグリッド座標と共に 1 次元配列に格納します。これはメモリの使用には適していますが、StringGrid のOnDrawCellハンドラー (手順 3 を参照) が提供する特定の座標について、この配列全体を検索する必要があります。
    • 特色のみを 2 次元配列に格納します。これは描画時の速度には適していますが、配列の列と行の境界を StringGrid の境界と同期させる必要があります。
    • Objectsまたは、どの目的でも StringGridのプロパティが必要ない場合は、 TObject. 助けが必要な場合は大声で言ってください。
  3. StringGrid のOnDrawCellイベント ハンドラで色付きのセルをペイントします(サポートが必要な場合は、スタック オーバーフローで[Delphi] StringGrid OnDrawCellを検索してください)。
  4. ListView のOnSelectItemイベントは、クリックまたは選択された項目を公開します。
  5. そのアイテムまたはそのサブアイテムから必要な情報を取得して、どのセルをどの色に変更するかを決定します。
  6. ステップ 2 で選択したストレージ ソリューションにその情報を追加します。
  7. すべての描画が「自動的に」行われるようになったら、 を呼び出すだけStringGrid.Repaintで十分であることを認識してください。
于 2012-01-31T19:00:22.477 に答える