Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как у стринггриду запретить редактировать определенные ячейки


Vinum ©   (2008-05-15 21:41:00) 

Сабж.
Допустим надо запретить редактировать 2ю колонку, фокус запретить может..
пробовал так:

function TForm1.StGrd14Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
result:=false;
if (msg.message=WM_SETFOCUS) then result:=true;
end;

Но вообще не реагирует, фокус ставится


Compiler   (2008-05-17 20:10:00) [1]

Попробуй заменить все FillRect на
Cnv.Brush.Color:=Нужный цвет;
Cnv.FillRect(Rect);

или попробуй Grid от mdv
http://www.kolnmck.ru/files/components/controls/kolmdvcontrols.7z


Vinum   (2008-05-17 15:27:00) [2]

Еще раз благодарю, только иногда при частом щелкании по ячейкам и беспорядочном кручении колеса, свободное пространство грида заливается черным цветом, а при следующем клике грид рисуется в левом верхнем углу монитора, ну и глюки конкретные, даже весь монитор 1 раз полностью черным залило :)


Compiler   (2008-05-17 13:21:00) [3]

Заменить
> if (goEditing in StGrd1.Options)and(gdSelected in State)
> and (Moved) then
> begin
> Editbox1.BoundsRect:=Rect;
> end;
>
> if (goEditing in StGrd1.Options)and(gdFocused in State)
> and (Moved) then
> begin
> Editbox1.BoundsRect:=Rect;
> EditBox1.Show;
> end;


на
if (goEditing in PStGrd(Sender).Options)and(gdSelected in State) and (Moved) then
begin
 Editbox1.BoundsRect:=Rect;
end;

if (goEditing in PStGrd(Sender).Options)and(gdFocused in State) and (Moved) then
begin
 Editbox1.BoundsRect:=Rect;
 EditBox1.Show;
end;

if (goEditing in PStGrd(Sender).Options) and (gdFixed in State) and (Moved) then
   EditBox1.Hide;
end;

и эдит ездит вроде норматьно


Compiler   (2008-05-17 13:03:00) [4]

Можно. Вот код работает с глюком, при подходе эдита к самому верху застряет чуток. Поправишь сам.

goEditing у Grid'ов поставь в TRUE
var
 ActiveTag:integer;
 Moved:Boolean;

function TForm1.StGrd1Message(var Msg: tagMSG; var Rslt: Integer): Boolean;
begin
Result:=False;
case msg.message of
WM_MOUSEWHEEL:
begin
if msg.wParam<0 then
   SendMessage(Msg.hwnd,WM_VSCROLL,1,0)
else
   SendMessage(Msg.hwnd,WM_VSCROLL,0,0);
Result:=True;
end;

WM_VSCROLL,WM_HSCROLL:
 EditBox1.Hide;
end;
end;

procedure MoveEdit(R:Trect);
begin
with Form1^ do
begin
  Editbox1.Left := R.Left + 1;
  Editbox1.Top := R.Top + 1;
  Editbox1.Width := (R.Right + 1) - R.Left-2;
  Editbox1.Height := (R.Bottom + 1) - R.Top-2;
  end;
end;

procedure TForm1.StGrd1SelectCell(Sender: PControl; ACol, ARow: Integer;
 var CanSelect: Boolean);
var R:Trect;
begin
if (editbox1<>nil)and Canselect Then
begin
 EditBox1.Hide;
 EditBox1.BoundsRect:=PStGrd(Sender).CellRect(acol,arow);
 EditBox1.Text:=PStGrd(Sender).Cells[acol,arow];
 Moved:=False;
end;
end;

