Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.07;
Скачать: [xml.tar.bz2];

Вниз

Выделение ячейкив 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.005 c
15-1223209888
Dez3uk
2008-10-05 16:31
2008.12.07
таблицы в Word и Exel


15-1223278720
tubik
2008-10-06 11:38
2008.12.07
поделитесь книгой, пожалуйста


11-1196160842
Vinum
2007-11-27 13:54
2008.12.07
Как отловить нажатие клавиш влево-вправо на KOL-форме


15-1223008024
KSergey
2008-10-03 08:27
2008.12.07
Истерия "мирового кризиса"


2-1225283336
Кирей
2008-10-29 15:28
2008.12.07
консольные команды Windows





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский