Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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;  //&#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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.037 c
1-1101198790
Jann
2004-11-23 11:33
2004.12.05
Нужна прога


14-1100252439
avlan
2004-11-12 12:40
2004.12.05
Удалить директорию минуя корзину


1-1100783805
opoloXAI
2004-11-18 16:16
2004.12.05
печать TStrings в TQuickRep.


14-1100185521
panov
2004-11-11 18:05
2004.12.05
Нужна критика кода-)


1-1101017406
Новичек
2004-11-21 09:10
2004.12.05
Одно меню PopUp для двух объектов.





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