Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

Обработчик события для компонента созданного в RunTime.   Найти похожие ветки 

 
allucard   (2007-05-08 12:49) [0]

Доброго дня.

У меня два вопроса.

1. Есть компонент TDataSource связанный с DBGrid,  мне нужно после ввода значения в 3,4,5 или 6-й столбец проверить соответствует ли он числу в диапазоне от 1 до 8, и если нет то вернуть фокус DBrid.
Как это сделать, ведь всё создаётся в Run-time?

2. Хотелось бы конечно чтоб проверкой занимался только DBGrid, каой метод лучше переписать? Key press? Как это сделать в Runtime?

Спасибо.


 
Правильный Вася   (2007-05-08 12:52) [1]

Dataset.BeforePost


 
Reindeer Moss Eater ©   (2007-05-08 12:53) [2]

Как это сделать, ведь всё создаётся в Run-time?

Все в мире создается в рантайм. В чем же отличие у тебя?
Свойство перестает быть доступным?


 
allucard   (2007-05-08 13:45) [3]

Какое свойство определяет в каком столбце находится курсор ввода DBGrid?


 
Desdechado ©   (2007-05-08 15:44) [4]

property SelectedField: TField;
Specifies the field component for the currently selected cell in the grid.


 
allucard   (2007-05-10 09:01) [5]


> Desdechado ©   (08.05.07 15:44) [4]

Спасиб.
Понял.

А как обратиться к текущей ячейке?


 
{RASkov} ©   (2007-05-10 09:27) [6]

> [5] allucard   (10.05.07 09:01)
>А как обратиться к текущей ячейке?

См [4], я надеюсь ты не напрямую, имеешь ввиду, ячейку грида.... или что есть - текущая ячейка?
См. Value, AsXxxxx или что тебе нужно от "ячейки"?


 
allucard   (2007-05-10 09:33) [7]

У меня в ячейках раскрывающийся список.
Мне нужно чтоб значение можно было выбрать только из этого списка
от 1 до 8, желательно кнопки раскрывающегося списка отображались всегда, а не только в режиме edit.

Как проверить находится ли ячейка в режиме edit или insert?

Спасибо.


 
{RASkov} ©   (2007-05-10 09:51) [8]

> [7] allucard   (10.05.07 09:33)

Не ячейку проверять нужно а набор данных(DataSet) и его State....


 
{RASkov} ©   (2007-05-10 10:02) [9]

> [7] allucard   (10.05.07 09:33)
Мне нужно чтоб значение можно было выбрать только из этого списка

Заполни PickList для колонки Грида с нужным полем
ну а правильность значения проверяй в, где-нибудь, например: OnSetText или BeforePost....

> желательно кнопки раскрывающегося списка отображались
> всегда, а не только в режиме edit.

Свой(и) комбик(и) "рисуй" в гриде, как это сделать думаю, разберешься, так как это другая тема.


 
allucard   (2007-05-10 10:06) [10]


> {RASkov} ©   (10.05.07 09:51) [8]

понял.

не могу присвоить обработчик события для DataSet.

procedure TForm2.FormCreate(Sender: TObject);
begin

ClientDataSet1 := TClientDataSet.Create(Self);
ClientDataSet1.LoadFromFile("users.dat")

ClientDataSet1.BeforePost := ClientDataSet1BeforePost;

DataSource := TDataSource.Create(self);
DataSource.Enabled := false;
DataSource.DataSet := ClientDataSet1;
DataSource.Enabled := true;
DBGrid1.DataSource := DataSource;
DBGrid1.Enabled := true;

end;


