Форум: "KOL";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];
ВнизКак у стринггриду запретить редактировать определенные ячейки Найти похожие ветки
← →
Vinum (2008-05-15 21:41) [0]Сабж.
Допустим надо запретить редактировать 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-16 00:19) [1]
procedure TForm1.StGrd1SelectCell(Sender: PControl; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if ACol=2 then
CanSelect:=False;
end;
???
← →
Vinum (2008-05-16 00:33) [2]Спасибо :) я и забыл про CanSelect..
На форме 2 стринггрида, и когда в 1м активно поле ввода, я мышкой делаю дабл клик по 2му гриду, в нем тоже ячейка становится активной для ввода, но и у 1го грида ячейка для ввода остается активна. Как мне сделать, чтоб не было 2х ячеек для ввода, точнее как мне убрать программно ненужную ячейку для ввода из неактивного грида?
← →
Compiler © (2008-05-16 17:10) [3]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 22:55) [4]Compiler, огромное спасибо. Только вопрос: если эдит в фокусе, то можно ли перемещаться вверх-вниз по ячейкам, крутя колесо мыши, чтоб сам эдит при этом тоже ездил вверх-вниз?
← →
Compiler © (2008-05-17 13:03) [5]Можно. Вот код работает с глюком, при подходе эдита к самому верху застряет чуток. Поправишь сам.
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;
← →
Compiler © (2008-05-17 13:21) [6]Заменить
> 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;
и эдит ездит вроде норматьно
← →
Vinum (2008-05-17 15:27) [7]Еще раз благодарю, только иногда при частом щелкании по ячейкам и беспорядочном кручении колеса, свободное пространство грида заливается черным цветом, а при следующем клике грид рисуется в левом верхнем углу монитора, ну и глюки конкретные, даже весь монитор 1 раз полностью черным залило :)
← →
Compiler © (2008-05-17 20:10) [8]Попробуй заменить все FillRect на
Cnv.Brush.Color:=Нужный цвет;
Cnv.FillRect(Rect);
или попробуй Grid от mdv
http://www.kolnmck.ru/files/components/controls/kolmdvcontrols.7z
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2010.01.31;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.005 c