Всем привет! В общем такая проблемма... В моей программе нужно перевести переменную из типа PChar в Double и обратно... Я сделал это так: ...... uses Windows, SysUtils; ...... ///Разделителем в числе может быть точка, поэтому заменяем ее запятой. s := PChar(StringReplace(s, '.', ',', [rfReplaceAll])); x := StrToFloat(s); ...... s := PChar(FloatToStr(x)); ...... Но при использовании SysUtils размер программы увеличивается в несколько раз! Вопрос: Как сделать то же самое но без использования SysUtils?
Еслибы я создал этот топик на форуме про шкурки тушканчиков, тогда ты прав... Но вроде бы это форум по программированию... Может есть аналогичные функции в ассемблере?
Вар.1 юзай sysutils а потом жми прогу любым пакером для PE Вар.2 писать свою функ. для конвертирования. Есть API но она конверит из int в pchar - wsprintf
x3r0n В директории Дельфи под названием Source должен быть файлик ffmt.asm в котором есть функции преобразования (это в Дельфи 5, а в Дельфи 7 ассемблерный код, который тебе пригодится, находится собственно в sysutils.pas, поищи, например, TextToFloat). На их основе можешь написать свое преобразование.
Юзай старые добрые Val и Str, прописанные в System со времен TP Правда в качестве разделителя они как раз принимают точку, а не "бухгалтерскую" запятую ) Для защиты от "бухгалтера" можно делать так Код (Text): var x:double; s:string;k:integer; ... Val(s,x,k); if (k > 0) and (s[k] =',') then begin s[k]:='.'; Val(s,x,k); end;
на самом деле SysUtils не так уж и много добавляет к экзешнику, я не пишу на дельфи, но когда-то побаловался и попробовал, у меня получилась 52Кб что для дельфи кодера следует считать малым размером сорс был такой: Код (Text): program Calculate; uses Windows, Messages, SysUtils; const IDD_DIALOG_1 = 200; IDC_BUTTON_2 = 112; IDC_BUTTON_1 = 111; IDC_EDIT_10 = 110; IDC_EDIT_9 = 109; IDC_EDIT_8 = 108; IDC_EDIT_7 = 107; IDC_EDIT_6 = 106; IDC_EDIT_5 = 105; IDC_EDIT_4 = 104; IDC_EDIT_3 = 103; IDC_EDIT_2 = 102; IDC_EDIT_1 = 101; MAINICON = 400; function DlgProc(hDlg, uMsg, wParam, lParam: Integer): Integer; stdcall; var sBuff : array [1..32] of byte; S1, S2, S3, S4, S5, S6 : String; begin Result := 1; CASE uMsg OF WM_INITDIALOG : begin SendMessage(hDlg, WM_SETICON, ICON_BIG, LoadIcon(hInstance, PChar(MAINICON))); SendMessage(hDlg, WM_SETICON, ICON_SMALL, LoadImage(hInstance, PChar(MAINICON), IMAGE_ICON, 16, 16, 0)); end; WM_COMMAND : begin CASE (LOWORD(wParam)) OF IDC_BUTTON_1 : begin try if GetDlgItemText(hDlg, IDC_EDIT_1, ADDR(sBuff), 32) <> 0 then S1 := StrPas(ADDR(sBuff)); if GetDlgItemText(hDlg, IDC_EDIT_2, ADDR(sBuff), 32) <> 0 then S2 := StrPas(ADDR(sBuff)); if GetDlgItemText(hDlg, IDC_EDIT_3, ADDR(sBuff), 32) <> 0 then S3 := StrPas(ADDR(sBuff)); if GetDlgItemText(hDlg, IDC_EDIT_4, ADDR(sBuff), 32) <> 0 then S4 := StrPas(ADDR(sBuff)); if GetDlgItemText(hDlg, IDC_EDIT_5, ADDR(sBuff), 32) <> 0 then S5 := StrPas(ADDR(sBuff)); if GetDlgItemText(hDlg, IDC_EDIT_6, ADDR(sBuff), 32) <> 0 then S6 := StrPas(ADDR(sBuff)); SetDlgItemText(hDlg, IDC_EDIT_7, PChar(FloatToStr(StrToInt(S1) * StrToFloat(S4)))); SetDlgItemText(hDlg, IDC_EDIT_8, PChar(FloatToStr(StrToInt(S2) * StrToFloat(S5)))); SetDlgItemText(hDlg, IDC_EDIT_9, PChar(FloatToStr(StrToInt(S3) * StrToFloat(S6)))); SetDlgItemText(hDlg, IDC_EDIT_10, PChar(FloatToStr(StrToInt(S1) * StrToFloat(S4) + StrToInt(S2) * StrToFloat(S5) + StrToInt(S3) * StrToFloat(S6)))); except end; end; IDC_BUTTON_2 : begin SendMessage(hDlg, WM_CLOSE, 0, 0); end; ELSE Result := 0; END; {CASE} end; WM_CLOSE : begin EndDialog(hDlg, 0); end; ELSE Result := 0; END; {CASE} end; {$R Calculate.res} begin DialogBoxParam(hInstance, PChar(IDD_DIALOG_1), 0, @DlgProc, 0); end.