Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

D7.TStringGrid & OnSetEditText Event - уходим из ячейки не по Enter - к

1,303 views
Skip to first unread message

Sergei Sarbash

unread,
Aug 26, 2004, 7:57:59 AM8/26/04
to
Hello All!

Прошу помощи профессионалов - зашел в тупик:

1. Есть таблица строк, в которой редактируется текст.
2. Для проверки вводимой информации навешан обработчик соответствующего события
(OnSetEditText).
3. В ОБРАБОТЧИКЕ производится проверка только тогда, когда EditorMode = False

Ситуация при редактировании содержимого ячеек:
1. Когда в конце редактирования выходим из ячейки при помощи клавиатуры, то
нормально генерится нужное событие, переключается режим EditorMode в False и
нормально производится проверка введенного значения.
2. ПРОБЛЕМА: если во время редактирования ткнуть мышой в другую ячейку, то
курсор переводится на нее и введенное значение нормально отображается в ячейке,
но проверки введенного значения не происходит! :-(

Мои мысли:
1. Как я понял, событие OnSetEditText генерится только от клавиатуры, поэтому
при перемещении мышой, а не с клавиатуры, данное сообщение естественно не
генерится и проверки не происходит. Что делать?
2. Можно ли отследить данную ситуацию? ВАЖHО проверять значение только тогда,
когда редактирование закончено, иначе, в режиме редактирования, это делать
бессмысленно. А если редактирование заканчивается кликом мыши, то возникает моя
большая головная боль.
3. Хорошо, если мои догадки верны, то как я могу получить отредактированное
значение иначе, чем через OnSetEditText? Как отследить, что ячейка вышла из
режима редактирования и можно проверять ее содержимое? Как я могу отследить эту
ячейку? Я, конечно, еще буду копать, но мне очень нужна помощь, как
начинающему. Или хотя бы совет, наводящий на разумное решение.

Буду благодарен за любую помощь! Вопрос для меня срочный, поэтому для меня чем
раньше, тем лучше.

--
With Best Regards,
Sergei

Alexander B. Bokovikov

unread,
Aug 26, 2004, 12:32:05 PM8/26/04
to
On Thu, 26 Aug 2004 15:57:59 +0400, Sergei Sarbash
<Sergei....@p2.f56.n5093.z2.fidonet.org> wrote:

>Буду благодарен за любую помощь! Вопрос для меня срочный, поэтому для меня чем
>раньше, тем лучше.

Ну, если за любую... ИМХО, это - глюк. Я бы взял (я, собс-но, и взял)
некую альтернативу стандартному гриду - благо их тьма и с исходниками.
Пошарь - найдешь.

Александр Боковиков
E-mail: bokovikov(a)mail.ru (дом.) abokovikov(a)apress.ru (раб.)
http://www.apress.ru/pages/bokovikov/delphi

Leonid Troyanovsky

unread,
Aug 28, 2004, 5:35:39 AM8/28/04
to
Приветствую, Sergei.

SS> 1. Есть таблица строк, в которой редактируется текст.
SS> 2. Для проверки вводимой информации навешан обработчик соответствующего
SS> события (OnSetEditText).
SS> 3. В ОБРАБОТЧИКЕ производится проверка только тогда, когда EditorMode =
SS> False

SS> Ситуация при редактировании содержимого ячеек:
SS> 1. Когда в конце редактирования выходим из ячейки при помощи клавиатуры,
SS> то нормально генерится нужное событие, переключается режим EditorMode в
SS> False и нормально производится проверка введенного значения.
SS> 2. ПРОБЛЕМА: если во время редактирования ткнуть мышой в другую ячейку,
SS> то курсор переводится на нее и введенное значение нормально отображается
SS> в ячейке, но проверки введенного значения не происходит! :-(


type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure ChangedMode(Sender: TObject);
public
{ Public declarations }
end;

implementation

{$R *.dfm}

uses
grids;


type
TSpecInplaceEdit = class(TInplaceEdit)
private
FMode: Boolean;
FOnChangeMode: TNotifyEvent;
protected
procedure WndProc(var msg: TMessage); override;
procedure ChangeMode(mode: Boolean);
end;

TStringGridSE=class(TStringGrid)
private
SpecEditor: TSpecInplaceEdit;
FOnChangeMode: TNotifyEvent;
function CreateEditor: TInplaceEdit; override;
public
function IsEditMode: Boolean;
constructor Create(AOwner: TComponent); override;
published
property OnChangeMode: TNotifyEvent read FOnChangeMode write
FOnChangeMode;
end;

procedure TSpecInplaceEdit.wndproc;
begin
if (msg.Msg = WM_SETFOCUS) or (msg.Msg = WM_KILLFOCUS) then
ChangeMode(msg.Msg = WM_SETFOCUS);
inherited;
end;

procedure TSpecInplaceEdit.ChangeMode;
begin
FMode := mode;
if Assigned(FOnchangeMode) then
FOnchangeMode(Grid);
end;

function TStringGridSE.CreateEditor;
begin
SpecEditor := TSpecInplaceEdit.Create(Self);
SpecEditor.FOnChangeMode := FOnChangeMode;
Result := SpecEditor;
end;

constructor TStringGridSE.Create;
begin
inherited;
Options := Options + [goEditing];
end;

function TStringGridSE.IsEditMode;
begin
Result := SpecEditor.FMode;
end;

var
g: TStringGridSE;

procedure TForm1.ChangedMode;
begin
if g.IsEditMode then
Caption := (Sender as TStringGrid).ClassName + ' :Edit'
else
Caption := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
g := TStringGridSE.Create(nil);
g.Parent := Self;
g.OnChangeMode := ChangedMode;
end;

--

С уважением, LVT.

0 new messages