Конференция "KOL" » Как у стринггриду запретить редактировать определенные ячейки
 
  • Vinum (15.05.08 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 © (16.05.08 00:19) [1]

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



    ???
  • Vinum (16.05.08 00:33) [2]
    Спасибо :) я и забыл про CanSelect..
    На форме 2 стринггрида, и когда в 1м активно поле ввода, я мышкой делаю дабл клик по 2му гриду, в нем тоже ячейка становится активной для ввода, но и у 1го грида ячейка для ввода остается активна. Как мне сделать, чтоб не было 2х ячеек для ввода, точнее как мне убрать программно ненужную ячейку для ввода из неактивного грида?
  • Compiler © (16.05.08 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 (16.05.08 22:55) [4]
    Compiler, огромное спасибо. Только вопрос: если эдит в фокусе, то можно ли перемещаться вверх-вниз по ячейкам, крутя колесо мыши, чтоб сам эдит при этом тоже ездил вверх-вниз?
  • Compiler © (17.05.08 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 © (17.05.08 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 (17.05.08 15:27) [7]
    Еще раз благодарю, только иногда при частом щелкании по ячейкам и беспорядочном кручении колеса, свободное пространство грида заливается черным цветом, а при следующем клике грид рисуется в левом верхнем углу монитора, ну и глюки конкретные, даже весь монитор 1 раз полностью черным залило :)
  • Compiler © (17.05.08 20:10) [8]
    Попробуй заменить все FillRect на
    Cnv.Brush.Color:=Нужный цвет;
    Cnv.FillRect(Rect);


    или попробуй Grid от mdv
    http://www.kolnmck.ru/files/components/controls/kolmdvcontrols.7z
 
Конференция "KOL" » Как у стринггриду запретить редактировать определенные ячейки
Есть новые Нет новых   [134431   +15][b:0][p:0.007]