Форум программистов, компьютерный форум CyberForum.ru

Delphi и WinAPI

Войти
Регистрация
Восстановить пароль
 
elite001
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 22
#1

WinApi, integer to string - Delphi WinAPI

13.10.2016, 10:13. Просмотров 523. Ответов 8

Всем привет и хорошего настроения...

не подскажете, есть ли функция по переводу из интегера в стринг используя только модуль windows? асм вставки может какие?

спасибо)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2016, 10:13     WinApi, integer to string
Посмотрите здесь:

ToolBar и WinAPI - Delphi WinAPI
Создать ToolBar при помощи WinAPI в общем, дело не хитрое. Но все существующие примеры подразумевают использование картинок. Если их не...

ComboBox и WinAPI - Delphi WinAPI
Привет всем! Есть одна проблемка :(:'( У меня на форме есть ComboBox. Соответственно, если я выбираю что-нибудь, например, строку 1, то...

WinAPI и графика - Delphi WinAPI
Добрый день, или ночь, или вечер, или... Нужно написать игру, максимально быструю, что бы FPS(частота перерисовки) зависели только от...

Combobox в WinApi - Delphi WinAPI
подскажите ответ плз, как обработать дочернее всплывающее окно ComboBox'a, чё делать непойму. Создаю Combo:...

RichEdit и WinApi - Delphi WinAPI
У меня такая проблема. При компиляции Pastebtn.Enabled:=RichEdit1.Perform(em_canpaste , 0, 0)<>0; выдает ошибку Как...

Извлечение ресурсов на WinApi - Delphi WinAPI
Добрый день! Требуется помощь. Пытаюсь извлечь из ресурсов три файла. Компиляция проходит успешно. При запуске программы - файлы не...

Поиск окон WinAPI - Delphi WinAPI
Подскажите как найти hendl последнего MacromediaFlashPlayerActiveX в такой стректуре Shell Embedding ------Shell DocObject View ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BOGG ART
487 / 413 / 121
Регистрация: 09.12.2013
Сообщений: 2,189
Записей в блоге: 2
13.10.2016, 10:41     WinApi, integer to string #2
Зачем? Берите IntToStr и всё.
elite001
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 22
13.10.2016, 11:01  [ТС]     WinApi, integer to string #3
Цитата Сообщение от BOGG ART Посмотреть сообщение
Зачем? Берите IntToStr и всё.
Нельзя) будет использован модуль SysUtils, а значит размер программулинки увеличится на 45КБ (31КБ VS 76КБ), после упаковки UPX разница 16КБ (14КБ VS 30КБ), а там всего то ничего - навигация по каталогам и вывод содержимого папки в файл.. зачем экономия? чтобы не потерять файлик запихну его в ресурсы C# проекта, где и так сейчас лежит другой файлик с VCL на 500КБ (упакован upx), который тоже будет переписан на винапи..

Добавлено через 8 минут
в лучших традициях))) отвечаю сам себе.. может это ужасно, но оно черт возьми работает, лишний модуль не использкется и ладно..
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function Int2Str(pInt:integer):String;
var
  iPow:array[1..10] of Integer;
  sArr:array[0..9] of Char;
  i:short;
  iInt:short;
  ret:string;
  isNum:boolean=false;
begin
  sArr[0]:='0';
  sArr[1]:='1';
  sArr[2]:='2';
  sArr[3]:='3';
  sArr[4]:='4';
  sArr[5]:='5';
  sArr[6]:='6';
  sArr[7]:='7';
  sArr[8]:='8';
  sArr[9]:='9';
 
  iPow[1]:=1000000000;
  iPow[2]:=100000000;
  iPow[3]:=10000000;
  iPow[4]:=1000000;
  iPow[5]:=100000;
  iPow[6]:=10000;
  iPow[7]:=1000;
  iPow[8]:=100;
  iPow[9]:=10;
  iPow[10]:=1;
  for i:=1 to 10 do
  begin
    iInt:=pInt div iPow[i];
    if (iInt>0) or isNum then
    begin
      isNum:=true;
      pInt:=pInt-iInt*iPow[i];
      ret:=ret+sArr[iInt];
    end;
  end;
  exit(ret);
end;
BOGG ART
487 / 413 / 121
Регистрация: 09.12.2013
Сообщений: 2,189
Записей в блоге: 2
13.10.2016, 11:06     WinApi, integer to string #4
Пушкой по воробьям.
Никто из реальных пользователей и в мегабайты разницы не замечает.

