-
Сабж. Допустим надо запретить редактировать 2ю колонку, фокус запретить может.. пробовал так:
function TForm1.StGrd14Message(var Msg: tagMSG; var Rslt: Integer): Boolean; begin result:=false; if (msg.message=WM_SETFOCUS) then result:=true; end;
Но вообще не реагирует, фокус ставится
-
procedure TForm1.StGrd1SelectCell(Sender: PControl; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if ACol=2 then
CanSelect:=False;
end; ???
-
Спасибо :) я и забыл про CanSelect.. На форме 2 стринггрида, и когда в 1м активно поле ввода, я мышкой делаю дабл клик по 2му гриду, в нем тоже ячейка становится активной для ввода, но и у 1го грида ячейка для ввода остается активна. Как мне сделать, чтоб не было 2х ячеек для ввода, точнее как мне убрать программно ненужную ячейку для ввода из неактивного грида?
-
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); 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;
Подойдет?
-
Compiler, огромное спасибо. Только вопрос: если эдит в фокусе, то можно ли перемещаться вверх-вниз по ячейкам, крутя колесо мыши, чтоб сам эдит при этом тоже ездил вверх-вниз?
-
Можно. Вот код работает с глюком, при подходе эдита к самому верху застряет чуток. Поправишь сам. 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;
-
Заменить > 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; и эдит ездит вроде норматьно
-
Еще раз благодарю, только иногда при частом щелкании по ячейкам и беспорядочном кручении колеса, свободное пространство грида заливается черным цветом, а при следующем клике грид рисуется в левом верхнем углу монитора, ну и глюки конкретные, даже весь монитор 1 раз полностью черным залило :)
-
|