![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проверить на тип
Bobby Digital © (2004-11-24 05:02:00)можно ли как то проверить тип данных введных, например в Edit не используя try ... exсept
Leonid Troyanovsky (2004-11-25 09:56:00) [21]
> ASoft (25.11.04 07:04) [20]
> GetDataType() это действительно здорово, что еще раз доказывает:
> "создавайте свои типы". Но как быть с проверкой при выходе
> из MaskEdit, ведь событие (ошибка) EDBEditError срабатывает
> раньше, чем проверочная функция? Написать свой обработчик
> ошибок?
Например
http://groups.google.com/groups?selm=41931491%40f1003.n5080.z2.fidonet.ftn
--
С уважением, LVT.
ASoft (2004-11-25 07:04:00) [22]GetDataType() это действительно здорово, что еще раз доказывает: "создавайте свои типы". Но как быть с проверкой при выходе из MaskEdit, ведь событие (ошибка) EDBEditError срабатывает раньше, чем проверочная функция? Написать свой обработчик ошибок?
GuAV (2004-11-25 01:58:00) [23]Bobby Digital © (25.11.04 1:52) [18]
А что зн. выражение F: double absolute I;
То что переменная F инеющая тип double находится о тому же адресу что и переменная I. В данном случае такая конструкция ошшибочна, поскольку размер переменной F больше чем размер переменной I и поэтому чтение/запись переменной F может привести к чтению/записи посторонних данных.
Не следует пользоваться absolute без нужды.
Здесь можно написать
var
I: integer;
F: double;
Подробнее absolute+F1
Bobby Digital (2004-11-25 01:52:00) [24]А что зн. выражение F: double absolute I;
GuAV (2004-11-25 01:36:00) [25]Попробовал. GetDataType('7,8'); - AV. Прикольно.
GuAV (2004-11-25 01:25:00) [26]GuAV © (25.11.04 1:25) [15]
ЫшяуЩа(Штеупук) = 4
SizeOf(Integer) = 4
GuAV (2004-11-25 01:25:00) [27]Юрий Зотов © (25.11.04 0:20) [14]
А не кажется ли Вам что
Юрий Зотов © (25.11.04 0:20) [14]
F: double absolute I;
- плохой код, учитывая что ЫшяуЩа(Штеупук) = 4 ,а SizeOf(Double) = 8. Вы можете конечно доказать, что ничего не перезаписываете но всё же правильнее было бы I: integer absoulte F;. А ещё правильнее IMHO не экономить одно слово в стеке и объявиь F и I отдельно.
Юрий Зотов (2004-11-25 00:20:00) [28]type
TDataType = (dtInteger, dtFloat, dtString);
function GetDataType(S: string): TDataType;
var
I: integer;
F: double absolute I;
begin
if TryStrToInt(S, I) then
Result := dtInteger
else
if TryStrToFloat(S, F) then
Result := dtFloat
else
Result := dtString
end;
Bobby Digital (2004-11-24 23:58:00) [29]мне нужно было различать - Integer Float String
я написал простю функцию ... которая проверяет каждый символ в строке, например, если все цифры то Интежер .. и тд.
Ega23 (2004-11-24 14:28:00) [30]Самое лучшее - в обработчике OnButtonOKClick :
procedure TFProfs.btnOkClick(Sender: TObject);
var
ss:String;
ProfID:Integer;
begin
if not CheckControlValues then Exit;
NewDataString:=MakeHistDetStr(nil,eProfNam.Text+';'+eProfLab.Text+';'+
RQ1.FieldByName('WCfgNam').AsString+';'+cbIsActual.Text,
'Название: ;Сокр.: ;АРМ: ;Используется: ','V');
............
ModalResult:=True;
end;
function TFProfs.CheckControlValues: Boolean;
var
ss:string;
Code:Integer;
begin
ss:=eProfNam.Text;
if not CheckOnQuotes(ss,Code) then
begin
if eProfNam.CanFocus then eProfNam.SetFocus;
// PassMessage(Handle,'Символ '+eProfNam.Text[Code]+' является зарезервированым '+CRLF+
// ' и не может быть использован',PasMess.capWarning,0);
Exit;
end;
eProfNam.Text:=ss;
ss:=eProfLab.Text;
if not CheckOnQuotes(ss,Code) then
begin
if eProfLab.CanFocus then eProfLab.SetFocus;
// PassMessage(Handle,'Символ '+eProfLab.Text[Code]+' является зарезервированым '+CRLF+
// ' и не может быть использован',PasMess.capWarning,0);
Exit;
end;
eProfLab.Text:=ss;
if eProfNam.Text='' then
begin
PassMessage(Handle,PasMess.wrnNamAbs,PasMess.capWarning,0);
eProfNam.SetFocus;
Result:=False;
Exit;
end;
if eProfLab.Text='' then
begin
PassMessage(Handle,PasMess.wrnLabAbs,PasMess.capWarning,0);
eProfLab.SetFocus;
Result:=False;
Exit;
end;
if Mode=0 then
begin
ss:='select ProfNam from Profs where ProfNam=' + ValX(eProfNam.Text);
QuOpen(DMpas.RQTemp,ss);
if not DMpas.RQTemp.IsEmpty then
begin
DMpas.RQTemp.Close;
PassMessage(Handle,PasMess.wrnNamExist,PasMess.capWarning,0);
eProfNam.SetFocus;
Result:=False;
Exit;
end;
ss:='select ProfLab from profs where proflab=' + ValX(eProfLab.Text);
QuOpen(DMpas.RQTemp,ss);
if not DMpas.RQTemp.IsEmpty then
begin
DMpas.RQTemp.Close;
PassMessage(Handle,PasMess.wrnLabExist,PasMess.capWarning,0);
eProfLab.SetFocus;
Result:=False;
Exit;
end;
end;
Result:=True;
end;
begin...end (2004-11-24 14:20:00) [31]
> [10] ASoft (24.11.04 11:07)
> перехват клавиш Shift-Ins, Ctrl-C...
> Как-то не очень...
> Кто лучше?
Обработчик TEdit.OnChange.
ASoft (2004-11-24 11:07:00) [32]Опять Val()...
перехват клавиш Shift-Ins, Ctrl-C...
навесить на Edit свой Popup...
Как-то не очень...
Кто лучше?
ASoft (2004-11-24 10:53:00) [33]>А если Copy/Paste? Будет ли работать проверка в таком случае?[8]
Хороший вопрос...
passlight (2004-11-24 10:49:00) [34]А если Copy/Paste? Будет ли работать проверка в таком случае?
ASoft (2004-11-24 10:49:00) [35]> Может Автор вопроса это имел ввиду? [6]
Кстати, где он, автор?
ASoft (2004-11-24 10:47:00) [36]>Тип данных введенных в едит можно не проверять.
Сам когда-то пытался проверять при выходе из Edit, что там: число или текст, использовал ф. Val(). Но потом, просто в KeyPress не разрешал вводить буквы или цифры (в зависимости от нужд). Может Автор вопроса это имел ввиду?
Sandman25 (2004-11-24 10:44:00) [37]Если подходить строго, у введенных в едит данных тип PChar.
Rutven (2004-11-24 10:37:00) [38]
> Тип данных введенных в едит можно не проверять.
> Это всегда анси строка.
Браво. :)
Reindeer Moss Eater (2004-11-24 10:28:00) [39]Тип данных введенных в едит можно не проверять.
Это всегда анси строка.
ASoft (2004-11-24 07:37:00) [40]>Bobby Digital
Если тебе нужно вводить в Edit только цифры или цифры ч/з запятую, то в KeyPress Edit'а можно сразу установить проверку ввода с клавы:)