На WinAPI нету подобных функций. Это делается средствами языка или стандартных библиотек.
А IntToStr и так на Асме. Может у вас настройки компилятора плохие?
elite001
0 / 0 / 0
Регистрация: 31.05.2015
Сообщений: 22
13.10.2016, 11:30  [ТС]     WinApi, integer to string #5
ах да, тут нет проверки на входной параметр 0 и меньше нуля, это двумя ифами можно исправить....
ииии наверное тут лишняя операция с делением на 1, я что-то увлекся копированием - вставкой - удалением символов) смысл таков, что инт не больше 2^32 (10 разрядов, кажется это разрядом называется, в общем миллиарды)

Добавлено через 1 минуту
Цитата Сообщение от BOGG ART Посмотреть сообщение
Пушкой по воробьям.
Никто из реальных пользователей и в мегабайты разницы не замечает.
На WinAPI нету подобных функций. Это делается средствами языка или стандартных библиотек.
А IntToStr и так на Асме. Может у вас настройки компилятора плохие?
может и плохие) я их не проверял, а что нужно смотреть?
у меня Lazarus 1.4.4 ....

Добавлено через 14 минут
Воооооо.... нашеееееееел)) круто) всего то добавил в строку поиска в яндексе inttostr asm =)
Delphi
1
2
3
4
5
6
7
8
9
10
11
function int2str(pint:integer):string;
var
  str:string;
begin
  asm
    mov eax, pInt
    lea edx, S
    call IntToStr
  end;
  exit(s);
end;
Добавлено через 1 минуту
а я тот еще говнокодер =)))

Добавлено через 2 минуты
><
работало.. оказывается со включенным модулем sysutils..... так что нет, увы не работает
BOGG ART
487 / 413 / 121
Регистрация: 09.12.2013
Сообщений: 2,189
Записей в блоге: 2
13.10.2016, 13:00     WinApi, integer to string #6

Не по теме:

У нас пользователи не замечают 5-го подряд увеличения программы на 250+ мегабайт. Всем плевать. А у вас из-за жалких килобайт истерика. Я бы на вашем месте задумался. Познал бы бренность бытия, и типа того.



Прежде всего реализация из Делфи7 (видимо ANSI-only):
Delphi7->IntToStr()
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
Procedure VCL_CvtInt_ANSI();
Begin
      Asm
            OR      CL, CL
            JNZ     @CvtLoop
      @C1:
            OR      EAX, EAX
            JNS     @C2
            NEG     EAX
            CALL    @C2
            MOV     AL, '-'
            INC     ECX
            DEC     ESI
            MOV     [ESI], AL
            RET
      @C2:
            MOV     ECX, 10
      @CvtLoop:
            PUSH    EDX
            PUSH    ESI
      @D1:
            XOR     EDX, EDX
            DIV     ECX
            DEC     ESI
            ADD     DL, '0'
            CMP     DL, '0'+10
            JB      @D2
            ADD     DL, ('A'-'0')-10
      @D2:
            MOV     [ESI], DL
            OR      EAX, EAX
            JNE     @D1
            POP     ECX
            POP     EDX
            SUB     ECX, ESI
            SUB     EDX, ECX
            JBE     @D5
            ADD     ECX, EDX
            MOV     AL, '0'
            SUB     ESI, EDX
            JMP     @z
      @zloop:
            MOV     [ESI+EDX], AL
      @z:
            DEC     EDX
            JNZ     @zloop
            MOV     [ESI], AL
      @D5:
      End;
End;
 
