Форум: "Начинающим";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
ВнизСообщение TStringGrid что закончили редактировать ячейку, есть? Найти похожие ветки
← →
Kolan © (2007-06-16 09:56) [0]
OnSetEditText
неподходит, так как возникает при редактировании постоянно(на каждое нажатие кнопки).
Можно ли как-то получить сообщение(событие) что редактирование закончено?
← →
sniknik © (2007-06-16 10:13) [1]вряд ли... попробуй сам придумать (и выразить словами) когда считать что редактирование закончилось. (???) ну например если ничего не нажимали 3 мин, так чтоли? а автор отошел покурить (вот он, еще один неявный вред курения ;о))), вернулся через полчаса и продолжил набивать с половины слова.
в общем давай, предлагай, какая должна быть логика возникновения этого события?
← →
Kolan © (2007-06-16 13:31) [2]> и выразить словами
1. Вот я выбрал ячейку и еще не начал редактировать. Ячейка выбрана но не могу редактировать.
2. Жму на нее еще раз текст становится доступным для редактирования.
3. Редактирую сколько влезит.
4. Нажимаю Enter/перехожу на другую ячейку(те в текст снова стал НЕ доступен для редактирования). И вот тут мне и нужно об этом узнать…
← →
{RASkov} © (2007-06-16 13:54) [3]> [2] Kolan © (16.06.07 13:31)
В таких случаях, когда не совсем понятен какой обработчик мне нужен, я поступаю так:
Создаю "подозреваемые" обработчики типа так
procedure TForm.StringGridSetEditText();
begin
ShowMessage("StringGridSetEditText");
end;
И вылавливаю потом нужные
:)
← →
Kolan © (2007-06-16 14:00) [4]> SetEditText
Не годится он. И имхо нужного вообще нет, я спрашиваю как можно достич нужного.
Смысл необходимости вот в чем:
Есть строка.S1
— это модель.
Её отображаю в ячейке StringGrid — это view.
Если ячейку изменяют, то изменяется и строкаS1
.
И когда изменяется S1, то она говорит я изменилась — рисуйте меня и её рисуют в ячейки грида.
Так вот если использоватьSetEditText
такая синхронизация происходит постоянно, на каждом нажатии клавиши.
← →
Kolan © (2007-06-16 14:03) [5]> {RASkov} ©
ЗЫ 0 версия готова почти показать? Куда слать?
← →
{RASkov} © (2007-06-16 14:06) [6]> [5] Kolan © (16.06.07 14:03)
← →
Kolan © (2007-06-16 14:14) [7]> [6] {RASkov} © (16.06.07 14:06)
> > [5] Kolan © (16.06.07 14:03)
Ок, шас вот эту проблему победу, а то редактировать противно.
← →
Kolan © (2007-06-16 14:35) [8]> {RASkov}
Отослал…
← →
Loginov Dmitry © (2007-06-16 14:46) [9]Подставляй TEdit. Об окончании редактирования будет сигнализировать его событие OnExit;
← →
Kolan © (2007-06-16 14:47) [10]> Подставляй TEdit.
Хех еще посоветуй сделать сетку из N эдитов :)… Есть же возможность редактировать прям ячейку…
← →
Loginov Dmitry © (2007-06-16 14:54) [11]> Есть же возможность редактировать прям ячейку
Ну она редактируется с помощью InplaceEditor"a - тот же TEdit, только гибкости - 0. А если хочется чего-то путного, то приемлемый выход - подстановка контролов.
← →
Kolan © (2007-06-16 15:00) [12]> InplaceEditor"a — тот же TEdit
Да, незнал…
Тогда подробнее можно.
Когда показывать Edit и как вычислить его кординаты?
← →
sniknik © (2007-06-16 15:14) [13]> Нажимаю Enter/перехожу на другую ячейку
так тебе получается нужно событие выхода из ячейки?, а вовсе не завершение редактирования.
такого тоже вроде нет, но можно сделать..., возможно, посмотреть как тот самый InplaceEditor работает, и использовать его события, уничтожения (если он на каждое редактирование создается/уничтожается), либо другое если там както по другому организовано.
подставлять свой эдит тоже можно, но не так интересно...
← →
Loginov Dmitry © (2007-06-16 15:19) [14]Пример с использованием TEdit:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
StringGrid1: TStringGrid;
procedure StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
var Value: String);
procedure Edit1Exit(Sender: TObject);
procedure Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol,
ARow: Integer; var Value: String);
var
ARect: TRect;
begin
ARect := StringGrid1.CellRect(ACol, ARow);
ARect.TopLeft := ScreenToClient(StringGrid1.ClientToScreen(ARect.TopLeft));
ARect.BottomRight := ScreenToClient(StringGrid1.ClientToScreen(ARect.BottomRight));
Edit1.BoundsRect := ARect;
Edit1.Text := StringGrid1.Cells[ACol, ARow];
Edit1.Visible := True;
Edit1.BringToFront;
Edit1.SetFocus;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row] := Edit1.Text;
Edit1.Visible := False;
StringGrid1.SetFocus;
end;
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
Edit1.OnExit(nil);
Key := 0;
end;
end;
end.
← →
Kolan © (2007-06-16 15:25) [15]> а вовсе не завершение редактирования
Ну как я закончил редактировать, но остался в той же ячейке.
> посмотреть как тот самый InplaceEditor
А хде его смотреть?
> Пример с использованием TEdit:
Щас поглядим… :)
← →
sniknik © (2007-06-16 15:30) [16]> Ну как я закончил редактировать, но остался в той же ячейке.
значит не закончил раз остался, тк и через полчаса случайно нажатая кнопка это продолжение редактирования...
либо приводи логику для "остался", т.к. то что в [2] это выход.
> А хде его смотреть?
дельфи поставляется с исходниками VCL.
← →
Kolan © (2007-06-16 15:34) [17]> значит не закончил раз остался, тк и через полчаса случайно
> нажатая кнопка это продолжение редактирования…
Нет. У вас СтрингГрид не перед глазами просто. Когда жмуEnter
, то из редактирования выхожу, но ячейка ТАЖЕ САМАЯ отсается. Мне по логике нужно именно ОКОНЧАНИЕ РЕДАКТИРОВАНИЯ, а не смена ячейки.
> дельфи поставляется с исходниками VCL.
И впрям… :)
← →
sniknik © (2007-06-16 16:25) [18]> Когда жму Enter, то из редактирования выхожу
вызывается TInplaceEdit.Hide;, ты выходишь из ячейки редактирования, фокус передается гриду.
т.е. можно просто определить (если делать свой компонент на замену) свойство типа onEndEdit (которому будет присваиваться процедура события), и в нем его вызывать (как обычно у компонент и сделано).
← →
Kolan © (2007-06-16 16:32) [19]> sniknik ©
Шас буду делать :)
← →
Kolan © (2007-06-16 17:08) [20]> и в нем его вызывать
Посмотрел метод Hide, и HideEdit — они не виртуальные.
> и в нем его вызывать
Вот это я не поял что вызывать в нем?
← →
sniknik © (2007-06-16 17:09) [21]в обшем получается так (без оформления в компонент, и без "красоты" с оформлением собственно события 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;
все в общем то.
← →
sniknik © (2007-06-16 17:11) [22]> Посмотрел метод Hide, и HideEdit — они не виртуальные.
ну так это если переписывать (просто скопировать модуль грида к себе в проект, прям там и писать)
но зато там видно что вызывается смена фокуса... см. up. для другого варианта.
← →
{RASkov} © (2007-06-16 17:11) [23]
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)
Спасибо.... попозже гляну.... сейчас некогда (.... убегаю.
← →
{RASkov} © (2007-06-16 17:13) [24]Впрочем у меня тоже была мысль типа как в [21] но некогда с ней сейчас... :)
Так что лучше глянь в сторону [21], а не [23] :)
← →
Kolan © (2007-06-16 17:14) [25]Все, понятно пойду сделаю. Я пожалуй сделаю компонент…
← →
Kolan © (2007-06-16 17:29) [26]> [21] sniknik © (16.06.07 17:09)
> это вместо if assigned(Grid.onEndEdit) then Grid.onEndEdit(Grid)
> ;
Вот тут еще бы ACol и ARow в onEndEdit передать, откуда их взять?
← →
sniknik © (2007-06-16 17:38) [27]из грида вестимо... у тебя же есть доступ к Grid.
← →
Kolan © (2007-06-16 17:40) [28]Хех — работает, благодарю sniknik.
← →
sniknik © (2007-06-16 17:48) [29]кстати значения лучше запоминать заранее, на WM_SETFOCUS например, т.к. на момент WM_KILLFOCUS оно уже изменено на ту ячейку на которую переход (если конечно выход не ентером), проверил только что.
← →
Kolan © (2007-06-16 17:49) [30]Ошибочка закралась :(
Так я сделал: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…
← →
Kolan © (2007-06-16 17:49) [31]> кстати значения лучше
Решение опередило вопрос :)
← →
Kolan © (2007-06-16 17:52) [32]> кстати значения лучше запоминать заранее, на WM_SETFOCUS
> например
Только логику не понял. Сначалаif Message.Msg = WM_SETFOCUS then
сохроняю, так?
Разве там не будет старое значение(не редактированое)?
← →
sniknik © (2007-06-16 17:56) [33]> 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);
← →
sniknik © (2007-06-16 17:58) [34]> Разве там не будет старое значение(не редактированое)?
а координаты ячейки меняются в процессе редактирования?
← →
Kolan © (2007-06-16 21:00) [35]> а координаты ячейки меняются в процессе редактирования?
Нет ессно.
← →
Kolan © (2007-06-16 21:20) [36]
> Разве там не будет старое значение(не редактированое)?
То есть вопрос — А когда оно возникает?
ЗЫ
В справке сказано, что оно возникает при получении фокуса ввода…
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.041 c