![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сообщение TStringGrid что закончили редактировать ячейку, есть?
Kolan © (2007-06-16 09:56:00)
OnSetEditTextнеподходит, так как возникает при редактировании постоянно(на каждое нажатие кнопки).
Можно ли как-то получить сообщение(событие) что редактирование закончено?
sniknik (2007-06-16 15:30:00) [21]> Ну как я закончил редактировать, но остался в той же ячейке.
значит не закончил раз остался, тк и через полчаса случайно нажатая кнопка это продолжение редактирования...
либо приводи логику для "остался", т.к. то что в [2] это выход.
> А хде его смотреть?
дельфи поставляется с исходниками VCL.
Kolan (2007-06-16 15:25:00) [22]> а вовсе не завершение редактирования
Ну как я закончил редактировать, но остался в той же ячейке.
> посмотреть как тот самый InplaceEditor
А хде его смотреть?
> Пример с использованием TEdit:
Щас поглядим :)
Loginov Dmitry (2007-06-16 15:19:00) [23]Пример с использованием 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.
sniknik (2007-06-16 15:14:00) [24]> Нажимаю Enter/перехожу на другую ячейку
так тебе получается нужно событие выхода из ячейки?, а вовсе не завершение редактирования.
такого тоже вроде нет, но можно сделать..., возможно, посмотреть как тот самый InplaceEditor работает, и использовать его события, уничтожения (если он на каждое редактирование создается/уничтожается), либо другое если там както по другому организовано.
подставлять свой эдит тоже можно, но не так интересно...
Kolan (2007-06-16 15:00:00) [25]> InplaceEditor'a тот же TEdit
Да, незнал
Тогда подробнее можно.
Когда показывать Edit и как вычислить его кординаты?
Loginov Dmitry (2007-06-16 14:54:00) [26]> Есть же возможность редактировать прям ячейку
Ну она редактируется с помощью InplaceEditor'a - тот же TEdit, только гибкости - 0. А если хочется чего-то путного, то приемлемый выход - подстановка контролов.
Kolan (2007-06-16 14:47:00) [27]> Подставляй TEdit.
Хех еще посоветуй сделать сетку из N эдитов :) Есть же возможность редактировать прям ячейку
Loginov Dmitry (2007-06-16 14:46:00) [28]Подставляй TEdit. Об окончании редактирования будет сигнализировать его событие OnExit;
Kolan (2007-06-16 14:35:00) [29]> {RASkov}
Отослал
Kolan (2007-06-16 14:14:00) [30]> [6] {RASkov} © (16.06.07 14:06)
> > [5] Kolan © (16.06.07 14:03)
Ок, шас вот эту проблему победу, а то редактировать противно.
{RASkov} (2007-06-16 14:06:00) [31]> [5] Kolan © (16.06.07 14:03)
Kolan (2007-06-16 14:03:00) [32]> {RASkov} ©
ЗЫ 0 версия готова почти показать? Куда слать?
Kolan (2007-06-16 14:00:00) [33]> SetEditText
Не годится он. И имхо нужного вообще нет, я спрашиваю как можно достич нужного.
Смысл необходимости вот в чем:
Есть строка.S1 это модель.
Её отображаю в ячейке StringGrid это view.
Если ячейку изменяют, то изменяется и строкаS1.
И когда изменяется S1, то она говорит я изменилась рисуйте меня и её рисуют в ячейки грида.
Так вот если использоватьSetEditTextтакая синхронизация происходит постоянно, на каждом нажатии клавиши.
{RASkov} (2007-06-16 13:54:00) [34]> [2] Kolan © (16.06.07 13:31)
В таких случаях, когда не совсем понятен какой обработчик мне нужен, я поступаю так:
Создаю "подозреваемые" обработчики типа так
procedure TForm.StringGridSetEditText();
begin
ShowMessage('StringGridSetEditText');
end;
И вылавливаю потом нужные
:)
Kolan (2007-06-16 13:31:00) [35]> и выразить словами
1. Вот я выбрал ячейку и еще не начал редактировать. Ячейка выбрана но не могу редактировать.
2. Жму на нее еще раз текст становится доступным для редактирования.
3. Редактирую сколько влезит.
4. Нажимаю Enter/перехожу на другую ячейку(те в текст снова стал НЕ доступен для редактирования). И вот тут мне и нужно об этом узнать
sniknik (2007-06-16 10:13:00) [36]вряд ли... попробуй сам придумать (и выразить словами) когда считать что редактирование закончилось. (???) ну например если ничего не нажимали 3 мин, так чтоли? а автор отошел покурить (вот он, еще один неявный вред курения ;о))), вернулся через полчаса и продолжил набивать с половины слова.
в общем давай, предлагай, какая должна быть логика возникновения этого события?