Procedure VCL_CvtInt64_ANSI();
Begin
      Asm
            OR      CL, CL
            JNZ     @start
            MOV     ECX, 10
            TEST    [EAX+4], $80000000
            JZ      @start
            PUSH    [EAX+4]
            PUSH    [EAX]
            MOV     EAX, ESP
            NEG     [ESP]
            ADC     [ESP+4], 0
            NEG     [ESP+4]
            CALL    @start
            MOV     [ESI-1].Byte, '-'
            DEC     ESI
            INC     ECX
            ADD     ESP, 8
            RET
      @start:
            PUSH    ESI
            SUB     ESP, 4
            FNSTCW  [ESP+2].Word
            FNSTCW  [ESP].Word
            OR      [ESP].Word, $0F00
            FLDCW   [ESP].Word
            MOV     [ESP].Word, CX
            FLD1
            TEST    [EAX+4], $80000000
            JZ      @ld1
            PUSH    [EAX+4]
            PUSH    [EAX]
            AND     [ESP+4], $7FFFFFFF
            PUSH    $7FFFFFFF
            PUSH    $FFFFFFFF
            FILD    [ESP+8].QWord
            FILD    [ESP].QWord
            FADD    ST(0), ST(2)
            FADDP   ST(1), ST(0)
            ADD     ESP, 16
            JMP     @ld2
      @ld1:
            FILD    [EAX].QWord
      @ld2:
            FILD    [ESP].Word
            FLD     ST(1)
      @loop:
            DEC     ESI
            FPREM
            FISTP   [ESP].Word
            FDIV    ST(1), ST(0)
            MOV     AL, [ESP].Byte
            ADD     AL, '0'
            CMP     AL, '0'+10
            JB      @store
            ADD     AL, ('A'-'0')-10
      @store:
            MOV     [ESI].Byte, AL
            FLD     ST(1)
            FCOM    ST(3)
            FSTSW   AX
            SAHF
            JAE @loop
            FLDCW   [ESP+2].Word
            ADD     ESP, 4
            FFREE   ST(3)
            FFREE   ST(2)
            FFREE   ST(1)
            FFREE   ST(0)
            POP     ECX
            SUB     ECX, ESI
            SUB     EDX, ECX
            JBE     @done
            SUB     ESI, EDX
            MOV     AL, '0'
            ADD     ECX, EDX
            JMP     @z
      @zloop:
            MOV     [ESI+EDX].Byte, AL
      @z:
            DEC     EDX
            JNZ     @zloop
            MOV     [ESI].Byte, AL
      @done:
      End;
End;
 
Function VCL_IntToStr_ANSI(Value: Integer): AnsiString; OverLoad;
Begin
      Asm
            PUSH    ESI
            MOV     ESI, ESP
            SUB     ESP, 16
            XOR     ECX, ECX
            PUSH    EDX
            XOR     EDX, EDX
            CALL    VCL_CvtInt_ANSI
            MOV     EDX, ESI
            POP     EAX
            CALL    System.@LStrFromPCharLen
            ADD     ESP, 16
            POP     ESI
      End;
End;
 
Function VCL_IntToStr_ANSI(Value: Int64): AnsiString; OverLoad;
Begin
      Asm
            PUSH    ESI
            MOV     ESI, ESP
            SUB     ESP, 32
            XOR     ECX, ECX
            PUSH    EAX
            XOR     EDX, EDX
            LEA     EAX, Value
            CALL    VCL_CvtInt64_ANSI
            MOV     EDX, ESI
            POP     EAX
            CALL    System.@LStrFromPCharLen
            ADD     ESP, 32
            POP     ESI
      End;
End;


И специально для извращенцев афроамериканцев накалякано на коленке:
HandMade->IntegerToString()
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
Function IntegerToString(Value: Integer): String; OverLoad;
      Procedure Enum();
      Begin
      While Value<>0 Do
            Begin
            Result:=Char((Value Mod 10)+Ord('0'))+Result;
            Value:=Value Div 10;
            End;
      End;
Begin
If (Value=0) Then
      Result:='0'
Else
      Begin
      Result:='';
      If (Value<0) Then
            Begin
            Value:=-Value;
            Enum();
            Result:='-'+Result;
            End
      Else
            Enum();
      End;
End;
 
Function IntegerToString(Value: Int64): String; OverLoad;
      Procedure Enum();
      Begin
      While Value<>0 Do
            Begin
            Result:=Char((Value Mod 10)+Ord('0'))+Result;
            Value:=Value Div 10;
            End;
      End;
Begin
If (Value=0) Then
      Result:='0'
Else
      Begin
      Result:='';
      If (Value<0) Then
            Begin
            Value:=-Value;
            Enum();
            Result:='-'+Result;
            End
      Else
            Enum();
      End;
End;


Ну и просто для справки: лет пять назад я компилировал проекты в имеющейся версии FPC и эти же проекты в Делфи7. В том числе WinAPI-проекты. Старая Делфи7 компилила exe раза в 4 меньше. Правда по настройкам FPC я не спец, так, основные лишь задал. Но мож за пять лет что-то улучшили, как знать.
MyEternity
13.10.2016, 23:41
  #7

Не по теме:

Цитата Сообщение от BOGG ART Посмотреть сообщение
Старая Делфи7 компилила exe раза в 4 меньше.
Меня тоже волновали размеры EXE/DLL Но поставил студию 2015 Коммпьюнити, собрал C++ проект со статической линковкой, получил 2 метра exe, плюнул и перешел на Delphi 10+
EXE по 10-15 килобайт уже удел Asm (FASM, и пр), и только для СПЕЦ вещей).

Убежденный
Системный программист
Эксперт С++
15241 / 6873 / 1088
Регистрация: 02.05.2013
Сообщений: 11,254
Завершенные тесты: 1
14.10.2016, 11:20     WinApi, integer to string #8
Цитата Сообщение от MyEternity Посмотреть сообщение
Но поставил студию 2015 Коммпьюнити, собрал C++ проект со статической линковкой, получил 2 метра exe
В VS2015 пустой консольный проект C++ со статической компоновкой runtime
занимает от силы сотню килобайт.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.10.2016, 12:21     WinApi, integer to string
Еще ссылки по теме:

Автозагрузка на чистом WINAPI - Delphi WinAPI
Код: program Project1; uses Windows; {$R *.res} var myRegPath :String =...

Пустое окно на WinAPI - Delphi WinAPI
Как создать пустое окно на WinAPI???

WinApi и подсказки (ToolTips) - Delphi WinAPI
Пытаюсь разобраться как прикручиваются хинты к элементам интерфейса под WinApi... Чистые приложения на WinApi пишу давно (но не часто =),...

Простейшее приложение на WinAPI - Delphi WinAPI
Нашел код простейшего приложения на WinAPI uses Windows; var Msg: TMsg; Begin while LongInt(GetMessage( Msg, 0, 0, 0))&gt;0...

Кнопка с картинкой на WinApi - Delphi WinAPI
Исходник программы, показывающей пример создания стандартной системной кнопки с картинкой. Поддерживаются темы оформления для отрисовки....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
shar2atm
0 / 0 / 0
Регистрация: 06.02.2016
Сообщений: 1
18.10.2016, 12:21     WinApi, integer to string #9
Цитата Сообщение от elite001 Посмотреть сообщение
не подскажете, есть ли функция по переводу из интегера в стринг используя только модуль windows? асм вставки может какие?

А из SysUtils почему не взять?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
function IntTo2Str(Value: Integer): string;
//  FmtStr(Result, '%d', [Value]);
 
procedure Cvt2Int;
// Call
asm
        OR      CL,CL
        JNZ     @CvtLoop
@C1:    OR      EAX,EAX
        JNS     @C2
        NEG     EAX
        CALL    @C2
        MOV     AL,'-'
        INC     ECX
        DEC     ESI
        MOV     [ESI],AL
        RET
@C2:    MOV     ECX,10
 
@CvtLoop:
        PUSH    EDX
        PUSH    ESI
@D1:    XOR     EDX,EDX
        DIV     ECX
        DEC     ESI
        ADD     DL,'0'
        CMP     DL,'0'+10
        JB      @D2
        ADD     DL,('A'-'0')-10
@D2:    MOV     [ESI],DL
        OR      EAX,EAX
        JNE     @D1
        POP     ECX
        POP     EDX
        SUB     ECX,ESI
        SUB     EDX,ECX
        JBE     @D5
        ADD     ECX,EDX
        MOV     AL,'0'
        SUB     ESI,EDX
        JMP     @z
@zloop: MOV     [ESI+EDX],AL
@z:     DEC     EDX
        JNZ     @zloop
        MOV     [ESI],AL
@D5:
end;
 
 
asm
        PUSH    ESI
        MOV     ESI, ESP
        SUB     ESP, 16
        XOR     ECX, ECX       // base: 0 for signed decimal
        PUSH    EDX            // result ptr
        XOR     EDX, EDX       // zero filled field width: 0 for no leading zeros
        CALL    Cvt2Int
        MOV     EDX, ESI
        POP     EAX            // result ptr
        CALL    System.@LStrFromPCharLen
        ADD     ESP, 16
        POP     ESI
end;

Функция переименована в IntTo2Str, вызываемая процедура Cvt2Int - тоже.
Yandex
Объявления
18.10.2016, 12:21     WinApi, integer to string
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru