![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщение TStringGrid что закончили редактировать ячейку, есть?
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.
И впрям :)