![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Invalid pointer operation. [D7, WinXP]
Merry © (2006-10-04 21:03:00)Когда-то давно на форуме взяла код полезной функции, переводящей денежные суммы из цифр в пропись.
Почему-то при выполнении:
Edit2.Text:=TextSum(StrToFloat(Edit1.text));
перевод проходит, в Edit2 я вижу результат, но при этом выдаётся ошибка:"Invalid pointer operation."
Что она означает? Как от неё избавиться?
Код функции следующий:
{------------------------ Деньги прописью ---------------------}
function Conv999(M: longint; fm: integer): string;
const
c1to9m: array [1..9] of string [6] =
('один','два','три','четыре','пять','шесть','семь','восемь','девять');
c1to9f: array [1..9] of string [6] =
('одна','две','три','четыре','пять','шесть','семь','восемь','девять');
c11to19: array [1..9] of string [12] =
('одиннадцать','двенадцать','тринадцать','четырнадцать','пятнадцать',
'шестнадцать','семнадцать','восемнадцать','девятнадцать');
c10to90: array [1..9] of string [11] =
('десять','двадцать','тридцать','сорок','пятьдесят','шестьдесят',
'семьдесят','восемьдесят','девяносто');
c100to900: array [1..9] of string [9] =
('сто','двести','триста','четыреста','пятьсот','шестьсот','семьсот',
'восемьсот','девятьсот');
var
s: string;
i: longint;
begin
s := '';
i := M div 100;
if i<>0 then s:=c100to900[i]+' ';
M := M mod 100;
i := M div 10;
if (M>10) and (M<20) then s:=s+c11to19[M-10]+' '
else
begin
if i<>0 then s:=s+c10to90[i]+' ';
M := M mod 10;
if M<>0 then
if fm=0 then s:=s+c1to9f[M]+' '
else s:=s+c1to9m[M]+' ';
end;
Conv999 := s;
end;
{--------------------------------------------------------------}
function TextSum(S: double): string;
var
i: longint;
j: longint;
r: real;
t: string;
begin
t := '';
j := Trunc(S/1000000000.0);
r := j;
r := S - r*1000000000.0;
i := Trunc(r);
if j<>0 then
begin
t:=t+Conv999(j,1)+'миллиард';
j := j mod 100;
if (j>10) and (j<20) then t:=t+'ов '
else
case j mod 10 of
0: t:=t+'ов ';
1: t:=t+' ';
2..4: t:=t+'а ';
5..9: t:=t+'ов ';
end;
end;
j := i div 1000000;
if j<>0 then
begin
t:=t+Conv999(j,1)+'миллион';
j := j mod 100;
if (j>10) and (j<20) then t:=t+'ов '
else
case j mod 10 of
0: t:=t+'ов ';
1: t:=t+' ';
2..4: t:=t+'а ';
5..9: t:=t+'ов ';
end;
end;
i := i mod 1000000;
j := i div 1000;
if j<>0 then
begin
t:=t+Conv999(j,0)+'тысяч';
j := j mod 100;
if (j>10) and (j<20) then t:=t+' '
else
case j mod 10 of
0: t:=t+' ';
1: t:=t+'а ';
2..4: t:=t+'и ';
5..9: t:=t+' ';
end;
end;
i := i mod 1000;
j := i;
if j<>0 then t:=t+Conv999(j,1);
t := t+'руб. ';
i := Round(Frac(S)*100.0);
t := t+Long2Str(i)+' коп.';
TextSum := t;
End
Да ,ещё 3-я строка снизу выдаёт ошибку. Я заменила её на
t := t+IntToStr(i)+' коп.'; Но это, наверное, не совсем корректно. Потому что
i: longint, а не integer. А какой функцией перевести Longint в String??
isasa (2006-10-05 08:55:00) [1]Ketmar © (05.10.06 01:46) [6]
См почту.
Ketmar (2006-10-05 05:47:00) [2]>[14] Германн(c) 5-Oct-2006, 04:50
>Я даже не понимаю "продолжение Turbo
>Professional. тоже для BP/DOS/DPMI."
идеологическое развитие библиотеки "Turbo Professional". тоже для доса и турбо/борланд паскаля. к сожалению, оригинальной версии нет. есть только переточеная версия под Virtual Pascal. стукни в асю, если оно тебе надо в таком виде. %-)
Германн (2006-10-05 04:50:00) [3]
> Ketmar © (05.10.06 04:33) [13]
>
> >[12] Германн(c) 5-Oct-2006, 03:33
> >А что это?
> продолжение Turbo Professional. тоже для BP/DOS/DPMI. только
> ещё больше, ещё страшнее, и объектное. %-)
>
Я в восторге! Но увы первый раз слышу! :-(
Я даже не понимаю "продолжение Turbo Professional. тоже для BP/DOS/DPMI."
Мне тоже хотелось бы это иметь у себя.
Ketmar (2006-10-05 04:33:00) [4]>[12] Германн(c) 5-Oct-2006, 03:33
>А что это?
продолжение Turbo Professional. тоже для BP/DOS/DPMI. только ещё больше, ещё страшнее, и объектное. %-)
Германн (2006-10-05 03:33:00) [5]
> а вот TurboPower Object Professional нигде не дают.
А что это?
Стало даже очень интересно! Поясни, пож-ста.
Ketmar (2006-10-05 03:18:00) [6]>[10] Германн(c) 5-Oct-2006, 02:57
>Отправил всё, что мог. Если что-то лишнее не
>обессудь.
tnx. лишнее выкину, если что. а TOT я только что нашёл. %-)
а вот TurboPower Object Professional нигде не дают. TP его не открыла, зараза. %-)
Германн (2006-10-05 02:57:00) [7]Отправил всё, что мог. Если что-то лишнее не обессудь.
Ketmar (2006-10-05 02:39:00) [8]>[7] Германн(c) 5-Oct-2006, 02:13
>На мыло в анкете?
угу.
>TPguide нужен или нет?
лей всё. оно ж, вроде, маленькое %-)
Германн (2006-10-05 02:14:00) [9]TechnoJocks Object Toolkit - этого зверя я не встречал, увы!
Германн (2006-10-05 02:13:00) [10]
> Ketmar © (05.10.06 01:46) [6]
>
> >[5] Германн(c) 5-Oct-2006, 01:17
> >с библиотекой TurboProfessional.
> слушай, намыль, а? библиотеку
На мыло в анкете?
TPguide нужен или нет?
Ketmar (2006-10-05 01:46:00) [11]>[5] Германн(c) 5-Oct-2006, 01:17
>с библиотекой TurboProfessional.
слушай, намыль, а? библиотеку, в смысле. и ещё: если есть TechnoJocks Object Toolkit -- тоже намыль, плз. а то в гугле, заразы, TOT не дают %-((
Германн (2006-10-05 01:17:00) [12]
> Merry (04.10.06 21:03)
>
> Когда-то давно на форуме взяла код полезной функции, переводящей
> денежные суммы из цифр в пропись.
Кстати сей код без ошибок работает в TP7. Проверил сам. Но с библиотекой TurboProfessional. Long2Str именно оттуда.
function Long2Str(L : LongInt) : string;
{-Convert a long/word/integer/byte/shortint to a string}
var
S : string;
begin
Str(L, S);
Long2Str := S;
end;
guav (2006-10-05 00:19:00) [13]Ошибку может вызывать и приведеный код, но вряд ли.
Если при включении проверки диапазонов повторяется та же ошибка, тогда точно согласен с
> [3] Правильный Вася (04.10.06 22:08)
Правильный Вася (2006-10-04 22:08:00) [14]да негде там такой ошибке быть
наверно в другом месте
Джо (2006-10-04 21:23:00) [15]> но при этом выдаётся ошибка:"Invalid pointer operation."
У меня не выдается. Код не читал, ибо не враг своему здоровью :) Ты бы его отформатировал, что ли...
Ketmar (2006-10-04 21:09:00) [16]всё читать ниасилил. а LongInt -- это то же самое, что и Integer. потому что справка рулит. %-)