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

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

проверить символы в строке


zZZ ©   (2012-01-04 16:22:00) 

нужно написать функцию, которая проверяет содержит ли строка недопустимые символы. как лучше и правильнее обращаться к символам в строке: через указатели или напрямую. вот 2 варианта.

функция будет использоваться для проверки значений полей при импорте данных из текстового файла в таблицу бд. может потребоваться импортировать 500 000 записей и для каждой записи вызвать ее и проверить значения для нескольких полей (500 000 records x N fields -> Call IsValidString). как будет быстрее всего.


type

 {  }

 TCharSet = set of Char;

function IsValidString1(String_: string; ValidChars: TCharSet): Boolean;
var
 Char_: PChar;
begin
 Result := False;
 Char_ := PChar(String_);
 while Char_^ <> #0 do
 begin
   if not (Char_^ in ValidChars) then
     Exit;
   Inc(Char_);
 end;
 Result := True;
end;

function IsValidString2(String_: string; ValidChars: TCharSet): Boolean;
var
 I: Integer;
begin
 Result := False;
 for I := 1 to Length(String_) do
   if not (String_[I] in ValidChars) then
     Exit;
 Result := True;
end;


Sha   (2012-01-04 18:13:00) [1]

zZZ   (04.01.12 16:22)

Приведенные варианты дают разный результат на одинаковых строках.

Оба варианта можно ускорить.

Если множество недопустимых символов - 'хорошая' константа,
то часто можно ускорить еще больше.


zZZ   (2012-01-04 17:31:00) [2]

ok, еще сопутствующий вопрос:

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

может как-то можно на уровне TField контролировать вводимые значения, чтобы не писать функцию для проверки значения поля? т.е.

CodeField.AsString := ACode;<- если патаемся назначить полю значение содержащее недопустимые символы генерится исключение на уровне TField.

у TField есть свойства ValidChars, HasConstraint, CustomConstraint. Может их можно как-то использовать?


RWolf   (2012-01-04 17:19:00) [3]

с string вроде как побыстрее; впрочем, расходы на общение с БД многократно перекроют выигрыш.
и да, const перед строковым параметром сильно уменьшит общее время выполнения функции.


Наверх

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