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

Вниз

Присвоение TField.Value или TField.AsString   Найти похожие ветки 

 
harisma ©   (2010-11-04 18:39) [0]

Почему, когда я присваиваю TField.Value или TField.AsString значение, состоящее исключительно из пробелов или заканчивающееся на пробелы, то в первом случае получаю просто пустую строку, а во втором случае только текст без завершающих пробелов?

Другими словами:
procedure ...(var AFld: TStringField);
var
 s, s1: string;
begin
 s: = "      ";
 AFld.AsString := s;
 ....
 s1 := AFld.AsString; <-- тут получаю s1 = "" !!!
end;

procedure ...(var AFld: TStringField)
var
 s, s1: string;
begin
 s: = "text  ";
 AFld.AsString := s;
 ....
 s1 := AFld.AsString; <-- тут получаю s1 = "text" !!!

end;

Как сделать так, чтобы в поле сохранялись данные именно в таком виде, в каком я их передал туда?


 
sniknik ©   (2010-11-04 20:36) [1]

> Другими словами:
> procedure ...(var AFld: TStringField);
var лишнее, ты же не меняешь сам объект AFld (передать другой вместо него "наружу"), ты меняешь значение одного из его полей по ссылке, т.е. сделаешь это из одной ссылки, или из ее копии, не суть.
хотя это не по "проблеме", так для информации.

> Как сделать так, чтобы в поле сохранялись данные именно в таком виде, в каком я их передал туда?
поле в базе (а следовательно и в рекордсете после) должно быть типа varchar, а не char. char хранится в виде дополненного пробелами до полной длины, при чтении делается соответственно rtrim. т.е. это нормальное поведение, и обработка конкретного типа в большинстве движков.


 
harisma ©   (2010-11-05 10:45) [2]

Хорошо, тогда вопрос: как в коде описать такое поле? Ведь я создаю таблицу в базе не средствами SQL, а программно, и если я указываю тип поля ftString и указываю длину, то естественно создается поле с типом Char (или я не прав?)
Как программно сказать, чтобы было создано поле с типом varchar?


 
_Юрий   (2010-11-05 11:21) [3]


> я создаю таблицу в базе не средствами SQL, а программно


Лучше  все таки создавать средствами SQL, запущенными программно


 
harisma ©   (2010-11-05 11:23) [4]

Увы, это невозможно. Поэтому вопрос остается актуальным :(


 
Anatoly Podgoretsky ©   (2010-11-05 12:10) [5]


> harisma ©   (05.11.10 10:45) [2]

А средствами какого сервера ты смог бы это сделать?
Ты же как партизан молчишь обо всем.


 
Плохиш ©   (2010-11-05 13:12) [6]


> harisma ©   (05.11.10 11:23) [4]
>
> Увы, это невозможно.

Найми программиста.


 
harisma ©   (2010-11-05 16:18) [7]

Ну, сервер то MS SQL (версия не важна). Но в данном конкретном случае я работаю с компонентой TClientDataSet и не привязываю ее ни к каому реальному датасету. Просто есть такой компонент. У него есть одно поле типа стринга. Присваиваю ему некоторое значение с пробелами в конце, а после этого считываю его - в результате пробелов нет :( а как сделать так, чтобы они оставались?


 
Anatoly Podgoretsky ©   (2010-11-05 16:33) [8]

> harisma  (05.11.2010 16:18:07)  [7]

Проверяй настройки сервера.


 
Amoeba_   (2010-11-05 17:32) [9]


> Присваиваю ему некоторое значение с пробелами в конце, а
> после этого считываю его - в результате пробелов нет :(
> а как сделать так, чтобы они оставались?

А зачем они так необходимы, эти пробелы? Наоборот, радоваться надо, что они удаляются сами, а не приходится добавлять код для их удаления.


 
sniknik ©   (2010-11-05 18:37) [10]

> TClientDataSet и не привязываю ее ни к каому реальному датасету.
блин, слов нет, откуда такая общая, идиотская уверенность что везде все одинаково, и именно так как они думают... ВАЖНЫЕ детали, меняющие ВСЕ, раскрываются потом, и то может быть, а то и не раскрываются, вместо этого уверения "там все правильно"...
это, не конкретно тебе, это в общем... но частично и тебе тоже.

и только тебе, по секрету - свойства у компонента внимательно посмотри...


 
harisma ©   (2010-11-05 18:58) [11]

Компонент я создаю динамически. Поле - тоже. О каком свойстве идет речь то?

Вот собственно код:


procedure TForm1.Button1Click(Sender: TObject);
var
 C: TClientDataSet;
 F: TField;
begin
 C := TClientDataSet.Create(Self);
 F := TStringField.Create(Self);
 F.FieldName := "STUB";
 F.DataSet := C;
 F.Size := 255;
 C.CreateDataSet;
 C.Edit;

 F.Value := "ффф   ";
 ShowMessage(F.Value + IntToStr(Length(F.Value)));
end;


В результате получу в окошечке:
 ффф3,
а должно было бы показать
 ффф   6


 
sniknik ©   (2010-11-05 19:26) [12]

> О каком свойстве идет речь то?
published

> Вот собственно код:
поздно, его б сразу...  а так "ложечки нашлись, но осадочек остался".


 
harisma ©   (2010-11-05 19:48) [13]

> О каком свойстве идет речь то?
published

Все равно не понял :(


 
harisma ©   (2010-11-05 19:49) [14]

И к томиу же когда я задавал вопрос, этого кода у меня не ыло тогда :(


 
harisma ©   (2010-11-12 12:21) [15]

Вв господа бы не прикалывались почем зря, а на версию моей дельфы посмотрели бы внимательнее: Delphi 5. А в этой версии еще не было той паблишед проперти, которая отвечает за завершающие пробелы (DisableStringTrim). Но в общем я нашел вариант победить эту проблему.


 
Sha ©   (2010-11-12 15:37) [16]

> harisma ©   (12.11.10 12:21) [15]
> я нашел вариант победить эту проблему.

Почему бы не сказать, как?


 
Anatoly Podgoretsky ©   (2010-11-12 15:45) [17]

> Sha  (12.11.2010 15:37:16)  [16]

Я не халявщик, я партнер.


 
Sha ©   (2010-11-12 15:54) [18]

> Anatoly Podgoretsky ©   (12.11.10 15:45) [17]

На форуме все чаще стал встречаться тип, который я называю Диодом.
Принадлежащие к нему личности искренне считают, что информация должна течь только в одну сторону - к ним.
В запущенных случаях объектом становится вообще все хорошее с точки зрения больного.


 
harisma ©   (2010-11-12 17:48) [19]

А вариант решения простой: переписать компоненту TClientDataSet от Delphi 5, добавив в нее нужный функционал (а именно это свойство) и использовать ее вместо стандартной дельфовой, если уж нет возможности перейти на более высокую версию Дельфы (как у меня) :)


 
sniknik ©   (2010-11-12 19:29) [20]

> А вариант решения простой: переписать компоненту TClientDataSet
решение впечатляет своей "простотой"...


 
harisma ©   (2010-11-15 14:04) [21]


> переписать компоненту TClientDataSet

А там ничего сложного не оказалось - только добавить нужную новую пропертю да пару констант, чтоб обрабатівалась установка этой проперти - вот собственно и все :)



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

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

Наверх




Память: 0.49 MB
Время: 0.003 c
15-1287493341
azamatufa
2010-10-19 17:02
2011.02.06
Посоветуйте оптимальную структуру БД...


6-1233563581
vegarulez
2009-02-02 11:33
2011.02.06
Вопрос про разбор параметров запроса.


2-1289852452
asd
2010-11-15 23:20
2011.02.06
Работа с потоками


11-1229077921
sir tictactoe
2008-12-12 13:32
2011.02.06
не получается создать MCK-проект в BDS2006


2-1289811718
на4инающий
2010-11-15 12:01
2011.02.06
парсинг имени файла





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский