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

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

Сообщение TStringGrid что закончили редактировать ячейку, есть?


Страницы:   1 2

Kolan ©   (2007-06-16 09:56:00) 

OnSetEditTextнеподходит, так как возникает при редактировании постоянно(на каждое нажатие кнопки).
Можно ли как-то получить сообщение(событие) что редактирование закончено?


Kolan   (2007-06-16 21:20:00) [1]


> Разве там не будет старое значение(не редактированое)?

То есть вопрос — А когда оно возникает?
ЗЫ
 В справке сказано, что оно возникает при получении фокуса ввода…


Kolan   (2007-06-16 21:00:00) [2]

> а координаты ячейки меняются в процессе редактирования?

Нет ессно.


sniknik   (2007-06-16 17:58:00) [3]

> Разве там не будет старое значение(не редактированое)?
а координаты ячейки меняются в процессе редактирования?


sniknik   (2007-06-16 17:56:00) [4]

> TheGrid := Grid as TExtStringGrid;
>   if Assigned(TheGrid.OnEndEdit) then
>     TheGrid.OnEndEdit(Grid, TheGrid.Col, TheGrid.Row, Text);


зачем лишняя переменная?

 with TExtStringGrid(Grid) do
   if Assigned(OnEndEdit) then
     OnEndEdit(Grid, Col, Row, Text);


Kolan   (2007-06-16 17:52:00) [5]

> кстати значения лучше запоминать заранее, на WM_SETFOCUS
> например

Только логику не понял. Сначала if Message.Msg = WM_SETFOCUS  thenсохроняю, так?
Разве там не будет старое значение(не редактированое)?


Kolan   (2007-06-16 17:49:00) [6]

> кстати значения лучше

Решение опередило вопрос :)


Kolan   (2007-06-16 17:49:00) [7]

Ошибочка закралась :(

Так я сделал:
procedure TExtInplaceEdit.WndProc(var Message: TMessage);
var
 TheGrid: TExtStringGrid;
begin
if Message.Msg = WM_KILLFOCUS then
begin
  TheGrid := Grid as TExtStringGrid;
  if Assigned(TheGrid.OnEndEdit) then
    TheGrid.OnEndEdit(Grid, TheGrid.Col, TheGrid.Row, Text);
end;
inherited;
end;


Если выбрана ячейка 1, я редактирую, икликаю на ячейке 2, то событие возникае два раза.
С Row = 1 b Row = 2

PS
Колонок я сделал 1…


sniknik   (2007-06-16 17:48:00) [8]

кстати значения лучше запоминать заранее, на WM_SETFOCUS например, т.к. на момент WM_KILLFOCUS оно уже изменено на ту ячейку на которую переход (если конечно выход не ентером), проверил только что.


Kolan   (2007-06-16 17:40:00) [9]

Хех — работает, благодарю sniknik.


sniknik   (2007-06-16 17:38:00) [10]

из грида вестимо... у тебя же есть доступ к Grid.


Kolan   (2007-06-16 17:29:00) [11]

> [21] sniknik ©   (16.06.07 17:09)


> это вместо if assigned(Grid.onEndEdit) then Grid.onEndEdit(Grid)
> ;

Вот тут еще бы ACol и ARow в onEndEdit передать, откуда их взять?


Kolan   (2007-06-16 17:14:00) [12]

Все, понятно пойду сделаю. Я пожалуй сделаю компонент…


{RASkov}   (2007-06-16 17:13:00) [13]

Впрочем у меня тоже была мысль типа как в [21] но некогда с ней сейчас... :)
Так что лучше глянь в сторону [21], а не [23] :)


{RASkov}   (2007-06-16 17:11:00) [14]

procedure TForm1.DoCellAfterEdit(const S: String);
begin
 ShowMessage(S);
end;

procedure TForm1.StringGrid1KeyDown(Sender: TObject; var Key: Word;
 Shift: TShiftState);
begin
 if StringGrid1.EditorMode then
 case Key of
  VK_RETURN, VK_UP, VK_DOWN:
  DoCellAfterEdit(StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]);
 end;
end;


Это если по ентеру или "стрелками".... а если мышкой, то нужно еще подумать.... :)


> [8] Kolan ©   (16.06.07 14:35)

Спасибо.... попозже гляну.... сейчас некогда (.... убегаю.


sniknik   (2007-06-16 17:11:00) [15]

> Посмотрел метод Hide, и HideEdit — они не виртуальные.
ну так это если переписывать (просто скопировать модуль грида к себе в проект, прям там и писать)

но зато там видно что вызывается смена фокуса... см. up. для другого варианта.


sniknik   (2007-06-16 17:09:00) [16]

в обшем получается так (без оформления в компонент, и без "красоты" с оформлением собственно события onEndEdit), т.е. только смысл, но уже рабочий...

type
 TMyInpEdit = class(TInplaceEdit)
 protected
   procedure WndProc(var Message: TMessage); override;
 end;

 TMyStrGrid = class(TStringGrid)
 protected
   function CreateEditor: TInplaceEdit; override;
 end;

 TStringGrid = class(TMyStrGrid); //это чтобы использовать "стандартный" но уже с нашими включениями

 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   ...
 end;

implementation

procedure TMyInpEdit.WndProc(var Message: TMessage);
begin
 if Message.Msg = WM_KILLFOCUS then
     Form1.Memo1.Lines.Add(IntToStr(Message.Msg)); //это вместо if assigned(Grid.onEndEdit) then Grid.onEndEdit(Grid); просто показать наше событие
 inherited WndProc(Message);
end;

function TMyStrGrid.CreateEditor: TInplaceEdit;
begin
 Result:= TMyInpEdit.Create(Self);
end;


все в общем то.


Kolan   (2007-06-16 17:08:00) [17]

> и в нем его вызывать

Посмотрел метод Hide, и HideEdit — они не виртуальные.


> и в нем его вызывать

Вот это я не поял что вызывать в нем?


Kolan   (2007-06-16 16:32:00) [18]

> sniknik ©

Шас буду делать :)


sniknik   (2007-06-16 16:25:00) [19]

> Когда жму Enter, то из редактирования выхожу
вызывается TInplaceEdit.Hide;, ты выходишь из ячейки редактирования, фокус передается гриду.

т.е. можно просто определить (если делать свой компонент на замену) свойство типа onEndEdit (которому будет присваиваться процедура события), и в нем его вызывать (как обычно у компонент и сделано).


Kolan   (2007-06-16 15:34:00) [20]

> значит не закончил раз остался, тк и через полчаса случайно
> нажатая кнопка это продолжение редактирования…

Нет. У вас СтрингГрид не перед глазами просто. Когда жму Enter, то из редактирования выхожу, но ячейка ТАЖЕ САМАЯ отсается. Мне по логике нужно именно ОКОНЧАНИЕ РЕДАКТИРОВАНИЯ, а не смена ячейки.


> дельфи поставляется с исходниками VCL.

И впрям… :)


Страницы:   1 2

Наверх

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