Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Вниз

Событие в DBGrid или в DataSet ??   Найти похожие ветки 

 
Анна   (2009-11-25 16:49) [0]

С помощью 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-25 16:51) [1]

TField.SetText


 
Анна   (2009-11-25 16:52) [2]

Спасибо, завтра попробую утром. Отпишусь. Сейчас надо в сад за ребенком...


 
Anatoly Podgoretsky ©   (2009-11-25 16:57) [3]

> Анна  (25.11.2009 16:49:00)  [0]

Validate


 
Anatoly Podgoretsky ©   (2009-11-25 16:59) [4]

> Анна  (25.11.2009 16:49:00)  [0]

И используй параметры


 
Анна   (2009-11-26 10:51) [5]


> Anatoly Podgoretsky ©   (25.11.09 16:57) [3]

я зациклилась с этой датой...:(((
не знаю какой параметр указать в validdate и в какой момент (или на какое событие?) вызывать эту процедуру
ADOQ1.FieldByName("date_document").Validate();  ?

И Как потом выйти на событие onValidate ?
Напишите пож-та поподробнее.


 
Anatoly Podgoretsky ©   (2009-11-26 11:14) [6]

> Анна  (26.11.2009 10:51:05)  [5]

Я тебе точно не скажу, я не работал с onValidate, но там вроде нужно вызвать метод Abort
А событие нужно привязывать к конкретному полю, которое надо предварительно создать, смотри мои рассуждения по этому в сообщение http://delphimaster.net/view/3-1259081869/
И конечно справку

> If the OnValidate event handler does not raise an exception, the data is written to the current record buffer.


 
Анна   (2009-11-26 11:48) [7]


> Anatoly Podgoretsky ©   (26.11.09 11:14) [6]

Я не могу в инспекторе объектов это поле добавить, т.к оно во временной таблице. Начинаю обманывать инспектор, пишу в нем select Date_document from start_tabl, потом делаю add Fields --- получаю объект ADOQ1Date_document:TDateTime где получаю доступ к методам onvalidate,onsettext...и свойствам (там  маска ввода есть) Но при запуске программы ругается, что нет такого поля Date_document что и естественно, ведь в программе у меня табл #prochee. А как динамически в программе все это сделать (без инспектора объектов) не знаю.

ADOQ1Date_document


 
Sergey13 ©   (2009-11-26 11:56) [8]

А какой смысл в использовании временной таблицы если она заполняется обычным запросом?


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


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


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


 
Anatoly Podgoretsky ©   (2009-11-26 12:03) [10]

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

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

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


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


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


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

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


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

Сделала так:

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 не успеваю.
Не знаю, что я делаю не так?


 
Anatoly Podgoretsky ©   (2009-11-26 14:49) [13]

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


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


> 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 16:15) [15]

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


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

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


 
Anatoly Podgoretsky ©   (2009-11-26 16:42) [17]

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

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


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


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

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


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

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

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


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


> 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 10:18) [21]

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


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

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


 
Inovet ©   (2009-11-27 10:53) [23]

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

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


 
Anatoly Podgoretsky ©   (2009-11-27 11:08) [24]

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

> Validates a specified string against the current mask.


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


> 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 написать параметры?


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

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


 
Inovet ©   (2009-11-27 11:36) [27]

> [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:46) [28]


> 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...


 
Плохиш ©   (2009-11-27 11:57) [29]


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


ADOQ1.FieldValues["Date_document"].OnSetText := mysettext;

При условии, что описание mysettext совпадает с описанием OnSetText.

PS. Стоит описание используемого языка программирования изучить в конце концов...


 
Inovet ©   (2009-11-27 12:05) [30]

> [26] Анна   (27.11.09 11:30)
> если
> ADOQ1.Fields[5].OnSetText:=mysettext;
> то при компиляции :  Parameter lists differ

Значит прототип твоего обработчика не совпадает с ожидаемым
procedure TForm1.ADOQuery1Date_documentSetText(Sender: TField; const Text: String);


 
Анна   (2009-11-27 12:06) [31]


> Плохиш ©   (27.11.09 11:57) [29]


ADOQ1.FieldValues["Date_document"].OnSetText := mysettext;

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

Не компилируется : Not enough actual parameters


 
Inovet ©   (2009-11-27 12:08) [32]

> [28] Анна   (27.11.09 11:46)
> Мне надо проверять, чтобы при неудачном вводе заменяла на
> NULL

Вообще не очень хорошо очищать то что ввёл пользователь, надо дать возможность исправить. Как раз стандартная схема с OnValidate самое оно.


 
Inovet ©   (2009-11-27 12:11) [33]

> [31] Анна   (27.11.09 12:06)

const где?


 
Плохиш ©   (2009-11-27 12:17) [34]


> Inovet ©   (27.11.09 12:11) [33]
>
> > [31] Анна   (27.11.09 12:06)
>
> const где?
>

+1


 
Анна   (2009-11-27 12:21) [35]


> Inovet ©   (27.11.09 12:11) [33]

тот же результат. Компиляция проходит:

ADOQ1.FieldValues["Date_document"].OnSetText := mysettext(ADOQ1.Fields[5],ADOQ1.Fields[5].asstring);

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

но при выполнении на операторе
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext.....
ошибка invalid variant operation...


 
Inovet ©   (2009-11-27 12:28) [36]

> [35] Анна   (27.11.09 12:21)
> ADOQ1.FieldValues["Date_document"].OnSetText := mysettext(ADOQ1.Fields[5]
> ,ADOQ1.Fields[5].asstring);

Пару раз или больше уже подсказали, тебе же адрес процедуры надо присвоить, а не вызывать её, причём неизвестно с чем там
ADOQ1.FieldValues["Date_document"].OnSetText := mysettext;


 
Анна   (2009-11-27 12:40) [37]

Вы  думаете, что я не обращаю внимания на ваши подсказки???
Это не так.
Я уже отвечала в [31] что этот вариант не компилируется.
Если бы я смогла найти решение этой проблемы в интернете, я бы сюда не обратилась, т.к. очень хорошо  понимаю, что никто мне ничего не должен, и если отвечают - то в ущерб своим делам.


 
Anatoly Podgoretsky ©   (2009-11-27 12:46) [38]


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

У тебя не закончено предложение. Возможно у тебя регулярная процедура.


 
Плохиш ©   (2009-11-27 12:53) [39]

Я не помню, нанять программиста еи уже предлагали? По-моему, самое время.


 
Анна   (2009-11-27 12:54) [40]


> Anatoly Podgoretsky ©   (27.11.09 12:46) [38]


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

Ошибка компиляции :
Incompatible types : "TFieldSerTextEvent" and "procedure, untyped pointer or untyped parameter



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

Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.005 c
2-1258916487
Palalord
2009-11-22 22:01
2010.01.17
Проблема с использованием стандартного плеера в Delphi


2-1258895265
Виктор
2009-11-22 16:07
2010.01.17
Представление данных базы данных в Word


2-1258959429
Alex_C
2009-11-23 09:57
2010.01.17
Правильно "заморозить" TThread


15-1258061413
Юрий
2009-11-13 00:30
2010.01.17
С днем рождения ! 13 ноября 2009 пятница


2-1259598441
xtd
2009-11-30 19:27
2010.01.17
Почему в TWebBrowser не работают JavaScript – ы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский