C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Событие для StringGrid  (Прочитано 5374 раз)
RuZzz
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 30


« : 29 Август 2012, 12:57:03 »

В C++ Builder 2007 Не могу найти событие для StringGrid, которое бы запускало обработчик при окончании редактирования ячейки.
или подскажите пожалуйста как это реализовать.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #1 : 29 Август 2012, 13:23:42 »

А что значит "закончить редактирование"?
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #2 : 29 Август 2012, 13:34:38 »

Закончить редактирование - это нажать Enter, который закрывает In-place Editor. Надо просто в OnSetEditText проверить состояние StringGrid->EditorMode. Если False, значит, закончили редактировать ячейку.
Записан
RuZzz
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 30


« Ответ #3 : 29 Август 2012, 14:27:10 »

щас проверим, вот в том и проблема что пользователь может вместо enter например нажать на другую ячейку.

PS всё заработало спасибо 
« Последнее редактирование: 29 Август 2012, 14:34:57 от RuZzz » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #4 : 29 Август 2012, 14:46:36 »

Цитировать
в том и проблема что пользователь может вместо enter например нажать на другую ячейку
, угу, или выйти из StringGrid-а вообще, на другой компонент...

В этом случае понадобится обработать три события:

Код
void __fastcall TForm1::StringGrid1SetEditText(TObject *Sender, int ACol, int ARow,
 const UnicodeString Value)
{
FEdited = true;
if(!StringGrid1->EditorMode)
{
Memo1->Lines->Add("OnSetEditText -> Finished");
FEdited = false;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol, int ARow,
 bool &CanSelect)
{
if(FEdited)
{
Memo1->Lines->Add("OnSelectCell -> Finished");
FEdited = false;
}
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::StringGrid1Exit(TObject *Sender)
{
if(FEdited && !StringGrid1->EditorMode)
{
Memo1->Lines->Add("OnExit -> Finished");
FEdited = false;
}
}
 
, где

Код
class TForm1 : public TForm
{
__published: // IDE-managed Components
       // ...
 
private: // User declarations
bool FEdited;
};
 
Записан
RuZzz
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 30


« Ответ #5 : 29 Август 2012, 14:56:46 »

как то слишком сложно в итоге получается, чтобы обработать значение в последней ячейке которую редактировали мне надо сначала сохранить координаты ячейки, потом эти координаты использовать в других событиях (причём их может быть 2 Cell и Exit
« Последнее редактирование: 29 Август 2012, 17:15:53 от RuZzz » Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


« Ответ #6 : 29 Август 2012, 19:34:23 »

В таком случае - делай как положено: с созданием своего InplaceEditor-а и своего компонента-наследника от TStringGrid:

Header
Код
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
#include
//---------------------------------------------------------------------------
 
class TMyInplaceEdit : public TInplaceEdit
{
protected:
virtual void __fastcall WndProc(Winapi::Messages::TMessage &Message);
void ChangeMode(bool mode);
public:
bool FMode;
TNotifyEvent FOnChangeMode;
 
__fastcall virtual TMyInplaceEdit(System::Classes::TComponent* AOwner) :
  TInplaceEdit(AOwner)
{
}
};
 
class TMyStringGrid : public TStringGrid
{
private:
TMyInplaceEdit *SpecEditor;
TNotifyEvent FOnChangeMode;
virtual TInplaceEdit* __fastcall CreateEditor();
public:
bool IsEditMode()
{
return SpecEditor->FMode;
}
__fastcall virtual TMyStringGrid(System::Classes::TComponent* AOwner) :
                  TStringGrid(AOwner)
{
Options = Options << goEditing;
   }
__published:
__property TNotifyEvent OnChangeMode = {read=FOnChangeMode, write=FOnChangeMode};
};
 
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
private: // User declarations
TMyStringGrid *g;
void __fastcall ChangedMode(TObject *Sender);
 
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

CPP
Код
//---------------------------------------------------------------------------
#include
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
g = new TMyStringGrid(NULL);
g->Parent = this;
g->Align = alClient;
 
g->OnChangeMode = ChangedMode;
}
 
void __fastcall TForm1::ChangedMode(TObject *Sender)
{
if(g->IsEditMode())
Caption = dynamic_cast<TStringGrid*>(Sender)->ClassName() + " : Редактируется";
else
Caption = "";
}
 
 
//---------------------------------------------------------------------------
void __fastcall TMyInplaceEdit::WndProc(Winapi::Messages::TMessage &Message)
{
if((Message.Msg == WM_SETFOCUS) || (Message.Msg == WM_KILLFOCUS))
ChangeMode(Message.Msg == WM_SETFOCUS);
TInplaceEdit::WndProc(Message);
}
 
void TMyInplaceEdit::ChangeMode(bool mode)
{
FMode = mode;
if(FOnChangeMode)
{
FOnChangeMode(Grid);
   }
}
 
TInplaceEdit* __fastcall TMyStringGrid::CreateEditor()
{
SpecEditor = new TMyInplaceEdit(this);
SpecEditor->FOnChangeMode = FOnChangeMode;
return SpecEditor;
}
 

Запускай и смотри на заголовок формы. Работает как ожидалось? Изменяется в одном месте? Вот изменение его и замени на валидацию данных.

Если нужно - присоединю сам проект (написано на Builder XE2)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.179 секунд. Запросов: 20.