Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизIncopatible types: String and Char Найти похожие ветки
← →
aliced © (2004-11-19 19:48) [0]Incopatible types: "String" and "Char" получаю на такой строке
if not
(copy(_Name,i,1) in ["0","1","2","3","4","5","6","7","8","9",","]) then
Хотя, впрочем, такой же результат дает
_Name[Pos(".", _Name)] := ",";
(_Name:string;)
Пример из хелпа:
var S: string;
begin
S := " 123.5";
{ Convert spaces to zeroes }
while Pos(" ", S) > 0 do
S[Pos(" ", S)] := "0";
end;
тоже не работает!
А надо-то мне всего-то символьную строку преобразовать в число!
Строка может содержать "." вместо ",", а может вообще содержать какие-то кракозябры (строку возвращает устройство на com-порту)
Delphi 5.5
← →
GanibalLector © (2004-11-19 19:54) [1]>тоже не работает!
Что за LOL? Все прекрасно работает!
← →
aliced © (2004-11-19 19:56) [2]а зачем бы я писала! не работает!
Может, в настройках проекта чего-нибудь надо изменить?
← →
begin...end © (2004-11-19 19:59) [3]
> aliced © (19.11.04 19:48)
> Incopatible types: "String" and "Char" получаю на такой
> строке
Так и должно быть.
> Хотя, впрочем, такой же результат дает
> _Name[Pos(".", _Name)] := ",";
Какой - такой же? Такая же ошибка? Не может быть.
> Пример из хелпа:
> тоже не работает!
Работает.
> А надо-то мне всего-то символьную строку преобразовать в
> число!
См. функции Format, FloatToStr и проч.
> Строка может содержать "." вместо ","
Предварительно заменяйте в ней разделитель на правильный (DecimalSeparator), если это необходимо.
← →
aliced © (2004-11-19 20:04) [4]ААААААА!!!! Я знаю, что не может! но происходит!!!!
Реальная процедура, сейчас компилятор выдает вышеозначенную ошибку на выделенной жирным строке:
procedure GetArtikul(_Port:integer; var _Artikul:integer; var _Name:string; var _Zena:real);
var i,p : integer;
begin
// i:=InitFPport(_Port,19200); //óæå
if i=-1 then
begin
ShowMessage("Îøèáêà ñâÿçè ñ àïïàðàòîì! GetArtikul");
exit;
end;
SetDecimals(2);
DelayForPrinter;
if _Artikul = 0 then
begin
exit;
end;
GetArticleInfo(0,PrinterResults,0,_Artikul);
_Name:=ri4;
p:=pos(".",_Name);
delete(_name,p,1);
insert(",",_name,p);
for i:=1 to length(_Name) do
begin
if not (copy(_Name,i,1) in ["0","1","2","3","4","5","6","7","8","9",","]) then
_Name:=copy(_name,1,i-1)+""+copy(_name,i+1,); //_Name[i]:="";
end;
if tm<>"" then _Artikul:=StrToInt(tm)
else _Artikul:=0;
if _Name<>"" then _Zena:=StrToFloat(_Name)
else _Zena:=0;
_Name:=ri3;
DelayForPrinter;
// CloseFPport();
end;
← →
aliced © (2004-11-19 20:07) [5]И предварительно заменять разделитель на правильный (точку на запятую) НЕ МОГУ! Еще раз повторяю, эта строка возвращается с устройства, подключенного на СОМ-порт, и устройство я разбирать и переделывать не могу-слишком дорого стОит!)
← →
begin...end © (2004-11-19 20:08) [6]
> [4] aliced © (19.11.04 20:04)
"Примера из хелпа", указанного в aliced © (19.11.04 19:48), в коде [4] не обнаружилось. "Не может быть" - я говорил именно про "пример из хелпа".
Подсказка: copy(_Name,i,1) можно заменить на _Name[i].
← →
begin...end © (2004-11-19 20:09) [7]
> [5] aliced © (19.11.04 20:07)
Для того, чтобы в уже полученной строке заменить один символ на другой, не нужно разбирать и переделывать устройство.
← →
Palladin © (2004-11-19 20:12) [8]для особо одаренных, Copy возвращает String (!) а не Char (!)
← →
begin...end © (2004-11-19 20:13) [9]
> [6] begin...end © (19.11.04 20:08)
> "Не может быть" - я говорил именно про "пример из хелпа".
А, нет, извините, "не может быть" - это я говорил про _Name[Pos(".", _Name)] := ",". Но этого тоже чего-то в [4] не наблюдается.
← →
Anatoly Podgoretsky © (2004-11-19 20:19) [10]_Name[i] in ["0","1","2","3","4","5","6","7","8","9",","]
← →
aliced © (2004-11-19 20:23) [11]""Примера из хелпа", указанного в aliced © (19.11.04 19:48), в коде [4] не обнаружилось. "Не может быть" - я говорил именно про "пример из хелпа"."
Набираете в справке "Pos function". В открывшемся окне сверху нажимете Example. И получаем тот пример, которого "в хелпе не обнаружилось"
Второе. "copy(_Name,i,1) можно заменить на _Name[i]". изначально так и было написано, а затем после выдачи компилятором вышеозначенной ошибки, уже начались извращения типа copy(_Name,i,1)
Третье, и главное. У меня есть проблема. Реальная. Я попросила помощи у знатоков, как говорится. После того, как поискала сначала в хелпе, учебниках и гугле. И мне просто обидно, что вместо того, чтобы помочь, вы начинаете говорить что такого не может быть!..
Мне без разницы, как будет решена эта проблема. Сейчас параллельно разбираю ф-ю Format. Может, подскажите что-нибудь другое. Но я не хочу вам доказывать, что то, что я пишу-правда. Мне просто смысла нет сидеть тут на работе в пятницу в пол-восьмого вечера одной и абсолютно трезвой, да еще придумывать какие-то сказки.
← →
begin...end © (2004-11-19 20:27) [12]
> [11] aliced © (19.11.04 20:23)
> Набираете в справке "Pos function". В открывшемся окне сверху
> нажимете Example. И получаем тот пример, которого "в хелпе
> не обнаружилось"
Я говорил - в [4] не обнаружилось!
Набираю, нажимаю, получаю:
var S: string;
begin
S := " 123.5";
{ Convert spaces to zeros }
while Pos(" ", S) > 0 do
S[Pos(" ", S)] := "0";
end;
И где такой код в [4]?
> "copy(_Name,i,1) можно заменить на _Name[i]". изначально
> так и было написано, а затем после выдачи компилятором вышеозначенной
> ошибки, уже начались извращения типа copy(_Name,i,1)
У Вас, наверное, ошибка в компиляторе.
← →
aliced © (2004-11-19 20:32) [13]Гм... А чем отличается
var S: string;
begin
S := " 123.5";
{ Convert spaces to zeroes }
while Pos(" ", S) > 0 do
S[Pos(" ", S)] := "0";
end;
от
var S: string;
begin
S := " 123.5";
{ Convert spaces to zeros }
while Pos(" ", S) > 0 do
S[Pos(" ", S)] := "0";
end;
? Только не говорите мне, что пустая строка имеет огромное влияние на работу программы ;)
← →
aliced © (2004-11-19 20:35) [14]Теперь пытаюсь сделать
_Name:=format("%d",_Name);
Получаю Incopatible types: "Array" and "String"... Бред какой-то...
← →
begin...end © (2004-11-19 20:35) [15]
> [13] aliced © (19.11.04 20:32)
> Гм... А чем отличается
Ничем не отличается, а что?
← →
begin...end © (2004-11-19 20:37) [16]
> [14] aliced © (19.11.04 20:35)
> Теперь пытаюсь сделать
> _Name:=format("%d",_Name);
> Получаю Incopatible types: "Array" and "String"... Бред
> какой-то...
И действительно - бред.
_Name:=format("%d", [_Name]);
← →
aliced © (2004-11-19 20:51) [17]ну, так что ж вы говорите, что его нет в хелпе, если ничем не отличается? Один я скопировала со своего первого сообщения, а второй-с вашего примера...
--------------------
Короче, получилось у меня. В Опциях проекта в свойствах компилятора в syntax option убрала галочку из strict var-strings. так что теперь ошибка выдается только в третьей строке, а это уже неважно.
if not (_Name[i] in ["0","1","2","3","4","5","6","7","8","9",","]) then
_Name:=copy(_name,1,i-1)+""+copy(_name,i+1,length(_name));
// _Name[i]:="";
← →
begin...end © (2004-11-19 20:54) [18]
> [17] aliced © (19.11.04 20:51)
> ну, так что ж вы говорите, что его нет в хелпе, если ничем
> не отличается?
У Вас что-то со зрением. Я не говорил, что его нет в хелпе. Я говорил:
1) его нет в приведённом коде;
2) код из хелпа работает.
← →
aliced © (2004-11-19 20:57) [19](Махает рукою) Бог с вами... Пошла я домой...
← →
Anatoly Podgoretsky © (2004-11-19 21:01) [20]aliced © (19.11.04 20:51) [17]
Еще бы строка[индекс] требует присвоение символа, а "" не является символом.
← →
begin...end © (2004-11-19 21:04) [21]
> [20] Anatoly Podgoretsky © (19.11.04 21:01)
Бесполезно, на нас всех уже махнули. :-)
← →
Anatoly Podgoretsky © (2004-11-19 21:16) [22]begin...end © (19.11.04 21:04) [21]
Надеюсь, что не на всех :-)
← →
aliced © (2004-11-20 14:32) [23]Конечно ж не на всех!
Если я вчера ушла, это не значит, что я сегодня не вернусь и не продолжу ;)
← →
Palladin © (2004-11-20 14:52) [24]Какая трагедия
← →
Юрий К (2004-11-20 14:52) [25]А если так
Byte b;
b = Ord(_name[i]);
if not (b in ["0".."9",",","."]) then ...
← →
Anatoly Podgoretsky © (2004-11-20 14:56) [26]Palladin © (20.11.04 14:52) [24]
Кому трагедия, а кому и нет :-)
Юрий К (20.11.04 14:52) [25]
А вот так не надо, сначала сам попробуй.
← →
Юрий К (2004-11-20 15:06) [27]Попробовал так:
b : Byte;
b := Byte(s[1]);
if not (b in [Ord("0")..Ord("9"),Ord(","),Ord(".")]) then
← →
KilkennyCat © (2004-11-20 15:25) [28]
> Юрий К (20.11.04 15:06) [27]
молодец!
← →
KilkennyCat © (2004-11-20 15:37) [29]для замены чего-либо строчного можно использовать функцию StringReplace
в данном случае, для замены пробелов на нули:
StringReplace(_Name, " ", "0", [rfReplaceAll]);
← →
KilkennyCat © (2004-11-20 15:49) [30]кроме того, если длина непосредсвенно числа всегда постоянна, то - RightStr()
и вроде бы, Trim тоже может помочь.
← →
begin...end © (2004-11-20 16:17) [31]
> [29] KilkennyCat © (20.11.04 15:37)
> в данном случае, для замены пробелов на нули
Да не надо ей пробелы на нули заменять. Ей строковое представление числа нужно перевести в число. Её беспокоит, что в строке могут быть символы, отличные от "0".."9" и DecimalSeparator. Так пусть удалит их оттуда и не мучается. Хотя, может быть, я не так что-то понял...
← →
Anatoly Podgoretsky © (2004-11-20 16:22) [32]Именно так, хочет удалить не нужное и точку привести к запятой, но это только первый шаг, все равно после этого надо проверять что осталось - число ли или просто нечто похожее на число. Иди игнорировать полученную строку
← →
aliced © (2004-11-20 16:38) [33]Спасибо всем, вроде справилась. Хотя все равно странно как-то всё...
Получила ф-ю, которую делаю перед преобразованием в число
function FormatStr(str:string):string; //ïðåîáðàçóåò ñòðîêó äëÿ êîìàíäû StrToInt
var i:integer;
begin
str:=StringReplace(str,".",",",[rfIgnoreCase]); // str[pos(".",str]:=",";
for i:=1 to length(str) do
begin
if not (str[i] in ["0","1","2","3","4","5","6","7","8","9",","]) then
str:=copy(str,1,i-1)+""+copy(str,i+1,length(str)); //str[i]:="";
end;
str:=trim(str);
if str="" then str:="0";
result:=str;
end;
← →
kaZaNoVa © (2004-11-20 16:41) [34]aliced © (20.11.04 16:38) [33]
Оксана, дай номер аськи :))
моя 1035000
← →
Anatoly Podgoretsky © (2004-11-20 16:43) [35]aliced © (20.11.04 16:38) [33]
Вот это str:=trim(str); поместить перед for
← →
begin...end © (2004-11-20 16:53) [36]
> [33] aliced © (20.11.04 16:38)
function FormatStr(Str: String): String;
var
I: Integer;
begin
for I := Length(Str) downto 1 do
if (Str[I] in [".", ","]) and (Str[I] <> DecimalSeparator) then
Str[I] := DecimalSeparator
else if not (Str[I] in ["0".."9", DecimalSeparator]) then
Delete(Str, I, 1);
Result := Str
end.
После этого необходимы, конечно, дополнительные проверки, а то вдруг там окажется две запятых подряд.
← →
KilkennyCat © (2004-11-20 16:57) [37]
> begin...end © (20.11.04 16:53) [36]
>
> > [33] aliced © (20.11.04 16:38)
>
> function FormatStr(Str: String): String;
> var
> I: Integer;
b: boolean
> begin
b := true;
> for I := Length(Str) downto 1 do
> if (Str[I] in [".", ","]) and (Str[I] <> DecimalSeparator) and b
> then begin
> Str[I] := DecimalSeparator;
b := false;
end
> else if not (Str[I] in ["0".."9", DecimalSeparator])
> then
> Delete(Str, I, 1);
> Result := Str
> end.
и лишнего как не бывало.
← →
begin...end © (2004-11-20 17:00) [38]
> [37] KilkennyCat © (20.11.04 16:57)
> и лишнего как не бывало
Откуда Вы знаете, какую запятую нужно оставить?
← →
KilkennyCat © (2004-11-20 17:05) [39]
> begin...end © (20.11.04 17:00) [38]
хе, я об этом тоже подумал... но потом, когда кнопку нажал :)
← →
KilkennyCat © (2004-11-20 17:12) [40]
function FormatStr(Str: String, NumberDel : byte): String;
var
I: Integer;
b : byte;
begin
b := 1;
for I := Length(Str) downto 1 do
if (Str[I] in [".", ","]) and (Str[I] <> DecimalSeparator) and (NumberDel = b)
then begin
Str[I] := DecimalSeparator;
inc(b);
end
else if not (Str[I] in ["0".."9", DecimalSeparator])
then
Delete(Str, I, 1);
Result := Str
end.
с выбором нужной запятой... хотя, опять же, можно выбрать вторую, а их всего одна...
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.037 c