затем в ручную прописываю:

 TForm2 = class(TForm)
   DBGrid1: TDBGrid;
   DBNavigator1: TDBNavigator;
   procedure FormDestroy(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   ClientDataSet1: TClientDataSet;
   DataSource: TDataSource;
   procedure ClientDataSet1BeforePost;
 public
 end;


и его реализацию:

procedure TForm2.ClientDataSet1BeforePost;
begin
   showmessage("123");
end;


пишет ошибку:

[Error] Unit2.pas(152): Incompatible types: "Parameter lists differ"

что не так?


 
Anatoly Podgoretsky ©   (2007-05-10 10:14) [11]

> allucard  (10.05.2007 10:06:10)  [10]

Ну явно же написано - список
параметров различается.

BeforePost + F1

 "allucard" <vodvorezlaya@i.ua> wrote in message
news:1178614169.10@delphimaster.ru...
 allucard (10.05.2007 10:06) [10]

 > {RASkov} ©   (10.05.07 09:51) [8]

 понял.

 не могу присвоить
обработчик события для DataSet.

 procedure TForm2.FormCreate(Sender: TObject);
 begin

 ClientDataSet1 := TClientDataSet.Create(Self);
 ClientDataSet1.LoadFromFile("users.dat")

 ClientDataSet1.BeforePost := ClientDataSet1BeforePost;

 DataSource := TDataSource.Create(self);
 DataSource.Enabled := false;
 DataSource.DataSet := ClientDataSet1;
 DataSource.Enabled := true;
 DBGrid1.DataSource := DataSource;
 DBGrid1.Enabled := true;

 end;

 затем в ручную прописываю:

  TForm2 = class(TForm)
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    ClientDataSet1: TClientDataSet;
    DataSource: TDataSource;
    procedure ClientDataSet1BeforePost;
  public
  end;

 и его реализацию:

 procedure TForm2.ClientDataSet1BeforePost;
 begin
    showmessage("123");
 end;

 пишет ошибку:

 [Error] Unit2.pas(152): Incompatible types: "Parameter lists differ"

 что не так?


 
{RASkov} ©   (2007-05-10 10:21) [12]

> [10] allucard   (10.05.07 10:06)
> ClientDataSet1 := TClientDataSet.Create(Self);
.........
> DataSource := TDataSource.Create(self);

А в чем необходимость создание этой всей лабуды в рантайме? Почему бы их не бросить на форму и настроить все в ИО?
Про параметры уже сказали..., ты прям как первый раз замужем....;)


 
ЮЮ ©   (2007-05-10 10:27) [13]

Открыть справку
property BeforePost: TDataSetNotifyEvent;
type TDataSetNotifyEvent = procedure(DataSet: TDataSet) of object;
потом сравнить со списком параметров в твоём методе и искоренить глобальное отличие.


 
allucard   (2007-05-10 10:39) [14]


> Anatoly Podgoretsky ©   (10.05.07 10:14) [11]
>{RASkov} ©   (10.05.07 10:21) [12]


С параметрами разобрался.

BeforePost это хорошо.
Но я лично считаю что проще не дать ввести пользователю непревильное значение вообще, ещё в DBGrid.

Сделал так:

procedure TForm2.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
if not (DBGrid1.SelectedField.AsInteger in [0, 1, 2, 3, 4, 5, 6, 7, 8]) then
 begin
  ShowMessage("Введите число от 0 до 8");
  if ClientDataSet1.State in [dsEdit, dsInsert] then
    begin
      if DBGrid1.SelectedField.AsInteger > 8 then DBGrid1.SelectedField.AsInteger := 8
      else
      if DBGrid1.SelectedField.AsInteger < 0 then DBGrid1.SelectedField.AsInteger := 0
      else
      ClientDataSet1.Post;
    end;
 end;
end;


Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.026 c
11-1164864154
Rocket
2006-11-30 08:22
2007.07.08
AnchorRight -Bottom не корректно работают при Parent - GroupBox


15-1181293433
G_M_S
2007-06-08 13:03
2007.07.08
TD2006 для Linux?


3-1176195112
bss
2007-04-10 12:51
2007.07.08
Обновление DBLookupComboBox при изменении данных в List


11-1164605756
StormA
2006-11-27 08:35
2007.07.08
RE_Text (RichEdit)


3-1175755536
Helen
2007-04-05 10:45
2007.07.08
Как отловить ошибки в тригере