Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.07;
Скачать: CL | DM;

Вниз

Выделение ячейкив DrawGrid   Найти похожие ветки 

 
Андрей   (2008-10-17 13:05) [0]

Здравствуйте! Помогите, пожалуйста, решить небольшую проблему.
Есть DrawGrid в который помещаются картинки из внешних bmp. Как обработать первый клик на ячейке, чтобы картинка только в ней выделилась (подсветилась, сменила фон, нарисовалась рамка, ...), а по второму клику (не обязательно в эту же ячейку) выделение убралось?
При ресайзе формы должно все сохраняться как перед ресайзом.


procedure Tfrm.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 bm        : TBitmap;
begin
 if (ARow mod 2) = 0 then DrawGrid1.Tag := 0   // четная строка
                     else DrawGrid1.Tag := 1;  // нечетная строка
 with Sender as TDrawGrid, Canvas do begin
   Brush.Color := clGray;
   if (ACol mod 2) = 0 then  // четная колонка
     if DrawGrid1.Tag = 0
       then Brush.Color := clScrollBar
       else Brush.Color := clGray
   else                      // нечетная колонка
     if DrawGrid1.Tag = 0
       then Brush.Color := clGray
       else Brush.Color := clScrollBar;

   FillRect(CellRect(ACol,ARow));

   bm := TBitmap.Create;
   try

// здесь идет проверка, из какого файла картинку грузить в ячейку
// ...

     bm.LoadFromFile("имя файла bmp");
     with bm do begin
         Transparent := True;
         TransParentColor := clWhite;
         TransparentMode := tmAuto;
         StretchDraw(CellRect(ACol,ARow),bm);
     end;
   finally
     bm.Free;
   end;
 end;
end;

procedure TfrmGame.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
 // if первый раз кликнули на ячейку then
// tmpTag - глобальная переменная
     tmpTag := 1;
 // else
     tmpTag := 0;
end;


 
{RASkov} ©   (2008-10-17 13:19) [1]

> if (ARow mod 2) = 0 then DrawGrid1.Tag := 0   // четная
> строка                     else DrawGrid1.Tag := 1;  // нечетная
> строка

TComponent(Sender).Tag:=Ord(Odd(ARow));

> а по второму клику (не обязательно в эту же ячейку) выделение убралось

Что это значит? Т.е. нужно сделать так, что ни одна ячейка не выделена была?


 
Андрей   (2008-10-17 13:23) [2]


> Что это значит? Т.е. нужно сделать так, что ни одна ячейка
> не выделена была?


да (конечно, все, что в них находится должно остаться :) )


 
{RASkov} ©   (2008-10-20 12:38) [3]

Может что нибудь нечто так:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Grids, StdCtrls;

type
 TForm1 = class(TForm)
   DrawGrid1: TDrawGrid;
   procedure DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
     Rect: TRect; State: TGridDrawState);
   procedure DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
     var CanSelect: Boolean);
   procedure FormCreate(Sender: TObject);
 private { Private declarations }
 public { Public declarations }
 end;

var Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 DrawGrid1.Tag:=-1;
end;

procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
 if gdFixed in State then Exit;
 with TDrawGrid(Sender) do begin
  if (ACol=LoWord(Tag)) and (ARow=HiWord(Tag)) then Canvas.Brush.Color:=clRed
   else Canvas.Brush.Color:=Color;
  Canvas.FillRect(Rect);
 end;
end;

procedure TForm1.DrawGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
begin
 with TDrawGrid(Sender) do begin
  if (ACol<>LoWord(Tag)) or (ARow<>HiWord(Tag)) then Tag:=MakeLong(ACol, ARow) else
   if Tag=-1 then Tag:=MakeLong(ACol, ARow) else Tag:=-1;
 end;
end;

end.

А сколько ячеек/колонок в твоем гриде? Но думаю, шаманство с тэгом с "запихиванием" в него двух значений - прокатит.... :)


 
Андрей   (2008-10-22 12:17) [4]

сделал все гораздо проще:
if (gdSelected in State) and (DrawGrid1.Tag=1)
 then FrameRect(CellRect(vFromCol,vFromRow));


 
brother ©   (2008-10-22 12:19) [5]

> сделал все гораздо проще:
> if (gdSelected in State) and (DrawGrid1.Tag=1)
> then FrameRect(CellRect(vFromCol,vFromRow));

молодец! Садись, 5!


 
Андрей   (2008-10-24 18:02) [6]

Сделал, кстати, по совету из "Королевства Делфи", пока сайт "Мастеров" не грузился в течении пары дней.
Все равно спасибо всем, кто откликнулся.


 
Leonid Troyanovsky ©   (2008-10-24 18:14) [7]


> Андрей   (24.10.08 18:02) [6]

> Все равно спасибо всем, кто откликнулся.

Ну, раз все равно, то вот тебе еще один совет в качестве бонуса:
никогда не прячь фокус.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2008.12.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1225199547
Михаил2
2008-10-28 16:12
2008.12.07
Turbo Pascal + засечь время исполнения


3-1210962405
kvp
2008-05-16 22:26
2008.12.07
Yaffil: Долго открывается таблица


2-1225379220
D7
2008-10-30 18:07
2008.12.07
Drag and Drop Component Suite


2-1225178385
ther
2008-10-28 10:19
2008.12.07
Создание компонентов на главнойформе из dll


2-1224966934
Kolan
2008-10-26 00:35
2008.12.07
Однообразная работа с TComboBox и TListBox.