procedure TForm1.StGrd1DrawCell(Sender: PControl; Cnv: PCanvas; ACol,
 ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
FillRect(Cnv.Handle,Rect,CreateSolidBrush(ClWhite));
SetBkMode(cnv.Handle,TRANSPARENT);
if gdFocused in State then
begin
  FillRect(Cnv.Handle,Rect,CreateSolidBrush(RGB(76,76,162)));
  DrawFocusRect(Cnv.Handle,Rect);
end ;
if gdFixed in State then
  FillRect(Cnv.Handle,Rect,GetSysColorBrush(COLOR_BTNFACE));
Cnv.DrawText(PStGrd(Sender).Cells[ACol,ARow],Rect,DT_LEFT or DT_NOPREFIX or DT_VCENTER);

if (goEditing in StGrd1.Options)and(gdSelected in State) and (Moved) then
begin
 Editbox1.BoundsRect:=Rect;
end;

if (goEditing in StGrd1.Options)and(gdFocused in State) and (Moved) then
begin
 Editbox1.BoundsRect:=Rect;
 EditBox1.Show;
end;
end;

function TForm1.EditBox1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
Result:=False;
case msg.message of
WM_CHAR :
if msg.wParam=13 then
begin
Editbox1.Hide;
Moved:=False;
if ActiveTag=1 then
begin
  StGrd1.Cells[StGrd1.Col, StGrd1.Row] := EditBox1.Text;
  SetFocus(StGrd1.handle);
end;
if ActiveTag=2 then
begin
  StGrd2.Cells[StGrd2.Col, StGrd2.Row] := EditBox1.Text;
  SetFocus(StGrd2.handle);
end;
Result:=True;
end;
end;
end;

procedure TForm1.StGrd1MouseDblClk(Sender: PControl;
 var Mouse: TMouseEventData);
var R:Trect;
begin
if PstGrd(Sender).Col<>1 then
 begin
  ActiveTag:=Sender.Tag;
  EditBox1.Parent:=Sender;
  R := PstGrd(Sender).CellRect(PstGrd(Sender).Col, PstGrd(Sender).Row);
  MoveEdit(R);
  Editbox1.Text:=PstGrd(Sender).Cells[PstGrd(Sender).Col,PstGrd(Sender).row];
  Editbox1.Show;
  Moved:=True;
  end;
end;

procedure TForm1.KOLFormFormCreate(Sender: PObj);
begin
EditBox1.Height:= StGrd1.DefaultRowHeight;
EditBox1.Hide;
ActiveTag:=-1;
end;


Vinum   (2008-05-16 22:55:00) [5]

Compiler, огромное спасибо. Только вопрос: если эдит в фокусе, то можно ли перемещаться вверх-вниз по ячейкам, крутя колесо мыши, чтоб сам эдит при этом тоже ездил вверх-вниз?


Compiler   (2008-05-16 17:10:00) [6]

DefaultDrawing:=False у обоих Grid'ов
Tag:=1 у первого и Tag:=2 у второго Grid'а
Процедуры назначаются для обоих Grid'ов


var
 ActiveTag:integer=0;
procedure TForm1.StGrd1SelectCell(Sender: PControl; ACol, ARow: Integer;
 var CanSelect: Boolean);
begin
 Editbox1.Visible:=False;
end;

procedure TForm1.StGrd1DrawCell(Sender: PControl; Cnv: PCanvas; ACol,
 ARow: Integer; Rect: TRect; State: TGridDrawState);
begin
FillRect(Cnv.Handle,Rect,CreateSolidBrush(ClWhite));
SetBkMode(cnv.Handle,TRANSPARENT);
if gdFocused in State then
begin
  FillRect(Cnv.Handle,Rect,CreateSolidBrush(RGB(76,76,162)));
  DrawFocusRect(Cnv.Handle,Rect);
end ;
if gdFixed in State then
  FillRect(Cnv.Handle,Rect,GetSysColorBrush(COLOR_BTNFACE));
Cnv.DrawText(PStGrd(Sender).Cells[ACol,ARow],Rect,DT_LEFT or DT_NOPREFIX or DT_VCENTER); //or DT_SINGLELINE);
end;

function TForm1.EditBox1Message(var Msg: tagMSG;
 var Rslt: Integer): Boolean;
begin
Result:=False;
if msg.message=WM_CHAR then
if msg.wParam=13 then
begin
Editbox1.Visible := False;
if ActiveTag=1 then
begin
  StGrd1.Cells[StGrd1.Col, StGrd1.Row] := EditBox1.Text;
  SetFocus(StGrd1.handle);
end;
if ActiveTag=2 then
begin
  StGrd2.Cells[StGrd2.Col, StGrd2.Row] := EditBox1.Text;
  SetFocus(StGrd2.handle);
end;
Result:=True;
end;
end;

procedure TForm1.StGrd1MouseDblClk(Sender: PControl;
 var Mouse: TMouseEventData);
var R:Trect;
begin
if PstGrd(Sender).Col<>1 then
 begin
  ActiveTag:=Sender.Tag;
  R := PstGrd(Sender).CellRect(PstGrd(Sender).Col, PstGrd(Sender).Row);
  R.Left := R.Left + PstGrd(Sender).Left;
  R.Right := R.Right + PstGrd(Sender).Left; R.Top := R.Top + PstGrd(Sender).Top;
  R.Bottom := R.Bottom + PstGrd(Sender).Top;
  Editbox1.Left := R.Left + 1;
  Editbox1.Top := R.Top + 1;
  Editbox1.Width := (R.Right + 1) - R.Left-2;
  Editbox1.Height := (R.Bottom + 1) - R.Top-2;
  Editbox1.Text:=PstGrd(Sender).Cells[PstGrd(Sender).Col,PstGrd(Sender).row];
  Editbox1.Visible := True;
  SetFocus(Editbox1.Handle);
  end;
end;

Подойдет?


Vinum   (2008-05-16 00:33:00) [7]

Спасибо :) я и забыл про CanSelect..
На форме 2 стринггрида, и когда в 1м активно поле ввода, я мышкой делаю дабл клик по 2му гриду, в нем тоже ячейка становится активной для ввода, но и у 1го грида ячейка для ввода остается активна. Как мне сделать, чтоб не было 2х ячеек для ввода, точнее как мне убрать программно ненужную ячейку для ввода из неактивного грида?


Compiler   (2008-05-16 00:19:00) [8]


procedure TForm1.StGrd1SelectCell(Sender: PControl; ACol, ARow: Integer;
 var CanSelect: Boolean);
begin
if ACol=2 then
   CanSelect:=False;
end;


???


Наверх

Титульная страница Поиск, карта сайта Написать письмо