Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
2-1260172706
uniken1
2009-12-07 10:58
2010.01.31
RichEdit и RTF с картинками


1-1235936478
Cobalt
2009-03-01 22:41
2010.01.31
Ограничение "mailto:" на размер &amp;subj ?


3-1234091593
Booo
2009-02-08 14:13
2010.01.31
Ошибка


6-1211636100
may be I am noob...
2008-05-24 17:35
2010.01.31
Подключение


15-1259084165
Anatoly Podgoretsky
2009-11-24 20:36
2010.01.31
Анонс статьи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский