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

Вниз

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;  //&#239;&#240;&#229;&#238;&#225;&#240;&#224;&#231;&#243;&#229;&#242; &#241;&#242;&#240;&#238;&#234;&#243; &#228;&#235;&#255; &#234;&#238;&#236;&#224;&#237;&#228;&#251;  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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.698 c
1-1101202372
kaktus
2004-11-23 12:32
2004.12.05
Поиск по TreeView


9-1090243094
Zak3D[@Tm]
2004-07-19 17:18
2004.12.05
Вопрос по игре Xonix.


9-1091612662
DROW
2004-08-04 13:44
2004.12.05
Подскажите начинающему...


1-1101284038
Alex_Bredin
2004-11-24 11:13
2004.12.05
Не могу записать значение в реестр


8-1094317882
hamster
2004-09-04 21:11
2004.12.05
*.ogg