Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Событие в DBGrid или в DataSet ??


Страницы:   1 2 3

Анна ©   (2009-11-25 16:49:00) 

С помощью ADOQUERY создаю временную табл и помещаю туда данные, с 2 полями формата DATETIME  
ADOQ1.Close;
 ADOQ1.SQL.Clear;
 ADOQ1.SQL.Add('IF (object_id(''tempdb..#prochee'') is  null) create table #prochee (datetime datetime,FIO_director varchar(20),Post_person varchar(30),FIO_person varchar(20),Phone_person varchar(20),Date_document datetime,Notes varchar(500)');
 ADOQ1.SQL.Add(' PRIMARY KEY (datetime))');
 ADOQ1.ExecSQL;

 ADOQ1.Close;
 ADOQ1.SQL.Clear;
 ADOQ1.SQL.Add('IF (select count(*) from #prochee)=0 insert into #prochee');
 ADOQ1.SQL.Add('select a.datetime,a.FIO_director,a.Post_person,a.FIO_person,a.Phone_person,a.Date_docum ent,a.Notes from start_tabl a,own');
 ADOQ1.SQL.Add('WHERE  a.id_own=own.id_own and');
 ADOQ1.SQL.Add(' own.iki_own='+leftstr(sp_own.Text,pos(' ',sp_own.Text)-1));
 ADOQ1.SQL.Add('and (datetime ='+ quotedstr(formatdatetime('yyyymmdd',strtodate(sp_dat.text)))+'or datetime='+quotedstr(formatdatetime('yyyymmdd',znach_dat))+')');
 ADOQ1.SQL.Add('and a.tops=''S''');
 ADOQ1.ExecSQL;
дальше эту врем табл связываю с DBGrid. При редактировании ячейки грида, где надо занести дату, набираю просто текст ('hhhh') и перехожу на след ячейку. При переходе не могу найти событие, в котором бы нужно обработать введеную дату на корректность.  Перепробовала почти все события (ADOQ1AfterEdit,ADOQ1AfterInsert,ADOQ1BeforePost...) не успевает ни в одно событие заходить, ругается: Class EConvertErrow with  message "pppp" is not valid date and time"  Какое событие нужно обработать, чтобы не допустить вставки некорректной даты в временную табл.?


Анна   (2009-11-27 11:46:00) [21]


> Inovet ©   (27.11.09 11:36) [27]

Мне надо проверять, чтобы при неудачном вводе заменяла на NULL

Подходит On SetText, но не получается динамически из прогаммы обратиться в это событие.

написала:
ADOQ1.FieldValues['Date_document'].OnSetText := mysettext(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);
Компиляция проходит, но при выполнении на этой строке ошибка:
invalid variant operation...


Inovet   (2009-11-27 11:36:00) [22]

> [24] Anatoly Podgoretsky ©   (27.11.09 11:08)
> > Inovet  (27.11.2009 10:53:23)  [23]
>
> > Validates a specified string against the current mask.

Я специально проверил. OnValidate после внутренней проверки вызывается для всех типов полей, в Integer, например, набрать 1000000000, то же самое.
Write an OnValidate event handler to validate changes made to the data in the field, just before the data is written to the current record buffer.

Или ты о другом?

> [25] Анна   (27.11.09 11:18)

Так тебе заменять надо или просто повторить ввод, чтоб типа на английском не вылазила ошибка?


Анна   (2009-11-27 11:30:00) [23]

если
ADOQ1.Fields[5].OnSetText:=mysettext;
то при компиляции :  Parameter lists differ


Анна   (2009-11-27 11:18:00) [24]


> sniknik ©   (27.11.09 10:18) [21]

В маленьком проекте заменила:

procedure TForm1.ADOQuery1Date_documentSetText(Sender: TField;
 const Text: String);
var dt:tdatetime;
begin
showmessage('ADOQuery1Date_documentSetText');
try
dt:=strtodate(Text);
except
ADOQuery1.FieldByName('Date_document').AsString:='07.07.2007';
ADOQuery1.Refresh;
end;
end;

Работает, заходит в процедуру и заменяет на 07.07.2007.

Теперь в большом проекте при динамическом переопределении не компилируется:   не корректные типы FieldSetTextEvent and proced....

ADOQ1.Fields[5].OnSetText:=MySetText(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);

procedure TForm1.mysettext(sender:TField;sss:string);
begin
showmessage('mysettext');
end;

Как правильно в Mysettext написать параметры?


Anatoly Podgoretsky   (2009-11-27 11:08:00) [25]

> Inovet  (27.11.2009 10:53:23)  [23]

> Validates a specified string against the current mask.


Inovet   (2009-11-27 10:53:00) [26]

> [22] Anatoly Podgoretsky ©   (27.11.09 10:42)
> Все таки не понятно почему не работает. При условии что
> в свойствах поля назначен обработчик OnValidate

Поле типа дата, насколько помню проверяется сначала корректность даты на дата ли вообще это.


Anatoly Podgoretsky   (2009-11-27 10:42:00) [27]

Все таки не понятно почему не работает. При условии что в свойствах поля назначен обработчик OnValidate


sniknik   (2009-11-27 10:18:00) [28]

ну тогда делай через onSetText, как в [1] советовали. он до всего.


Анна   (2009-11-27 10:07:00) [29]


> sniknik ©   (27.11.09 09:30) [19]

Грид стандартный.
сделала маленький проект :

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, DB, Grids, DBGrids, ADODB;

type
 TForm1 = class(TForm)
   ADOConnection1: TADOConnection;
   ADOQuery1: TADOQuery;
   DBGrid1: TDBGrid;
   DataSource1: TDataSource;
   ADOQuery1Date_document: TDateTimeField;
   ADOQuery1id_own: TIntegerField;
   ADOQuery1datetime: TDateTimeField;
   ADOQuery1FIO_person: TStringField;
   procedure ADOQuery1Date_documentValidate(Sender: TField);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ADOQuery1Date_documentValidate(Sender: TField);
begin
showmessage('ADOQuery1Date_documentValidate');
end;

end.

И все тоже самое, при вводе Date_document =13.13.2009 сразу вылетает исключение , а в процедуру ADOQuery1Date_documentValidate не заходит.
Если ввожу правильную дату - то в процедуру заходит.
Запрос к таблице на сервере (не к временной).


sniknik   (2009-11-27 09:30:00) [30]

используется чудосуперпутергрид?

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


Анна   (2009-11-27 09:14:00) [31]


> sniknik ©   (26.11.09 16:33) [16]

Не смогла сразу ответить, у нас вчера полгорода осталось без света.
При закоментированной маске все равно не заходит в процедуру, исключение возникает раньше. А где ( в каком месте программы) перехватить это исключение я не знаю.


Anatoly Podgoretsky   (2009-11-26 16:42:00) [32]

> sniknik  (26.11.2009 16:33:16)  [16]

Может быть, в справке сказано, что проверка EditMask делается на посимвольной основе, по мере ввода. Но это легко проверить если EditMask сделать пустой.


sniknik   (2009-11-26 16:33:00) [33]

может проверка от маски происходит раньше?


Anatoly Podgoretsky   (2009-11-26 16:15:00) [34]

Я не знаю почему, должно доходить.


Анна   (2009-11-26 15:22:00) [35]


> Anatoly Podgoretsky ©   (26.11.09 14:49) [13]


Вы не поняли меня. Я не могу ВОЙТИ в эту процедуру  : procedure TForm1.myValidate(ss: TField);

При неправильном вводе даты сразу возникает исключение: EConvertError ..."13.13.09" is not valid date
До входа в процедуру myValidate дело не доходит :(


Anatoly Podgoretsky   (2009-11-26 14:49:00) [36]

procedure TForm1.myValidate(ss: TField);
begin
// showmessage('myValidate');
 if not проверка then Abort;
end;


Анна   (2009-11-26 14:11:00) [37]

Сделала так:

ADOQ1.Close;
ADOQ1.SQL.Clear;
ADOQ1.SQL.Add('select * from #prochee');
ADOQ1.Open;

ADOQ1.FieldByName('Date_document').OnValidate:=myvalidate;
ADOQ1.FieldByName('Date_document').EditMask:='00/00/00;1;_';

procedure TForm1.myValidate(ss: TField);
begin
showmessage('myValidate');
end;

При корректной дате - происходит вход в процедуру myValidate.
Но когда ввожу '13.13.09' сразу сообщение об ошибке и войти в процедуру  myValidate не успеваю.
Не знаю, что я делаю не так?


Анна   (2009-11-26 13:23:00) [38]


> Сергей М. ©   (26.11.09 12:00) [9]


> Anatoly Podgoretsky ©   (26.11.09 12:03) [10]

Спасибо большое!!!


Anatoly Podgoretsky   (2009-11-26 12:03:00) [39]

Надо в ADOQ1 на форме, дважды щелкнуть по нему и добавить все поля, тогда можно встать курсором на поле и оно появится в инспекторе, там уже можно создать обработчик. Если же список полей не появится, то можно создать обработчик для любого поля и в рантайм можно будет его присвоить нужному полю. Предварительно отключив от временного поля.
FieldByName('FieldName').OnValidate := имя созданого обработчика без параметров;

Рекоменду также разделить ADOQ1 на два независимох компонента AdoCommand и AdoDataset.

Смущает также, что использовано  ADOQ1.ExecSQL;
во втором случае, а не ADOQ1.Open


Сергей М.   (2009-11-26 12:00:00) [40]


> Анна   (26.11.09 11:48) [7]


После того как ты вызовом метода ADO[Query|Table|DataSet].Open открыла доступ к НД из своей врем.таблицы, св-во ADO[Query|Table|DataSet].Fields[индекс интересующего поля] или метод FieldByName('имя интересующего поля') вернет объект класса TField, у которого есть св-во-событие OnValidate, которому ты тут же можешь назначить свой метод-обработчик.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо