kolmck/KOL_ASM_NOUNICODE.inc
dkolmck 8255c47a3d +XE2 x32
git-svn-id: https://svn.code.sf.net/p/kolmck/code@110 91bb2d04-0c0c-4d2d-88a5-bbb6f4c1fa07
2011-11-29 08:02:49 +00:00

4352 lines
120 KiB
PHP

//------------------------------------------------------------------------------
// KOL_ASM_NOUNICODE.inc (to inlude in KOL.pas)
// v 3.141592
// this part of code is for case when ASM_VERSION is enabled and the symbol
// UNICODE_CTRLS is NOT defined (functions, procedures and methods which work
// with AnsiStrings only)
const comctl32_const: PKOLChar = 'comctl32';
InitCommonControlsEx_const: PKOLChar = 'InitCommonControlsEx';
procedure DoInitCommonControls( dwICC: DWORD );
asm
PUSH EAX // dwICC
CALL InitCommonControls
MOV EAX, [ComCtl32_Module]
TEST EAX, EAX
JNZ @@1
PUSH [comctl32_const]
CALL LoadLibrary
MOV [ComCtl32_Module], EAX
@@1:PUSH [InitCommonControlsEx_const]
PUSH EAX
CALL GetProcAddress
XCHG ECX, EAX
{$IFDEF SAFE_CODE}
POP EDX
JECXZ @@fin
PUSH EDX
{$ENDIF}
PUSH 8 // dwSize
PUSH ESP // @ ICC
CALL ECX // Proc( @ ICC )
POP ECX
POP ECX
@@fin:
end;
function ShowMsg( const S: KOLString; Flags: DWORD ): DWORD;
asm
push edx // Flags
mov ecx, [Applet]
{$IFDEF SNAPMOUSE2DFLTBTN}
{$IFDEF SAFE_CODE}
jecxz @@0
{$ENDIF}
pushad
xchg eax, ecx
mov edx, offset[WndProcSnapMouse2DfltBtn]
call TControl.AttachProc
popad
@@0:
{$ENDIF}
mov edx, 0
{$IFDEF SAFE_CODE}
jecxz @@1
{$ENDIF}
mov edx, [ecx].TControl.fHandle
mov ecx, [ecx].TControl.fCaption
@@1: push ecx // Title
push eax // S
push edx // Wnd
call MessageBox
{$IFDEF SNAPMOUSE2DFLTBTN}
mov ecx, [Applet]
{$IFDEF SAFE_CODE}
jecxz @@2
{$ENDIF}
pushad
xchg eax, ecx
mov edx, offset[WndProcSnapMouse2DfltBtn]
call TControl.DetachProc
popad
@@2:
{$ENDIF}
end;
procedure TGraphicTool.SetFontName(const Value: KOLString);
asm
PUSH EAX
LEA EAX, [EAX].fData.Font.Name
XOR ECX, ECX
MOV CL, 32
PUSH EAX
PUSH ECX
PUSH EDX
CALL StrLComp
//TEST EAX, EAX
POP EDX
POP ECX
POP EAX
JZ @@exit
CALL StrLCopy
POP EAX
PUSH EAX
CALL Changed
@@exit: POP EAX
end;
{$IFDEF TEXT_EXTENT_OLD}
function TCanvas.TextExtent(const Text: KOLString): TSize;
asm
PUSH EBX
PUSH ESI
MOV EBX, EAX
PUSH ECX
PUSH ECX // prepare @Result
MOV EAX, EDX
CALL System.@LStrLen
PUSH EAX // prepare Length(Text)
CALL EDX2PChar
PUSH EDX // prepare PChar(Text)
{$IFDEF SAFE_CODE}
MOV EAX, EBX
CALL RefInc
{$ENDIF}
PUSH HandleValid or FontValid
PUSH EBX
CALL RequiredState
XCHG ESI, EAX
TEST ESI, ESI // ESI = fHandle before
JNZ @@1
PUSH ESI
CALL CreateCompatibleDC
MOV EDX, EBX
XCHG EAX, EDX // EAX := @Self; EDX := DC
CALL SetHandle
//****************************************************** // Added By M.Gerasimov
CMP WORD PTR [EBX].TCanvas.fIsPaintDC, 0
JNZ @@2
XOR ESI,ESI
@@2:
//******************************************************
@@1:
PUSH HandleValid or FontValid
PUSH EBX
CALL RequiredState
PUSH EAX // prepare DC
CALL Windows.GetTextExtentPoint32A // KOL_ANSI
POP EDX // @ Result
{$IFDEF FIX_ITALIC_TEXT_WIDTH}
MOV ECX, [EBX].fFont
//JECXZ @@0
CMP [ECX].TGraphicTool.fData.Font.Italic, 0
JZ @@0
MOV EAX, [EDX].TSize.cy
SHR EAX, 2
ADD DWORD PTR [EDX], EAX
@@0: {$ENDIF}
TEST ESI, ESI
JNZ @@exit
XOR EDX, EDX
XCHG EAX, EBX
CALL SetHandle
@@exit:
{$IFDEF SAFE_CODE}
PUSH EAX
XCHG EAX, EBX
CALL RefDec
POP EAX
{$ENDIF}
POP ESI
POP EBX
end;
{$ELSE TEXT_EXTENT_NEW}
function TCanvas.TextExtent(const Text: KOLString): TSize;
asm
PUSH ESI
{$IFDEF FIX_ITALIC_TEXT_WIDTH}
PUSH EBX
MOV EBX, ECX
{$ENDIF}
XCHG ESI, EAX // ESI = @Self: PCanvas
CALL EDX2PChar
PUSH ECX
PUSH EDX
XCHG EAX, EDX
CALL StrLen
XCHG [ESP], EAX
PUSH EAX
PUSH HandleValid or FontValid
PUSH ESI
CALL TCanvas.RequiredState
PUSH [ESI].TCanvas.fHandle
CALL GetTextExtentPoint32
{$IFDEF FIX_ITALIC_TEXT_WIDTH}
CMP [ESI].TGraphicTool.fData.Font.Italic, 0
JZ @@1
MOV EAX, [EBX].TSize.cy
SHR EAX, 2
ADD DWORD PTR [EBX].TSize, EAX
@@1: POP EBX
{$ENDIF}
POP ESI
end;
{$ENDIF TEXT_EXTENT_NEW}
procedure TCanvas.TextOut(X, Y: Integer; const Text: KOLString); stdcall;
asm
PUSH EBX
MOV EBX, [EBP+8]
MOV EAX, [Text]
PUSH EAX
CALL System.@LStrLen
XCHG EAX, [ESP] // prepare Length(Text)
//CALL System.@LStrToPChar // string does not need to be null-terminated !
PUSH EAX // prepare PChar(Text)
PUSH [Y] // prepare Y
PUSH [X] // prepare X
PUSH HandleValid or FontValid or BrushValid or ChangingCanvas
PUSH EBX
CALL RequiredState
PUSH EAX // prepare fHandle
CALL Windows.TextOutA // KOL_ANSI
POP EBX
end;
function Int2Hex( Value : DWord; Digits : Integer ) : KOLString;
asm // EAX = Value
// EDX = Digits
// ECX = @Result
PUSH 0
ADD ESP, -0Ch
PUSH EDI
PUSH ECX
LEA EDI, [ESP+8+0Fh] // EBX := @Buf[ 15 ]
{$IFDEF SMALLEST_CODE}
{$ELSE}
AND EDX, $F
{$ENDIF}
@@loop: DEC EDI
DEC EDX
PUSH EAX
{$IFDEF PARANOIA} DB $24, $0F {$ELSE} AND AL, 0Fh {$ENDIF}
AAM
DB $D5, $11 //AAD
ADD AL, $30
STOSB
DEC EDI
POP EAX
SHR EAX, 4
JNZ @@loop
TEST EDX, EDX
JG @@loop
POP EAX // EAX = @Result
MOV EDX, EDI // EDX = @resulting string
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
POP EDI
ADD ESP, 10h
end;
function Hex2Int( const Value : AnsiString) : Integer;
asm
CALL EAX2PChar
PUSH ESI
XCHG ESI, EAX
XOR EDX, EDX
TEST ESI, ESI
JE @@exit
LODSB
{$IFDEF PARANOIA} DB $3C, '$' {$ELSE} CMP AL, '$' {$ENDIF}
JNE @@1
@@0: LODSB
@@1: TEST AL, AL
JE @@exit
{$IFDEF PARANOIA} DB $2C, '0' {$ELSE} SUB AL, '0' {$ENDIF}
{$IFDEF PARANOIA} DB $3C, 9 {$ELSE} CMP AL, '9' - '0' {$ENDIF}
JBE @@3
{$IFDEF PARANOIA} DB $2C, $11 {$ELSE} SUB AL, 'A' - '0' {$ENDIF}
{$IFDEF PARANOIA} DB $3C, 5 {$ELSE} CMP AL, 'F' - 'A' {$ENDIF}
JBE @@2
{$IFDEF PARANOIA} DB $2C, 32 {$ELSE} SUB AL, 32 {$ENDIF}
{$IFDEF PARANOIA} DB $3C, 5 {$ELSE} CMP AL, 'F' - 'A' {$ENDIF}
JA @@exit
@@2:
{$IFDEF PARANOIA} DB $04, 0Ah {$ELSE} ADD AL, 0Ah {$ENDIF}
@@3:
SHL EDX, 4
ADD DL, AL
JMP @@0
@@exit: XCHG EAX, EDX
POP ESI
end;
function Int2Str( Value : Integer ) : KOLString;
asm
XOR ECX, ECX
PUSH ECX
ADD ESP, -0Ch
PUSH EBX
LEA EBX, [ESP + 15 + 4]
PUSH EDX
CMP EAX, ECX
PUSHFD
JGE @@1
NEG EAX
@@1:
MOV CL, 10
@@2:
DEC EBX
XOR EDX, EDX
DIV ECX
ADD DL, 30h
MOV [EBX], DL
TEST EAX, EAX
JNZ @@2
POPFD
JGE @@3
DEC EBX
MOV byte ptr [EBX], '-'
@@3:
POP EAX
MOV EDX, EBX
{$IFDEF _D2009orHigher}
XOR ECX, ECX // TODO: safe to destory twice?
{$ENDIF}
CALL System.@LStrFromPChar
POP EBX
ADD ESP, 10h
end;
function Int2Ths( I : Integer ) : AnsiString;
asm
PUSH EBP
MOV EBP, ESP
PUSH EAX
PUSH EDX
CALL Int2Str
POP EDX
POP EAX
TEST EAX, EAX
JGE @@0
NEG EAX
@@0:
CMP EAX, 1000
JL @@Exit
PUSH EDX
MOV EAX, [EDX]
PUSH EAX
CALL System.@LStrLen // EAX = Length(Result)
POP EDX
PUSH EDX // EDX = @Result[ 1 ]
XOR ECX, ECX
@@1:
ROL ECX, 8
DEC EAX
MOV CL, [EDX+EAX]
JZ @@fin
CMP ECX, 300000h
JL @@1
PUSH ECX
XOR ECX, ECX
MOV CL, [ThsSeparator]
JMP @@1
@@fin: CMP CL, '-'
JNE @@fin1
CMP CH, [ThsSeparator]
JNE @@fin1
MOV CH, 0 // this corrects -,ddd,...
@@fin1: CMP ECX, 01000000h
JGE @@fin2
INC EAX
ROL ECX, 8
JMP @@fin1
@@fin2: PUSH ECX
LEA EDX, [ESP+EAX]
MOV EAX, [EBP-4]
{$IFDEF _D2009orHigher}
XOR ECX, ECX // TODO: safe to change ecx?
{$ENDIF}
CALL System.@LStrFromPChar
@@Exit:
MOV ESP, EBP
POP EBP
end;
function Int2Digs( Value, Digits : Integer ) : KOLString;
asm
PUSH EBP
MOV EBP, ESP
PUSH EDX // [EBP-4] = Digits
PUSH ECX
MOV EDX, ECX
CALL Int2Str
POP ECX
PUSH ECX // [EBP-8] = @Result
MOV EAX, [ECX]
PUSH EAX
CALL System.@LStrLen
POP EDX // EDX = @Result[1]
MOV ECX, EAX // ECX = Length( Result )
ADD EAX, EAX
SUB ESP, EAX
MOV EAX, ESP
PUSHAD
CALL StrCopy
POPAD
MOV EDX, EAX
ADD ESP, -100
CMP byte ptr [EDX], '-'
PUSHFD
JNE @@1
INC EDX
@@1:
MOV EAX, [EBP-4] // EAX = Digits
CMP ECX, EAX
JGE @@2
DEC EDX
MOV byte ptr [EDX], '0'
INC ECX
JMP @@1
@@2:
POPFD
JNE @@3
DEC EDX
MOV byte ptr [EDX], '-'
@@3:
MOV EAX, [EBP-8]
{$IFDEF _D2009orHigher}
XOR ECX, ECX // TODO: eax or ecx affect result?
{$ENDIF}
CALL System.@LStrFromPChar
MOV ESP, EBP
POP EBP
end;
function Num2Bytes( Value : Double ) : KOLString;
asm PUSH EBX
PUSH ESI
PUSH EDI
MOV EBX, ESP
MOV ESI, EAX
MOV ECX, 4
MOV EDX, 'TGMk'
@@1: FLD [Value]
@@10: FICOM dword ptr [@@1024]
FSTSW AX
SAHF
JB @@2
FIDIV dword ptr [@@1024]
FST [Value]
WAIT
TEST DL, 20h
JE @@ror
AND DL, not 20h
JMP @@nxt
@@1024: DD 1024
@@100: DD 100
@@ror: ROR EDX, 8
@@nxt: LOOP @@10
@@2: TEST DL, 20h
JZ @@3
MOV DL, 0
@@3: MOV DH, 0
PUSH DX
MOV EDI, ESP
FLD ST(0)
CALL System.@TRUNC
{$IFDEF _D2orD3}
PUSH 0
{$ELSE}
PUSH EDX
{$ENDIF}
PUSH EAX
FILD qword ptr [ESP]
POP EDX
POP EDX
MOV EDX, ESI
CALL Int2Str
FSUBP ST(1), ST
FIMUL dword ptr [@@100]
CALL System.@TRUNC
TEST EAX, EAX
JZ @@4
XOR ECX, ECX
MOV CL, 0Ah
CDQ
IDIV ECX
TEST EDX, EDX
JZ @@5
MOV AH, DL
SHL EAX, 16
ADD EAX, '00. '
PUSH EAX
MOV EDI, ESP
INC EDI
JMP @@4
@@5: SHL EAX, 8
ADD AX, '0.'
PUSH AX
MOV EDI, ESP
@@4: MOV EAX, [ESI]
CALL System.@LStrLen
ADD ESP, -100
SUB EDI, EAX
PUSH ESI
PUSH EDI
MOV ESI, [ESI]
MOV ECX, EAX
REP MOVSB
POP EDX
POP EAX
{$IFDEF _D2009orHigher}
XOR ECX, ECX // TODO: IDIV
{$ENDIF}
CALL System.@LStrFromPChar
MOV ESP, EBX
POP EDI
POP ESI
POP EBX
end;
function S2Int( S: PKOLChar ): Integer;
asm
XCHG EDX, EAX
XOR EAX, EAX
TEST EDX, EDX
JZ @@exit
XOR ECX, ECX
MOV CL, [EDX]
INC EDX
CMP CL, '-'
PUSHFD
JE @@0
@@1: CMP CL, '+'
JNE @@2
@@0: MOV CL, [EDX]
INC EDX
@@2: SUB CL, '0'
CMP CL, '9'-'0'
JA @@fin
LEA EAX, [EAX+EAX*4] //
LEA EAX, [ECX+EAX*2] //
JMP @@0
@@fin: POPFD
JNE @@exit
NEG EAX
@@exit:
end;
function Str2Int(const Value : KOLString) : Integer;
asm
CALL EAX2PChar
CALL S2Int
end;
function TrimLeft(const S: Ansistring): Ansistring;
asm
XCHG EAX, EDX
CALL EDX2PChar
DEC EDX
@@1: INC EDX
MOVZX ECX, byte ptr [EDX]
JECXZ @@fin
CMP CL, ' '
JBE @@1
@@fin:
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
end;
function TrimRight(const S: Ansistring): Ansistring;
asm
PUSH EDX
PUSH EAX
PUSH EAX
CALL System.@LStrLen
XCHG EAX, [ESP]
CALL EAX2PChar
POP ECX
INC ECX
@@1: DEC ECX
MOV DL, [EAX+ECX]
JL @@fin
CMP DL, ' '
JBE @@1
@@fin:
INC ECX
POP EAX
XOR EDX, EDX
INC EDX
CALL System.@LStrCopy
end;
function CopyEnd( const S : AnsiString; Idx : Integer ) : AnsiString;
asm
PUSH ECX
PUSH EAX
PUSH EDX
CALL System.@LStrLen
POP EDX
TEST EDX, EDX
JG @@1
XOR EDX, EDX
INC EDX
@@1:
SUB EAX, EDX
MOV ECX, EAX
POP EAX
JGE @@ret_end
POP EAX
JL System.@LStrClr
@@ret_end:
INC ECX
CALL System.@LStrCopy
end;
function CopyTail( const S : AnsiString; Len : Integer ) : AnsiString;
asm
PUSH ECX
PUSH EAX
PUSH EDX
CALL System.@LStrLen
POP ECX
CMP ECX, EAX
{$IFDEF USE_CMOV}
CMOVG ECX, EAX
{$ELSE}
JLE @@1
MOV ECX, EAX
@@1: {$ENDIF}
MOV EDX, EAX
SUB EDX, ECX
INC EDX
POP EAX
CALL System.@LStrCopy
end;
procedure DeleteTail( var S : AnsiString; Len : Integer );
asm
PUSH EAX
PUSH EDX
MOV EAX, [EAX]
CALL System.@LStrLen
POP ECX
CMP ECX, EAX
{$IFDEF USE_CMOV}
CMOVG ECX, EAX
{$ELSE}
JLE @@1
MOV ECX, EAX
@@1: {$ENDIF}
MOV EDX, EAX
SUB EDX, ECX
INC EDX
POP EAX
CALL System.@LStrDelete
end;
{$IFnDEF TEST_INDEXOFCHARS_COMPAT}
function IndexOfChar( const S : KOLString; Chr : KOLChar ) : Integer;
asm
CALL EAX2PChar
PUSH EAX
MOV ECX, [EAX-4]
CALL StrScanLen
POP EDX
JZ @@1
LEA EDX, [EAX+1]
@@1: SUB EAX, EDX
end;
{$ENDIF}
function IndexOfCharsMin( const S, Chars : AnsiString ) : Integer;
asm PUSH ESI
PUSH EBX
PUSH EAX
CALL EDX2PChar
MOV ESI, EDX
OR EBX, -1
MOV ECX, [EDX-4]
JECXZ @@EXIT
@@1: LODSB
XCHG EDX, EAX
POP EAX
PUSH EAX
PUSH ECX
CALL IndexOfChar
POP ECX
TEST EAX, EAX
JLE @@NEXT
TEST EBX, EBX
JLE @@ASGN
CMP EAX, EBX
JGE @@NEXT
@@ASGN:
XCHG EAX, EBX
@@NEXT: LOOP @@1
@@EXIT: XCHG EAX, EBX
POP ECX
POP EBX
POP ESI
end;
function Parse( var S : AnsiString; const Separators : AnsiString ) : AnsiString;
asm
PUSH EBX
PUSH ESI
PUSH EDI
MOV EDI, ECX
XCHG ESI, EAX
MOV EAX, [ESI]
CALL IndexOfCharsMin
XCHG EBX, EAX
TEST EBX, EBX
JG @@1
MOV EAX, [ESI]
CALL System.@LStrLen
XCHG EBX, EAX
INC EBX
@@1:
XOR EDX, EDX
INC EDX
PUSH EDX
PUSH EDI
MOV ECX, EBX
DEC ECX
MOV EAX, [ESI]
CALL System.@LStrCopy
XCHG EAX, ESI
MOV ECX, EBX
POP EDX
CALL System.@LStrDelete
POP EDI
POP ESI
POP EBX
end;
function _StrSatisfy( S, Mask : PKOLChar ) : Boolean;
asm
TEST EAX, EAX
JZ @@exit
XCHG ECX, EAX
// EDX <- Mask
// ECX <- S
XOR EAX, EAX
MOV AL, '*'
@@rest_satisfy:
PUSH ECX
PUSH EDX
@@nx_char:
MOV AH, [EDX]
OR AH, [ECX]
JZ @@fin //@@ret_true
MOV AH, 0
CMP word ptr [EDX], AX //'*'
JE @@fin //@@ret_true
CMP byte ptr [ECX], AH
JNE @@10
DEC EDX
@@1:
INC EDX
CMP byte ptr [EDX], AL //'*'
JE @@1
CMP byte ptr [EDX], AH
SETZ AL
JMP @@fin
@@10: CMP byte ptr [EDX], AH
JE @@ret_false
CMP byte ptr [EDX], '?'
JNE @@11
@@go_nx_char:
INC ECX
INC EDX
JMP @@nx_char
@@11:
CMP byte ptr [EDX], AL //'*'
JNE @@20
INC EDX
@@12: CMP byte ptr [ECX], AH
JE @@ret_false
CALL @@rest_satisfy
TEST AL, AL
JNE @@fin
MOV AL, '*'
INC ECX
JMP @@12
@@20: MOV AH, [EDX]
XOR AH, [ECX]
JE @@go_nx_char
@@ret_false:
XOR EAX, EAX
@@fin:
POP EDX
POP ECX
@@exit:
end;
function StrSatisfy( const S, Mask: AnsiString ): Boolean;
asm
PUSH ESI
TEST EAX, EAX
JZ @@exit
XCHG ESI, EAX
XCHG EAX, EDX
TEST EAX, EAX
JZ @@exit
CALL EAX2PChar
PUSH 0
MOV EDX, ESP
CALL AnsiLowerCase
XCHG EAX, ESI
CALL EAX2PChar
PUSH 0
MOV EDX, ESP
CALL AnsiLowerCase
POP EAX
POP EDX
PUSH EDX
PUSH EAX
CALL _StrSatisfy
XCHG ESI, EAX
CALL RemoveStr
CALL RemoveStr
XCHG EAX, ESI
@@exit:
POP ESI
end;
function _2StrSatisfy( S, Mask: PAnsiChar ): Boolean;
asm // //
PUSH EBX
PUSH ECX
XCHG EBX, EAX
PUSH 0
MOV EAX, ESP
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
PUSH 0
MOV EAX, ESP
MOV EDX, EBX
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
POP EAX
POP EDX
PUSH EDX
PUSH EAX
CALL StrSatisfy
XCHG EBX, EAX
CALL RemoveStr
CALL RemoveStr
XCHG EAX, EBX
POP ECX
POP EBX
end;
function SkipSpaces( P: PKOLChar ): PKOLChar;
asm
DEC EAX
@@loop: INC EAX
CMP byte ptr [EAX], 0
JE @@exit
CMP byte ptr [EAX], ' '
JBE @@loop
@@exit:
end;
function SkipParam(P: PKOLChar): PKOLChar;
asm
CALL SkipSpaces
@@while: CMP byte ptr [EAX], ' '
JBE @@exit
CMP byte ptr [EAX], '"'
JNE @@incP_goLoop
@@untilQuot:
INC EAX
CMP byte ptr [EAX], 0
JE @@exit
CMP byte ptr [EAX], '"'
JNE @@untilQuot
@@incP_goLoop:
INC EAX
JMP @@while
@@exit:
end;
function ParamCount: Integer;
asm
CALL GetCommandLine
OR EDX, -1
@@while: INC EDX
CALL SkipParam
CALL SkipSpaces
CMP byte ptr [EAX], 0
JNE @@while
XCHG EAX, EDX
end;
function __DelimiterLast( Str: PAnsiChar; Delimiters: PAnsiChar ): PAnsiChar;
asm
PUSH ESI
CALL EAX2PChar
MOV ESI, EDX
MOV EDX, EAX
@@tolast:
CMP byte ptr [EAX], 0
JZ @@next1
INC EAX
JMP @@tolast
@@next1:
PUSH EAX
@@next:
LODSB
TEST AL, AL
JZ @@exit
PUSH EDX
XCHG EDX, EAX
CALL StrRScan
POP EDX
TEST EAX, EAX
JZ @@next
POP ECX
CMP byte ptr [ECX], 0
JZ @@next1
CMP EAX, ECX
JG @@next1
PUSH ECX
JLE @@next
@@exit: POP EAX
POP ESI
end;
function DelimiterLast( const Str, Delimiters: KOLString ): Integer;
asm
CALL EAX2PChar
CALL EDX2PChar
PUSH EAX
CALL __DelimiterLast
POP EDX
SUB EAX, EDX
INC EAX
end;
function StrIsStartingFrom( Str, Pattern: PKOLChar ): Boolean;
asm
{$IFDEF F_P}
MOV EAX, [Str]
MOV EDX, [Pattern]
{$ENDIF F_P}
XOR ECX, ECX
@@1:
MOV CL, [EDX] // pattern[ i ]
INC EDX
MOV CH, [EAX] // str[ i ]
INC EAX
JECXZ @@2 // str = pattern; CL = #0, CH = #0
CMP CL, CH
JE @@1
@@2:
TEST CL, CL
SETZ AL
end {$IFDEF F_P} [ 'EAX', 'EDX', 'ECX' ] {$ENDIF};
function Format( const fmt: KOLString; params: array of const ): AnsiString;
asm
PUSH ESI
PUSH EDI
PUSH EBX
MOV EBX, ESP
{$IFDEF UNICODE_CTRLS}
ADD ESP, -2048
{$ELSE}
ADD ESP, -1024
{$ENDIF}
MOV ESI, ESP
INC ECX
JZ @@2
@@1:
MOV EDI, [EDX + ECX*8 - 8]
PUSH EDI
LOOP @@1
@@2:
PUSH ESP
PUSH EAX
PUSH ESI
CALL wvsprintf
MOV EDX, ESI
MOV EAX, @Result
{$IFDEF _D2009orHigher}
PUSH ECX
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
{$IFDEF _D2009orHigher}
POP ECX
{$ENDIF}
MOV ESP, EBX
POP EBX
POP EDI
POP ESI
end;
function FileExists( const FileName : KOLString ) : Boolean;
const size_TWin32FindData = sizeof( {$IFDEF UNICODE_CTRLS} TWin32FindDataW {$ELSE} TWin32FindDataA {$ENDIF} );
Size_TFindFileData = (sizeof(TFindFileData) + 3) and not 3;
asm
{$IFDEF FILE_EXISTS_EX}
PUSH EBX
MOV BL, 0
PUSH EAX
PUSH SEM_NOOPENFILEERRORBOX or SEM_FAILCRITICALERRORS
CALL SetErrorMode
XCHG EAX, [ESP]
SUB ESP, Size_TFindFileData
MOV EDX, ESP
CALL Find_First
TEST AL, AL
JZ @@fin
MOV EAX, ESP
CALL Find_Close
TEST byte ptr [ESP].TFindFileData.dwFileAttributes, FILE_ATTRIBUTE_DIRECTORY
JNZ @@fin
PUSH ESP
LEA EAX, [ESP+4].TFindFileData.ftLastWriteTime
PUSH EAX
CALL FileTimeToLocalFileTime
LEA EAX, [ESP+8]
PUSH EAX
INC EAX
INC EAX
PUSH EAX
SUB EAX, 10
PUSH EAX
CALL FileTimeToDOSDateTime
TEST EAX, EAX
SETNZ BL
@@fin: ADD ESP, Size_TFindFileData
CALL SetErrorMode
XCHG EAX, EBX
POP EBX
{$ELSE}
CALL EAX2PChar
PUSH EAX
CALL GetFileAttributes
INC EAX
JZ @@exit
DEC EAX
{$IFDEF PARANOIA} DB $24, FILE_ATTRIBUTE_DIRECTORY {$ELSE} AND AL, FILE_ATTRIBUTE_DIRECTORY {$ENDIF}
SETZ AL
@@exit:
{$ENDIF}
end;
function DiskPresent( const DrivePath: KOLString ): Boolean;
asm
PUSH EBX
MOV BH, 0
TEST EAX, EAX
JZ @@dirExists
CMP byte ptr [EAX], '\'
JZ @@dirExists
PUSH EAX
PUSH EAX
CALL GetDriveType
CMP AL, DRIVE_REMOVABLE
JE @@setErrMode
CMP AL, DRIVE_CDROM
JE @@setErrMode
CMP AL, DRIVE_RAMDISK
JNE @@popPath_dirExists
@@setErrMode:
INC BH
PUSH SEM_NOOPENFILEERRORBOX or SEM_FAILCRITICALERRORS
CALL SetErrorMode
XCHG [ESP], EAX
PUSH EAX
@@popPath_dirExists:
POP EAX
@@dirExists:
CALL DirectoryExists
MOV BL, AL
TEST BH, BH
JZ @@exit
CALL SetErrorMode
@@exit: XCHG EAX, EBX
POP EBX
end;
function GetStartDir : AnsiString;
asm
PUSH EBX
MOV EBX, EAX
XOR EAX, EAX
MOV AH, 2
SUB ESP, EAX
MOV EDX, ESP
PUSH EAX
PUSH EDX
PUSH 0
CALL GetModuleFileName // in KOL_ANSI
LEA EDX, [ESP + EAX]
@@1: DEC EDX
CMP byte ptr [EDX], '\'
JNZ @@1
INC EDX
MOV byte ptr [EDX], 0
MOV EAX, EBX
MOV EDX, ESP
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar // AnsiSafe!
ADD ESP, 200h
POP EBX
end;
function IncludeTrailingChar( const S: KOLString; C: KOLChar ): KOLString;
asm
push edx
push ecx
xchg ecx, eax
xchg edx, ecx
call System.@LStrAsg
pop eax
pop edx
mov ecx, [eax]
jecxz @@1
add ecx, [ecx-4]
dec ecx
cmp byte ptr [ecx], dl
jz @@exit
@@1:
push eax
push 0
mov eax, esp
{$IFDEF _D2009orHigher}
//push ecx
xor ecx, ecx
{$ENDIF}
call System.@LStrFromChar
{$IFDEF _D2009orHigher}
//pop ecx
{$ENDIF}
mov edx, [esp]
mov eax, [esp+4]
call System.@LStrCat
call RemoveStr
pop eax
@@exit:
end;
const
DirDelimiters: PAnsiChar = ':\/';
function ExtractFileName( const Path : AnsiString ) : AnsiString;
asm
PUSH EDX
PUSH EAX
MOV EDX, [DirDelimiters]
CALL __DelimiterLast
POP EDX
CMP byte ptr [EAX], 0
JZ @@1
XCHG EDX, EAX
INC EDX
@@1: POP EAX
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar // Safe!
end;
function ExtractFileNameWOext( const Path : KOLString ) : KOLString;
asm
push ebx
push edx
push eax
call ExtractFileName
pop edx // Path - �� ����� ������
mov eax, [esp] // eax = Result = ExtractFileName(Path)
mov eax, [eax]
push 0
mov edx, esp
call ExtractFileExt
mov eax, [esp]
call System.@LStrLen
xchg ebx, eax // ebx = Length(ExtractFileExt(Result))
call RemoveStr // ExtractFileExt - ������ �� �����
mov eax, [esp]
mov eax, [eax]
call System.@LStrLen // eax = Length(Result)
sub eax, ebx
xchg ecx, eax
xor edx, edx
inc edx
mov eax, [esp]
mov eax, [eax]
call System.@LStrCopy
pop ebx
end;
const
ExtDelimeters: PAnsiChar = '.';
function ExtractFileExt( const Path : KOLString ) : KOLString;
asm
PUSH EDX
MOV EDX, [ExtDelimeters]
CALL EAX2PChar
CALL __DelimiterLast
@@1: XCHG EDX, EAX
POP EAX
{$IFDEF _D2009orHigher}
PUSH ECX
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
{$IFDEF _D2009orHigher}
POP ECX // this routine hasn't touch ECX
{$ENDIF}
end;
function ReplaceExt( const Path, NewExt: KOLString ): KOLString;
asm
push ecx // result
push edx // NewExt
push eax // Path
push 0
mov edx, esp
call ExtractFilePath
pop eax
xchg [esp], eax // eax=Path, Path in stack replaced with ExtractFilePath(Path)
push 0
mov edx, esp
call ExtractFileNameWOext
// now stack conatins: result,NewExt,ExtractFilePath(Path),ExtractFileNameWOext(Path)<-ESP
mov eax, [esp+12]
mov edx, esp
push dword ptr [edx+4] // ExtractFilePath(Path)
push dword ptr [edx] // ExtractFileNameWOext(Path)
push dword ptr [edx+8] // NewExt
mov edx, 3
call System.@LStrCatN
call RemoveStr
call RemoveStr
pop ecx
pop ecx
end;
function GetSystemDir: KOLString;
asm
PUSH EBX
XCHG EBX, EAX
SUB ESP, MAX_PATH
MOV EAX, ESP
PUSH MAX_PATH
PUSH EAX
CALL GetSystemDirectory
MOV EAX, EBX
MOV EDX, ESP
CALL System.@LStrFromPChar
MOV EDX, EBX
MOV EAX, [EDX]
CALL IncludeTrailingPathDelimiter
ADD ESP, MAX_PATH
POP EBX
end;
function GetWindowsDir : KOLString;
asm
PUSH EBX
XCHG EBX, EAX
SUB ESP, MAX_PATH
MOV EAX, ESP
PUSH MAX_PATH
PUSH EAX
CALL GetWindowsDirectory
MOV EAX, EBX
MOV EDX, ESP
CALL System.@LStrFromPChar
MOV EDX, EBX
MOV EAX, [EDX]
CALL IncludeTrailingPathDelimiter
ADD ESP, MAX_PATH
POP EBX
end;
function GetWorkDir : KOLString;
asm
PUSH EBX
XCHG EBX, EAX
SUB ESP, MAX_PATH
PUSH ESP
PUSH MAX_PATH
CALL GetCurrentDirectory
MOV EAX, EBX
MOV EDX, ESP
CALL System.@LStrFromPChar
MOV EDX, EBX
MOV EAX, [EDX]
CALL IncludeTrailingPathDelimiter
ADD ESP, MAX_PATH
POP EBX
end;
function GetTempDir : KOLString;
asm
push eax
sub esp, 264
push esp
push 261
call GetTempPath
mov edx, esp
mov eax, [esp+264]
{$IFDEF _D2009orHigher}
xor ecx, ecx
{$ENDIF}
call System.@LStrFromPChar
add esp, 264
pop edx
mov eax, [edx]
call IncludeTrailingPathDelimiter
end;
function CreateTempFile( const DirPath, Prefix: KOLString ): KOLString;
asm
push ecx
call EAX2PCHAR
call EDX2PCHAR
sub esp, 264
push esp
push 0
push edx
push eax
call GetTempFileName
mov eax, [esp+264]
mov edx, esp
{$IFDEF _D2009orHigher}
xor ecx, ecx // ecx is argument
{$ENDIF}
call System.@LStrFromPChar
add esp, 268
end;
function FindFilter( const Filter: AnsiString): AnsiString;
asm
XCHG EAX, EDX
PUSH EAX
CALL System.@LStrAsg
POP EAX
CMP dword ptr [EAX], 0
JNE @@exit
LEA EDX, @@mask_all
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
JE System.@LStrFromPChar
@@mask_all: DB '*.*',0
@@exit:
end;
procedure TDirList.ScanDirectoryEx(const DirPath, Filters: AnsiString;
Attr: DWord);
asm
PUSH EBX
MOV EBX, EAX
PUSHAD
LEA EAX, [EBX].fFilters
CALL Free_And_Nil
CALL NewStrList
MOV [EBX].fFilters, EAX
POPAD
PUSHAD
PUSH 0
MOV EAX, ESP
MOV EDX, ECX
CALL System.@LStrLAsg
@@1: MOV ECX, [ESP]
JECXZ @@2
MOV EAX, ESP
MOV EDX, offset[@@semicolon]
PUSH 0
MOV ECX, ESP
CALL Parse
MOV EAX, [ESP]
MOV EDX, ESP
CALL Trim
POP EDX
PUSH EDX
TEST EDX, EDX
JZ @@filt_added
MOV EAX, [EBX].fFilters
CALL TStrList.Add
@@filt_added:
CALL RemoveStr
JMP @@1
// ';' string literal
{$IFDEF _D2009orHigher}
DW 0, 1
{$ENDIF}
DD -1, 1
@@semicolon:
DB ';',0
@@2: POP ECX
POPAD
XOR ECX, ECX
PUSH [Attr]
CALL ScanDirectory
POP EBX
@@exit:
end;
procedure _FillStrList; // ��� ����� ���� ����� ��� ���� ��������� ��������
asm
///////////////////////////////
OR EAX,0
JE @@EXIT //ERROR
// LEA EAX,[EAX-IniBufferSize]
// JE @@EXIT
// �������� �������� ������... � �������� �� ������ :)
// ���������� ��� ������...
@@LOOP:
LEA EAX,[ESI+4]
CALL StrLen
MOV [ESI],EAX
LEA EDX,[ESI+4]
INC EAX
ADD ESI,EAX
MOV EAX,EDI
CALL TStrList.ADD
CMP byte ptr [ESI+4],0
JNE @@LOOP
@@EXIT:
POP EAX
CALL System.@FreeMem
POP ECX
POP EBX
POP EDI
POP ESI
end;
procedure TIniFile.GetSectionNames(Names: PStrList);
asm
PUSH ESI
PUSH EDI
PUSH EBX
PUSH ECX
MOV EBX,EAX
MOV EAX, IniBufferStrSize
MOV EDI,EDX
CALL System.@GetMem
MOV ESI,EAX
PUSH EAX
PUSH [EBX].fFileName
MOV EAX,IniBufferSize
PUSH EAX
LEA EAX,[ESI+4]
PUSH EAX
CALL GetPrivateProfileSectionNames
JMP _FillStrList
end;
procedure TIniFile.SectionData(Names: PStrList);
asm
PUSH ESI
PUSH EDI
PUSH EBX
PUSH ECX
MOV EBX,EAX
MOV EAX, IniBufferStrSize
MOV EDI,EDX
CALL System.@GetMem
MOV ESI,EAX
PUSH EAX
OR [EBX].fMode,0
JNE @@DOWrite
PUSH [EBX].fFileName
MOV EAX,IniBufferSize
PUSH EAX
LEA EAX,[ESI+4]
PUSH EAX
PUSH [EBX].fSection
CALL GetPrivateProfileSection
JMP _FillStrList
@@DOWrite:
PUSH EBX
PUSH ESI
PUSH EDX
PUSH EBP
MOV EDX,0
MOV EBP,[EDI].TStrList.fCount
MOV EBX,IniBufferSize-2 // ������� ����� ��� #0#0
{ECM+++>} OR EBP,EBP // otherwise GetPChars when StrList.Count = 0 crashed
@@LOOP:
JE @@ENDLOOP
OR EBX,EBX
JE @@ENDLOOP
PUSH EDX
MOV EAX,EDI
CALL TStrList.GetPChars
PUSH EAX
CALL StrLen
POP EAX
XOR ECX,-1
MOV EDX,ESI
SUB EBX,ECX
JA @@L1
ADD ECX,EBX
XOR EBX,EBX
@@L1:
ADD ESI,ECX
CALL MOVE
@@L2:
POP EDX
INC EDX
DEC EBP
JMP @@LOOP
@@ENDLOOP:
MOV WORD PTR [ESI],0
POP EBP
POP EDX
POP ESI
POP EBX
MOV EAX,EBX
CALL ClearSection
PUSH [EBX].fFileName
PUSH ESI
PUSH [EBX].fSection
CALL WritePrivateProfileSection
POP EAX
CALL System.@FreeMem
POP ECX
POP EBX
POP EDI
POP ESI
end;
function _NewControl( AParent: PControl; ControlClassName: PKOLChar;
Style: DWORD; Ctl3D: Boolean;
Actions: TCommandActionsParam ): PControl;
const szActions = sizeof(TCommandActions);
asm
PUSH EBX
PUSH EAX // push AParent
PUSH ECX // push Style
MOVZX ECX, [Ctl3D]
PUSH [Actions]
CALL _NewWindowed
XCHG EBX, EAX
{$IFDEF USE_FLAGS}
OR [EBX].TControl.fFlagsG3, (1 shl G3_IsControl)
{$ELSE}
INC [EBX].TControl.fIsControl
{$ENDIF}
POP EDX // pop Style
OR EDX, WS_CLIPSIBLINGS or WS_CLIPCHILDREN
//INC [EBX].TControl.fVerticalAlign
MOV byte ptr [EBX].TControl.fLookTabKeys, $0F
TEST [EBX].TControl.fCtl3D_child, 1
JZ @@noCtl3D
AND EDX, not WS_BORDER
OR byte ptr [EBX].TControl.fExStyle + 1, WS_EX_CLIENTEDGE shr 8
@@noCtl3D:
MOV [EBX].TControl.fStyle, EDX
{$IFDEF USE_FLAGS}
{$ELSE}
TEST EDX, WS_VISIBLE
SETNZ AL
MOV [EBX].TControl.fVisible, AL
TEST EDX, WS_TABSTOP
SETNZ AL
MOV [EBX].TControl.fTabstop, AL
{$ENDIF USE_FLAGS}
POP ECX // pop AParent
JECXZ @@noParent
PUSH ESI
PUSH EDI
PUSH ECX
LEA ESI, [ECX].TControl.fMargin
LEA EDI, [EBX].TControl.fBoundsRect
LODSB
MOVSX EAX, AL
{$IFNDEF SMALLEST_CODE}
PUSH EAX
MOVSX ECX, byte ptr [ESI+2]
ADD EAX, ECX // AParent.fClientLeft
{$ENDIF}
STOSD // fBoundsRect.Left
{$IFNDEF SMALLEST_CODE}
POP EAX
PUSH EAX
MOVSX ECX, byte ptr [ESI+0]
ADD EAX, ECX // AParent.fClientTop
{$ENDIF}
STOSD // fBoundsRect.Top
{$IFNDEF SMALLEST_CODE}
XCHG EDX, EAX
POP EAX
{$ENDIF}
ADD EAX, 64
STOSD // fBoundsRect.Right
{$IFNDEF SMALLEST_CODE}
XCHG EAX, EDX
ADD EAX, 64
{$ENDIF}
STOSD // fBoundsRect.Bottom}
POP ECX
MOV EAX, [ECX].TControl.fCursor
STOSD
POP EDI
POP ESI
XCHG EAX, ECX
CALL TControl.ParentForm
XCHG ECX, EAX
JECXZ @@noParentForm
INC [ECX].TControl.fTabOrder
MOV DX, WORD PTR [ECX].TControl.fTabOrder
MOV WORD PTR [EBX].TControl.fTabOrder, DX
TEST [EBX].TControl.fStyle, WS_TABSTOP
JZ @@CurrentControl_set
CMP [ECX].TControl.DF.fCurrentControl, 0
JNZ @@CurrentControl_set
MOV [ECX].TControl.DF.fCurrentControl, EBX
@@CurrentControl_set:
@@noParentForm:
@@noParent:
MOVZX EDX, [CtlIdCount]
INC [CtlIdCount]
MOV [EBX].TControl.fMenu, EDX
MOV EDX, offset[WndProcCtrl]
MOV EAX, EBX
CALL TControl.AttachProc
XCHG EAX, EBX
POP EBX
{$IFDEF DEBUG_ALTSPC}
PUSH EAX
CALL DumpWindowed
POP EAX
{$ENDIF}
end;
const StaticClass: Array[0..6] of AnsiChar=('S','T','A','T','I','C',#0);
function NewLabel( AParent: PControl; const Caption: KOLString ): PControl;
asm
PUSH EDX
PUSH 0
{$IFDEF PACK_COMMANDACTIONS}
PUSH [LabelActions_Packed]
{$ELSE}
PUSH offset[LabelActions]
{$ENDIF}
MOV ECX, WS_VISIBLE or WS_CHILD or SS_LEFTNOWORDWRAP or SS_NOPREFIX or SS_NOTIFY
MOV EDX, offset[StaticClass]
CALL _NewControl
MOV word ptr [EAX].TControl.aAutoSzX, $101
{$IFDEF USE_FLAGS}
OR [EAX].TControl.fFlagsG1, (1 shl G1_SizeRedraw) or (1 shl G1_IsStaticControl)
{$ELSE}
INC [EAX].TControl.fIsStaticControl
INC [EAX].TControl.fSizeRedraw
{$ENDIF}
MOV EDX, [EAX].TControl.fBoundsRect.Top
ADD EDX, 22
MOV [EAX].TControl.fBoundsRect.Bottom, EDX
POP EDX
PUSH EAX
CALL TControl.SetCaption
POP EAX
{$IFDEF GRAPHCTL_XPSTYLES}
PUSH EAX
MOV EDX, offset[XP_Themes_For_Label]
CALL Attach_WM_THEMECHANGED
POP EAX
{$ENDIF}
end;
function NewGroupbox( AParent: PControl; const Caption: KOLString ): PControl;
asm
PUSH EDX
PUSH 0
{$IFDEF PACK_COMMANDACTIONS}
PUSH [ButtonActions_Packed]
{$ELSE}
PUSH offset[ButtonActions]
{$ENDIF}
MOV EDX, offset[ButtonClass]
MOV ECX, WS_VISIBLE or WS_CHILD or BS_GROUPBOX or WS_CLIPCHILDREN or WS_CLIPSIBLINGS
CALL _NewControl
OR [EAX].TControl.fExStyle, WS_EX_CONTROLPARENT
MOV EDX, [EAX].TControl.fBoundsRect.Left
ADD EDX, 100
MOV [EAX].TControl.fBoundsRect.Right, EDX
MOV EDX, [EAX].TControl.fBoundsRect.Top
ADD EDX, 100
MOV [EAX].TControl.fBoundsRect.Bottom, EDX
MOV byte ptr [EAX].TControl.fClientTop, 22
XOR EDX, EDX
{$IFDEF USE_FLAGS}
AND [EAX].TControl.fStyle.f2_Style, not(1 shl F2_Tabstop)
{$ELSE}
MOV [EAX].TControl.fTabstop, DL
{$ENDIF USE_FLAGS}
MOV DL, 2
ADD [EAX].TControl.fClientBottom, DL
ADD [EAX].TControl.fClientLeft, DL
ADD [EAX].TControl.fClientRight, DL
POP EDX
PUSH EAX
CALL TControl.SetCaption
POP EAX
PUSH EAX
{$IFDEF USE_FLAGS}
OR [EAX].TControl.fFlagsG5, 1 shl G5_IsGroupbox
{$ELSE}
INC [EAX].TControl.fIsGroupBox
{$ENDIF}
MOV EDX, offset[WndProcDoEraseBkgnd]
CALL TControl.AttachProc
POP EAX
{$IFDEF GRAPHCTL_XPSTYLES}
PUSH EAX
MOV EDX, offset[XP_Themes_For_GroupBox]
CALL Attach_WM_THEMECHANGED
POP EAX
{$ENDIF}
end;
function NewPanel( AParent: PControl; EdgeStyle: TEdgeStyle ): PControl;
const CreateStyle = WS_VISIBLE or WS_CHILD or SS_LEFTNOWORDWRAP or
SS_NOPREFIX or SS_NOTIFY;
asm
{$IFDEF GRAPHCTL_XPSTYLES}
MOVZX EDX, EdgeStyle
PUSH EDX
{$ENDIF}
PUSH EDX
MOV EDX, offset[StaticClass]
MOV ECX, CreateStyle
PUSH 0
{$IFDEF PACK_COMMANDACTIONS}
PUSH [LabelActions_Packed]
{$ELSE}
PUSH offset[LabelActions]
{$ENDIF}
CALL _NewControl
//INC byte ptr [EAX].TControl.aAutoSzX
//INC byte ptr [EAX].TControl.aAutoSzY
MOV word ptr [EAX].TControl.aAutoSzX, $101
ADD [EAX].TControl.fBoundsRect.Right, 100-64
ADD [EAX].TControl.fBoundsRect.Bottom, 100-64
OR byte ptr [EAX].TControl.fExStyle+2, 1
POP ECX
CMP CL, 1
JG @@exit
JE @@sunken
OR byte ptr [EAX].TControl.fStyle+2, $40
{$IFDEF GRAPHCTL_XPSTYLES}
JMP @@visual
{$ELSE}
RET
{$ENDIF}
@@sunken:
OR byte ptr [EAX].TControl.fStyle+1, $10
@@exit:
{$IFDEF GRAPHCTL_XPSTYLES}
@@visual:
CMP AppTheming, TRUE
JNE @@es_none_
CMP CL, 1
JG @@es_none_
JE @@not_sunken
AND byte ptr [EAX].TControl.fStyle+2, $00
JNE @@es_none_
@@not_sunken:
AND byte ptr [EAX].TControl.fStyle+1, $00
@@es_none_:
POP EDX
PUSH EAX
CALL TControl.SetEdgeStyle
POP EAX
PUSH EAX
MOV EDX, offset[XP_Themes_For_Panel]
CALL Attach_WM_THEMECHANGED
POP EAX
{$ENDIF}
end;
const ListBoxClass : Array[ 0..7 ] of AnsiChar = ( 'L','I','S','T','B','O','X',#0 );
function NewListbox( AParent: PControl; Options: TListOptions ): PControl;
asm
PUSH EAX
PUSH EDX
MOV EAX, ESP
MOV EDX, offset[ListFlags]
XOR ECX, ECX
MOV CL, 11
CALL MakeFlags
POP EDX
OR EAX, WS_VISIBLE or WS_CHILD or WS_TABSTOP or WS_BORDER or WS_VSCROLL or LBS_NOTIFY
XCHG ECX, EAX
POP EAX
PUSH 1
{$IFDEF PACK_COMMANDACTIONS}
PUSH [ListActions_Packed]
{$ELSE}
PUSH offset[ListActions]
{$ENDIF}
MOV EDX, offset[ListBoxClass]
CALL _NewControl
{$IFDEF PACK_COMMANDACTIONS}
MOV EDX, [EAX].TControl.fCommandActions
MOV [EDX].TCommandActionsObj.aClear, offset[ClearListbox]
{$ENDIF}
ADD [EAX].TControl.fBoundsRect.Right, 100
ADD [EAX].TControl.fBoundsRect.Bottom, 200-64
MOV [EAX].TControl.fColor, clWindow
MOV [EAX].TControl.fLookTabKeys, 3
end;
procedure CreateComboboxWnd( Combo: PControl );
//const PrevProcStr: PAnsiChar = 'PREV_PROC'; //************ Remarked By M.Gerasimov
asm
PUSH EDI
PUSH EBX
XCHG EBX, EAX
PUSH GW_CHILD
PUSH [EBX].TControl.fHandle
@@getwindow:
CALL GetWindow
TEST EAX, EAX
JZ @@fin
PUSH offset[WndFuncCombo]
PUSH GWL_WNDPROC
PUSH EAX
XCHG EDI, EAX
CALL SetWindowLong
PUSH EAX
PUSH offset [ID_PREVPROC] //
PUSH EDI
CALL SetProp
@@2getnext:
PUSH GW_HWNDNEXT
PUSH EDI
JMP @@getwindow
@@fin: POP EBX
POP EDI
end;
{$IFDEF WNDPROCTREEVIEW_OLDASMVERSION}
function WndProcTreeView( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
asm //cmd //opd
CMP word ptr [EDX].TMsg.message, WM_NOTIFY
JNZ @@ret_false
PUSH EBX
XCHG EBX, EAX
MOV EDX, [EDX].TMsg.lParam
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EBX].TControl.EV
LEA EAX, [EAX].TEvents.fOnTVBeginDrag
{$ELSE}
LEA EAX, [EBX].TControl.EV.fOnTVBeginDrag
{$ENDIF}
CMP word ptr [EDX].TNMTreeView.hdr.code, NM_RCLICK
JNE @@chk_TVN_BEGINDRAG
PUSH ECX
PUSH ECX
PUSH ESP
CALL GetCursorPos
MOV EAX, EBX
MOV EDX, ESP
MOV ECX, EDX
CALL TControl.Screen2Client
POP EAX
AND EAX, $FFFF
POP EDX
SHL EDX, 16
OR EAX, EDX
PUSH EAX
CALL GetShiftState
PUSH EAX
PUSH WM_RBUTTONUP
PUSH [EBX].TControl.fHandle
CALL PostMessage
JMP @@2fin_false1
@@chk_TVN_BEGINDRAG:
{$IFDEF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINDRAGW
JZ @@event_drag
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINRDRAGW
JZ @@event_drag
{$ENDIF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINDRAG
JZ @@event_drag
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINRDRAG
JNZ @@chk_BEGINLABELEDIT
@@event_drag:
MOV EDX, [EDX].TNMTreeView.itemNew.hItem
@@event_call:
MOV ECX, [EAX].TMethod.Code
JECXZ @@2fin_false1
MOV EAX, [EAX].TMethod.Data
XCHG EBX, ECX
XCHG EDX, ECX
CALL EBX
@@2fin_false1: JMP @@fin_false
@@chk_BEGINLABELEDIT:
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EBX].TControl.EV
LEA EAX, [EAX].TEvents.FOnTVBeginEdit
{$ELSE}
LEA EAX, [EBX].TControl.EV.fOnTVBeginEdit
{$ENDIF}
{$IFDEF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDITW
JZ @@beginlabeledit
{$ENDIF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDIT
JNZ @@chk_ITEMEXPANDED //@@chk_DELETEITEM
@@beginlabeledit:
{$IFDEF USE_FLAGS}
TEST [EBX].TControl.fFlagsG6, 1 shl G6_Dragging
{$ELSE}
CMP [EBX].TControl.fDragging, 0
{$ENDIF}
JZ @@allow_LABELEDIT
XOR EAX, EAX
INC EAX
MOV [ECX], EAX
JMP @@ret_true
@@allow_LABELEDIT:
PUSH ECX // @Rslt
MOV ECX, [EAX].TMethod.Code
JECXZ @@2fin_false1
PUSH EBX
XCHG EBX, ECX
MOV EDX, [EDX].TTVDispInfo.item.hItem
XCHG EDX, ECX
MOV EAX, [EAX].TMethod.Data
CALL EBX
TEST AL, AL
SETZ AL // Rslt := not event result;
POP EBX
JMP @@ret_EAX
@@call_EBX:
CALL EBX
@@2fin_false:
JMP @@fin_false
@@chk_ITEMEXPANDED:
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EBX].TControl.EV
LEA EAX, [EAX].TEvents.fOnTVExpanded
{$ELSE}
LEA EAX, [EBX].TControl.EV.fOnTVExpanded
{$ENDIF}
{$IFDEF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDEDW
JZ @@itemexpanded
{$ENDIF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDED
JNZ @@chk_SELCHANGING
@@itemexpanded:
MOV ECX, [EAX].TMethod.Code
JECXZ @@2fin_false
CMP [EDX].TNMTreeView.action, TVE_EXPAND
PUSH ECX
SETZ CL
XCHG ECX, [ESP]
JMP @@event_drag
@@chk_SELCHANGING:
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_SELCHANGING
JNE @@chk_ITEMEXPANDING
XCHG EAX, ECX
{$IFDEF EVENTS_DYNAMIC}
MOV ECX, [EBX].TControl.EV
MOV ECX, [ECX].TEvents.fOnTVSelChanging.TMethod.Code
{$ELSE}
MOV ECX, [EBX].TControl.EV.fOnTVSelChanging.TMethod.Code
{$ENDIF}
@@2fin_false2:
JECXZ @@2fin_false
PUSH EAX //@Rslt
PUSH [EDX].TNMTreeView.itemNew.hItem
XCHG ECX, EBX //EBX=OnTVSelChanging.Code ECX=Sender
XCHG ECX, EDX //EDX=Sender ECX=Msg
MOV ECX, [ECX].TNMTreeView.itemOld.hItem
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EDX].TControl.EV
MOV EAX, [EAX].TEvents.fOnTVSelChanging.TMethod.Data
{$ELSE}
MOV EAX, [EDX].TControl.EV.fOnTVSelChanging.TMethod.Data
{$ENDIF}
CALL EBX
XOR AL, 1
MOVZX EAX, AL
JMP @@ret_EAX
@@chk_ITEMEXPANDING:
{$IFDEF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDINGW
JZ @@itemexpanding
{$ENDIF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDING
JNE @@chk_ENDLABELEDIT
@@itemexpanding:
XCHG EAX, ECX
{$IFDEF EVENTS_DYNAMIC}
MOV ECX, [EBX].TControl.EV
MOV ECX, [ECX].TEvents.fOnTVExpanding.TMethod.Code
{$ELSE}
MOV ECX, [EBX].TControl.EV.fOnTVExpanding.TMethod.Code
{$ENDIF}
JECXZ @@2fin_false2
PUSH EAX // @Rslt
CMP [EDX].TNMTreeView.action, TVE_EXPAND
PUSH ECX
SETZ CL
XCHG ECX, [ESP]
XCHG ECX, EBX //EBX=OnTVExpanding.Code ECX=Seneder
XCHG EDX, ECX //ECX=Msg EDX=Sender
MOV ECX, [ECX].TNMTreeView.itemNew.hItem //ECX=Item
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EDX].TControl.EV
MOV EAX, [EAX].TEvents.fOnTVExpanding.TMethod.Data
{$ELSE}
MOV EAX, [EDX].TControl.EV.fOnTVExpanding.TMethod.Data //EAX=object
{$ENDIF}
@@111:
CALL EBX
@@ret_EAX:
POP EDX //EDX=@Rslt
MOVZX EAX, AL
NEG EAX
MOV [EDX], EAX
@@ret_true:
MOV AL, 1
POP EBX
RET
@@chk_ENDLABELEDIT:
{$IFDEF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ENDLABELEDITW
JZ @@endlabeledit
{$ENDIF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_ENDLABELEDIT
JNZ @@chk_SELCHANGED
@@endlabeledit:
XCHG EAX, ECX
{$IFDEF EVENTS_DYNAMIC}
MOV ECX, [EBX].TControl.EV
MOV ECX, [ECX].TEvents.fOnTVEndEdit.TMethod.Code
{$ELSE}
MOV ECX, [EBX].TControl.EV.fOnTVEndEdit.TMethod.Code
{$ENDIF}
JECXZ @@ret_1
PUSH EAX
PUSH EBX
PUSH 0
XCHG EDX, EBX
MOV EAX, [EBX].TTVDispInfo.item.pszText
PUSH EDX
PUSH ECX
XCHG EAX, EDX
{$IFDEF UNICODE_CTRLS}
CMP [EBX].TNMTreeView.hdr.code, TVN_ENDLABELEDITW
JNZ @@endlabeleditA
CALL TControl.TVGetItemTextW
JMP @@NewTxt_ready
@@endlabeleditA:
{$ENDIF UNICODE_CTRLS}
TEST EDX, EDX
JNZ @@prepare_NewTxt
// NewTxt := [EDX].TControl.TVItemText[ hItem ]
LEA ECX, [ESP + 8]
MOV EDX, [EBX].TTVDispInfo.item.hItem
CALL TControl.TVGetItemText
JMP @@NewTxt_ready
@@prepare_NewTxt:
LEA EAX, [ESP+8]
{$IFDEF _D2009orHigher}
PUSH ECX
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
{$IFDEF _D2009orHigher}
POP ECX
{$ENDIF}
@@NewTxt_ready:
POP ECX
POP EDX
POP EAX
PUSH EAX
PUSH EAX
{$IFDEF EVENTS_DYNAMIC}
MOV EAX, [EDX].TControl.EV
MOV EAX, [EAX].TEvents.fOnTVEndEdit.TMethod.Data
{$ELSE}
MOV EAX, [EDX].TControl.EV.fOnTVEndEdit.TMethod.Data
{$ENDIF}
MOV EBX, [EBX].TTVDispInfo.item.hItem
XCHG ECX, EBX
CALL EBX
XCHG EBX, EAX
CALL RemoveStr
XCHG EAX, EBX
POP EBX
JMP @@ret_EAX
@@ret_1:
INC ECX
MOV [EAX], ECX
JMP @@ret_true
@@chk_SELCHANGED:
{$IFDEF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_SELCHANGEDW
JZ @@selchanged
{$ENDIF UNICODE_CTRLS}
CMP word ptr [EDX].TNMTreeView.hdr.code, TVN_SELCHANGED
JNZ @@fin_false
@@selchanged:
XCHG EAX, EBX
CALL TControl.DoSelChange
@@fin_false:
POP EBX
@@ret_false:
XOR EAX, EAX
end;
{$ELSE NEW VERSION OF WndProcTreeView}
function WndProcTreeView( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
asm
PUSH ESI
PUSH EDI
MOV EDI, ECX // EDI -> Rslt
XOR ECX, ECX
CMP WORD PTR [EDX].TMsg.message, WM_NOTIFY
JNZ @@ret_false1
XCHG ESI, EAX
MOV EDX, [EDX].TMsg.lParam
CMP WORD PTR [EDX].TNMTreeView.hdr.code, NM_RCLICK
JNE @@chk_TVN_BEGINDRAG
PUSH ECX
PUSH ECX
PUSH ESP
CALL GetCursorPos
MOV EAX, ESI
MOV EDX, ESP
MOV ECX, EDX
CALL TControl.Screen2Client
POP EDX
POP EAX
SHLD EAX, EDX, 16
PUSH EAX
CALL GetShiftState
PUSH EAX
PUSH WM_RBUTTONUP
PUSH ESI
CALL TControl.PostMsg
JMP @@ret_false1
@@prepareCallEvent:
STC
MOV EDX, ESI
{$IFDEF EVENTS_DYNAMIC}
MOV ESI, [ESI].TControl.EV
LEA ECX, [ESI+ECX*8].TEvents.fOnTVBeginDrag
{$ELSE}
LEA ECX, [ESI+ECX*8].TControl.EV.fOnTVBeginDrag
{$ENDIF}
MOV EAX, [ECX].TMethod.Data
MOV ECX, [ECX].TMethod.Code
JECXZ @@noEvent
MOV ESI, ECX
AND EAX, EAX
@@noEvent:
RET
@@chk_TVN_BEGINDRAG: ///////////////////////////////////////////////////////////
CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINDRAG
JE @@beginDrag
CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINRDRAG
JNE @@chk_TVNBEGINLABELEDIT
@@beginDrag:
PUSH [EDX].TNMTreeView.itemNew.hItem
CALL @@prepareCallEvent
POP ECX
JC @@ret_false1
@@justEventCall:
CALL ESI
@@RsltEAX_ResultFalse:
MOV [EDI], EAX
XOR EAX, EAX
POP EDI
POP ESI
RET
@@chk_TVNBEGINLABELEDIT: ///////////////////////////////////////////////////////
INC ECX // -> FOnTVBeginEdit
CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDIT
JNE @@chk_ENDLABELEDIT
///////////////////////////////////////////////////////////////////////
XOR EAX, EAX
INC EAX
{$IFDEF USE_FLAGS}
TEST [ESI].TControl.fFlagsG6, 1 shl G6_Dragging
{$ELSE}
CMP [ESI].TControl.fDragging, 0
{$ENDIF}
JNZ @@rsltEAX_ResultTrue
PUSH [EDX].TTVDispInfo.item.hItem
CALL @@prepareCallEvent
POP ECX
JC @@ret_false1
CALL ESI
XOR AL, 1 //+Dufa
@@rsltEAX_ResultTrue:
MOV [EDI], AL //+VK
@@ResultTrue:
MOV AL, 1
POP EDI
POP ESI
RET
@@chk_ENDLABELEDIT:
INC ECX // -> fOnTVEndEdit
CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_ENDLABELEDIT
JNE @@chk_ITEMEXPANDING
MOV EAX, [EDX].TTVDispInfo.item.pszText
TEST EAX, EAX
JZ @@ResultTrue
PUSH EAX
PUSH [EDX].TTVDispInfo.item.hItem
CALL @@prepareCallEvent
POP ECX
//JNC @@justEventCall ---//dufa
JC @@ret_false1 //dufa
CALL ESI //dufa
JMP @@rsltEAX_ResultTrue //dufa
@@Rslt1_ResultTrue:
XOR EAX, EAX
INC EAX
JMP @@RsltEAX_ResultFalse
@@chk_ITEMEXPANDING: ///////////////////////////////////////////////////////////
INC ECX // -> FOnTVExpanding
CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDING
JNE @@chk_ITEMEXPANDED
@@expanding_expanded:
CMP [EDX].TNMTreeView.action, TVE_EXPAND
SETZ AL
PUSH EAX
PUSH [EDX].TNMTreeView.itemNew.hItem
@@event3:
CALL @@prepareCallEvent
POP ECX
JNC @@justEventCall
POP EAX
JMP @@ret_false1
@@chk_ITEMEXPANDED: ////////////////////////////////////////////////////////////
INC ECX // -> FOnTVExpanded
CMP [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDED
JE @@expanding_expanded
///////////////////////////////////////////////////////////////////////
INC ECX // -> FOnTVSelChanging
CMP [EDX].TNMTreeView.hdr.code, TVN_SELCHANGING
JNE @@chk_TVN_SELCHANGED
PUSH [EDX].TNMTreeView.itemNew.hItem
PUSH [EDX].TNMTreeView.itemOld.hItem
JMP @@event3
@@chk_TVN_SELCHANGED:
CMP [EDX].TNMTreeView.hdr.code, TVN_SELCHANGED
JNE @@ret_false1
XCHG EAX, ESI
CALL TControl.DoSelChange
@@ret_false1:
XOR EAX, EAX
POP EDI
POP ESI
end;
{$ENDIF}
function NewTabControl( AParent: PControl; const Tabs: array of PKOLChar; Options: TTabControlOptions;
ImgList: PImageList; ImgList1stIdx: Integer ): PControl;
const lenf=high(TabControlFlags); //+++
asm //cmd //opd
PUSH EBX
PUSH ESI
PUSH EDI
XCHG EBX, EAX
PUSH EDX
PUSH ECX
LEA EAX, [Options]
MOV EDX, offset[TabControlFlags]
XOR ECX, ECX
MOV CL, lenf
CALL MakeFlags
TEST byte ptr [Options], 4
JZ @@0
OR EAX, WS_TABSTOP or TCS_FOCUSONBUTTONDOWN
@@0: OR EAX, WS_CHILD or WS_CLIPSIBLINGS or WS_CLIPCHILDREN or WS_VISIBLE
XCHG ECX, EAX
XCHG EAX, EBX
MOV EDX, offset[WC_TABCONTROL]
PUSH 1
{$IFDEF PACK_COMMANDACTIONS}
PUSH [TabControlActions_Packed]
{$ELSE}
PUSH offset[TabControlActions]
{$ENDIF}
CALL _NewCommonControl
MOV EBX, EAX
TEST [Options], 2 shl (tcoBorder - 1)
JNZ @@borderfixed
AND [EBX].TControl.fExStyle, not WS_EX_CLIENTEDGE
@@borderfixed:
MOV EDX, offset[WndProcTabControl]
CALL TControl.AttachProc
ADD [EBX].TControl.fBoundsRect.Right, 100-64
ADD [EBX].TControl.fBoundsRect.Bottom, 100-64
MOV ECX, [ImgList]
JECXZ @@2
XCHG EAX, ECX
CALL TImageList.GetHandle
PUSH EAX
PUSH 0
PUSH TCM_SETIMAGELIST
PUSH EBX
CALL TControl.Perform
@@2:
POP EDI // EDI = High(Tabs)
POP ESI // ESI = Tabs
XOR EDX, EDX // EDX := 0 (=I)
MOV EAX, [ImgList1stIdx] //(=II)
@@loop:
CMP EDX, EDI
JG @@e_loop
PUSH EAX
PUSH EDX
PUSH EAX
LODSD
XCHG ECX, EAX
MOV EAX, EBX
CALL TControl.TC_Insert
POP EDX
POP EAX
INC EAX
INC EDX
JMP @@loop
@@e_loop:
MOV byte ptr [EBX].TControl.fLookTabKeys, 1
XCHG EAX, EBX
POP EDI
POP ESI
POP EBX
end;
function NewToolbar( AParent: PControl; Align: TControlAlign; Options: TToolbarOptions;
Bitmap: HBitmap; const Buttons: array of PKOLChar;
const BtnImgIdxArray: array of Integer ) : PControl;
const szTBButton = Sizeof( TTBButton );
Option3DBorder = 1 shl Ord( tbo3DBorder );
asm //cmd //opd
PUSH EDI
MOVZX EDX, DL
PUSH EDX // Align
PUSH EAX // AParent
XOR EAX, EAX
TEST CL, Option3DBorder
SETNZ AL
PUSH EAX
PUSH ECX // Options
MOV AL, ICC_BAR_CLASSES
CALL DoInitCommonControls
MOV EAX, ESP
MOV EDX, offset[ToolbarOptions]
XOR ECX, ECX
MOV CL, 6
CALL MakeFlags
POP EDX
{$IFDEF COMMANDACTIONS_OBJ}
PUSH TOOLBAR_ACTIONS
{$ELSE}
PUSH 0 //: actions : = nil
{$ENDIF}
XCHG ECX, EAX // ECX = MakeFlags(...)
MOV EDI, ECX
MOV EAX, [ESP+8] // EAX = AParent
MOV EDX, [ESP+12] // EDX = Align
OR ECX, [EDX*4+offset ToolbarAligns]
OR ECX, WS_CHILD or WS_VISIBLE or TBSTYLE_TOOLTIPS
MOV EDX, offset[ TOOLBARCLASSNAME ]
CALL _NewCommonControl
{$IFDEF COMMANDACTIONS_OBJ}
MOV EDX, [EAX].TControl.fCommandActions
MOV [EDX].TCommandActionsObj.aClear, offset[ClearToolbar]
MOV [EDX].TCommandActionsObj.aGetCount, TB_BUTTONCOUNT
{$ELSE}
MOV [EAX].TControl.fCommandActions.aClear, offset[ClearToolbar]
MOV [EAX].TControl.fCommandActions.aGetCount, TB_BUTTONCOUNT
{$ENDIF}
{$IFDEF USE_FLAGS}
OR [EAX].TControl.fFlagsG5, 1 shl G5_IsButton
{$ELSE}
INC [EAX].TControl.fIsButton
{$ENDIF}
POP EDX // pop AParent
POP EDX // EDX = Align
PUSH EDX
TEST EDX, EDX
JE @@zero_bounds
ADD [EAX].TControl.fBoundsRect.Bottom, 26-64
ADD [EAX].TControl.fBoundsRect.Right, 1000-64
JMP @@bounds_ready
@@zero_bounds:
MOV [EAX].TControl.fBoundsRect.Left, EDX
MOV [EAX].TControl.fBoundsRect.Top, EDX
MOV [EAX].TControl.fBoundsRect.Right, EDX
MOV [EAX].TControl.fBoundsRect.Bottom, EDX
@@bounds_ready:
PUSH EBX
PUSH ESI
XCHG EBX, EAX
MOV ESI, offset[TControl.Perform]
PUSH 0
PUSH 0
PUSH TB_GETEXTENDEDSTYLE
PUSH EBX
CALL ESI
OR EAX, TBSTYLE_EX_DRAWDDARROWS
PUSH EAX
PUSH 0
PUSH TB_SETEXTENDEDSTYLE
PUSH EBX
CALL ESI
MOV EDX, offset[WndProcToolbarCtrl]
MOV EAX, EBX
CALL TControl.AttachProc
MOV EDX, offset[WndProcDoEraseBkgnd]
MOV EAX, EBX
CALL TControl.AttachProc
PUSH 0
PUSH szTBButton
PUSH TB_BUTTONSTRUCTSIZE
PUSH EBX
CALL ESI
PUSH 0
MOVSX EAX, [EBX].TControl.fMargin
PUSH EAX
PUSH TB_SETINDENT
PUSH EBX
CALL ESI
MOV EAX, [ESP+8] // Align
{$IFDEF PARANOIA} DB $2C, 1 {$ELSE} SUB AL, 1 {$ENDIF}
JL @@bounds_correct
JE @@corr_right
{$IFDEF PARANOIA} DB $2C, 2 {$ELSE} SUB AL, 2 {$ENDIF}
JNE @@corr_bottom
@@corr_right:
MOV EDX, [EBX].TControl.fBoundsRect.Left
ADD EDX, 24
MOV [EBX].TControl.fBoundsRect.Right, EDX
JMP @@bounds_correct
@@corr_bottom:
MOV EDX, [EBX].TControl.fBoundsRect.Top
ADD EDX, 22
MOV [EBX].TControl.fBoundsrect.Bottom, EDX
@@bounds_correct:
{$IFnDEF TBBUTTONS_DFLT_NOAUTOSIZE}
MOV byte ptr [EBX].TControl.DF.fDefaultTBBtnStyle, TBSTYLE_AUTOSIZE
{$ENDIF}
MOV EDX, [Bitmap]
TEST EDX, EDX
JZ @@bitmap_added
MOV EAX, EBX
CALL TControl.TBAddBitmap
@@bitmap_added:
PUSH dword ptr [BtnImgIdxArray]
PUSH dword ptr [BtnImgIdxArray-4]
MOV ECX, [Buttons-4]
MOV EDX, [Buttons]
MOV EAX, EBX
CALL TControl.TBAddButtons
PUSH 0
PUSH 0
PUSH WM_SIZE
PUSH EBX
CALL ESI
// ---
{+|ecm|}
// ---
MOV EDX,EDI
OR EDX,[EBX].TControl.FStyle
MOV EAX,EBX
CALL TControl.SetStyle
// ---
{/+|ecm|}
// ---
XCHG EAX, EBX
POP ESI
POP EBX
POP EDX
POP EDI
end;
function WndProcDateTimePickerNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
type
TStrStr = record
param_Date: TDateTime;
param_PtrToAccept: PInteger;
Accept: Integer;
UserString: String;
end;
const Size_TStrStr = sizeof( TStrStr );
asm
PUSH ESI
PUSH EDI
MOV EDI, EDX
CMP WORD PTR [EDI].TMsg.message, WM_NOTIFY
JNZ @@ret_false
{$IFDEF EVENTS_DYNAMIC}
MOV ESI, [EAX].TControl.EV
{$ENDIF}
MOV ECX, [EDI].TMsg.lParam
MOV EDX, [ECX].TNMHdr.code
CMP EDX, DTN_DROPDOWN
JNZ @@chk_DTN_CLOSEUP
{$IFDEF EVENTS_DYNAMIC}
LEA ECX, [ESI].TEvents.fOnDropDown.TMethod.Code
{$ELSE}
LEA ECX, [EAX].TControl.EV.fOnDropDown.TMethod.Code
{$ENDIF}
@@event1:
MOV EDX, [ECX].TMethod.Data
MOV ECX, [ECX].TMethod.Code
{$IFDEF NIL_EVENTS}
JECXZ @@ret_false
{$ENDIF}
XCHG EAX, EDX
CALL ECX
JMP @@ret_false
@@chk_DTN_CLOSEUP: /////////////////////////////////////////////////////////////
{$IFDEF EVENTS_DYNAMIC}
LEA ECX, [ESI].TEvents.fOnCloseUp.TMethod.Code
{$ELSE}
LEA ECX, [EAX].TControl.EV.fOnCloseUp.TMethod.Code
{$ENDIF}
CMP EDX, DTN_CLOSEUP
JE @@event1
////////////////////////////////////////////////////////////////////////////////
{$IFDEF EVENTS_DYNAMIC}
LEA ECX, [ESI].TEvents.fOnChangeCtl.TMethod.Code
{$ELSE}
LEA ECX, [EAX].TControl.EV.fOnChangeCtl.TMethod.Code
{$ENDIF}
CMP EDX, DTN_DATETIMECHANGE
JE @@event1
CMP EDX, DTN_USERSTRING
JNE @@ret_false
////////////////////////////////////////////////////////////////////////////////
{$IFDEF EVENTS_DYNAMIC}
MOV ECX, [ESI].TEvents.fOnDTPUserString.TMethod.Code
MOV EDX, [ESI].TEvents.fOnDTPUserString.TMethod.Data
{$ELSE}
MOV ECX, [EAX].TControl.EV.fOnDTPUserString.TMethod.Code
MOV EDX, [EAX].TControl.EV.fOnDTPUserString.TMethod.Data
{$ENDIF}
{$IFDEF NIL_EVENTS}
JECXZ @@ret_false
{$ENDIF}
SUB ESP, Size_TStrStr
MOV ESI, ESP
PUSHAD
CALL TControl.GetDateTime
FSTP QWORD PTR [ESI].TStrStr.param_Date
WAIT
//POPAD
//PUSHAD
LEA EAX, [ESI].TStrStr.UserString
AND dword ptr [EAX], 0
MOV EDI, [EDI].TMsg.lParam
MOV EDX, [EDI].TNMDateTimeString.pszUserString
CALL System.@LStrFromPChar
LEA EAX, [ESI].TStrStr.Accept
MOV byte ptr [EAX], 1
MOV [ESI].TStrStr.param_PtrToAccept, EAX
POPAD
MOV ESI, ECX
MOV ECX, [ESI].TStrStr.UserString
XCHG EAX, EDX
CALL ESI
MOV EAX, [ESP].TStrStr.Accept
AND EAX, 1
MOV [EDI].TNMDateTimeString.dwFlags, EAX
LEA EAX, [ESI].TStrStr.UserString
CALL System.@LStrClr
ADD ESP, Size_TStrStr
@@ret_false:
XOR EAX, EAX
POP EDI
POP ESI
end;
function TControl.GetWindowHandle: HWnd;
asm
MOV ECX, [EAX].fHandle
JECXZ @@1
XCHG EAX, ECX
RET
@@1:
PUSH EBX
MOV EBX, EAX
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG4, 1 shl G4_CreateVisible
{$ELSE}
CMP [EBX].fCreateVisible, 0
{$ENDIF}
JNZ @@2
XOR EDX, EDX
CALL TControl.Set_Visible
MOV EAX, EBX
CALL CallTControlCreateWindow
{ This is a call to Pascal piece of code, which
calls virtual method TControl.CreateWindow }
{$IFDEF USE_FLAGS}
OR [EBX].fFlagsG4, 1 shl G4_CreateHidden
{$ELSE}
INC [EBX].fCreateHidden
{$ENDIF}
JMP @@0
@@2: CALL CallTControlCreateWindow
@@0: MOV EAX, [EBX].fHandle
POP EBX
end;
function TControl.CreateWindow: Boolean;
type PCreateWndParams = ^TCreateWndParams;
const
CS_OFF = CS_OWNDC or CS_CLASSDC or CS_PARENTDC or CS_GLOBALCLASS;
CS_ON = 0; //CS_VREDRAW or CS_HREDRAW;
szWndClass = sizeof( TWndClass );
int_IDC_ARROW = integer( IDC_ARROW );
asm
PUSH EBX
XCHG EBX, EAX
{$IFDEF DEBUG_CREATEWINDOW}
MOV EAX, EBX
CALL Debug_CreateWindow1
{$ENDIF}
MOV ECX, [EBX].fParent
JECXZ @@chk_handle
XCHG EAX, ECX
CALL GetWindowHandle
TEST EAX, EAX
JZ @@ret_0
@@chk_handle:
MOV ECX, [EBX].fHandle
JECXZ @@prepare_Params
MOV EAX, EBX
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG4, 1 shl G4_CreateHidden
{$ELSE}
CMP [EBX].fCreateHidden, 0
{$ENDIF}
JZ @@create_children
CALL CreateChildWindows
MOV EAX, EBX
MOV DL, 1
CALL Set_Visible
{$IFDEF USE_FLAGS}
AND [EBX].fFlagsG4, not(1 shl G4_CreateHidden)
{$ELSE}
MOV [EBX].fCreateHidden, 0
{$ENDIF}
JMP @@ret_true
@@create_children:
CALL CreateChildWindows
@@ret_true:
MOV AL, 1
@@ret_0:
POP EBX
RET
@@prepare_params:
{$IFDEF USE_GRAPHCTLS}
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG6, 1 shl G6_GraphicCtl
SETNZ AL
JNZ @@ret_0
{$ELSE}
MOV AL, [EBX].fWindowed
CMP AL, 0
JZ @@ret_0
{$ENDIF}
{$ENDIF}
PUSH EBP
MOV EBP, ESP
PUSH ECX // Params.WindowClass.lpszClassName := nil
PUSH ECX // Params.WindowClass.lpszMenuName := nil
PUSH ECX // Params.WindowClass.hbrBackground := 0
PUSH int_IDC_ARROW
PUSH ECX
CALL LoadCursor
PUSH EAX // Params.WindowClass.hCursor := LoadCursor( 0, IDC_ARROW )
XOR ECX, ECX
PUSH ECX // Params.WindowClass.hIcon := 0
PUSH [hInstance]// Params.WindowClass.hInstance := hInstance
PUSH ECX // Params.WindowClass.cbWndExtra := 0
PUSH ECX // Params.WindowClass.cbClsExtra := 0
{$IFDEF SAFE_CODE}
PUSH [EBX].fDefWndProc // Params.WindowClass.lpfnWndProc := fDefWndProc
{$ELSE}
PUSH 0
{$ENDIF}
PUSH [EBX].fClsStyle // Params.WindowClass.style := fStyle
ADD ESP, -64
PUSH ECX
MOV EAX, EBX
MOV EDX, ESP
CALL get_ClassName
POP EDX
MOV EAX, ESP
PUSH EDX
//CALL StrPCopy // StrPCopy( Params.WinClsNamBuf, ClassName )
CALL StrCopy
CALL RemoveStr
PUSH 0 // Params.Param := nil
PUSH [hInstance] // Params.Inst := hInstance
PUSH [EBX].fMenu // Params.Menu := fMenu
MOV DL, 1
MOV EAX, EBX
CALL GetParentWnd
PUSH EAX // Params.WndParent := GetParentWnd( True )
MOV ECX, CW_USEDEFAULT
MOV EAX, [EBX].fBoundsRect.Bottom
MOV EDX, [EBX].fBoundsRect.Top
SUB EAX, EDX
JNZ @@1
MOV EAX, ECX
@@1: PUSH EAX // Params.Height := Height | CW_UseDefault
MOV EAX, [EBX].fBoundsRect.Right
SUB EAX, [EBX].fBoundsRect.Left
{$IFDEF USE_CMOV}
CMOVZ EAX, ECX
{$ELSE}
JNZ @@2
MOV EAX, ECX
@@2: {$ENDIF}
PUSH EAX // Params.Width := Width | CW_UseDefault
MOV EAX, [EBX].fBoundsRect.Left
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG3, 1 shl G3_IsControl
{$ELSE}
CMP [EBX].fIsControl, CL
{$ENDIF}
JNZ @@3
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG2, (1 shl G2_ChangedPos)
{$ELSE}
TEST byte ptr [EBX].fChangedPosSz, 3
{$ENDIF USE_FLAGS}
JNZ @@3
MOV EDX, ECX
XCHG EAX, ECX
@@3: PUSH EDX // Params.Y := Top | CW_UseDefault
PUSH EAX // Params.X := Left | CW_UseDefault
PUSH [EBX].fStyle // Params.Style := fStyle
PUSH [EBX].fCaption // Params.Caption := fCaption
LEA EAX, [ESP+40]
PUSH EAX // Params.WinClassName := @Params.WinClsNamBuf
PUSH [EBX].fExStyle // Params.ExStyle := fExStyle
MOV ECX, [EBX].fControlClassName
JECXZ @@registerClass
LEA EAX, [ESP].TCreateWndParams.WindowClass
PUSH EAX // @Params.WindowClass
PUSH ECX // fControlClassName
PUSH [hInstance] // hInstance
CALL GetClassInfo
MOV EAX, [ESP].TCreateWndParams.Inst
MOV [ESP].TCreateWndParams.WindowClass.hInstance, EAX
AND [ESP].TCreateWndParams.WindowClass.style, not CS_OFF
@@registerClass:
CMP [EBX].fDefWndProc, 0
JNE @@fDefWndProc_ready
MOV EAX, [ESP].TCreateWndParams.WindowClass.lpfnWndProc
MOV [EBX].fDefWndProc, EAX
@@fDefWndProc_ready:
MOV ECX, [ESP].TCreateWndParams.WndParent
TEST ECX, ECX
JNZ @@registerClass1
TEST byte ptr [ESP].TCreateWndParams.Style+3, $40
XCHG EAX, ECX
JNZ @@fin
@@registerClass1:
MOV EAX, [ESP].TCreateWndParams.WinClassName
MOV EDX, [ESP].TCreateWndParams.WindowClass.hInstance
ADD ESP, -szWndClass
PUSH ESP
PUSH EAX
PUSH EDX
CALL GetClassInfo
ADD ESP, szWndClass
TEST EAX, EAX
JNZ @@registered
MOV EAX, [ESP].TCreateWndParams.WinClassName
MOV [ESP].TCreateWndParams.WindowClass.lpszClassName, EAX
MOV [ESP].TCreateWndParams.WindowClass.lpfnWndProc, offset WndFunc
LEA EAX, [ESP].TCreateWndParams.WindowClass
PUSH EAX
CALL RegisterClass
TEST EAX, EAX
JZ @@fin
@@registered:
MOV [CreatingWindow], EBX
{$IFDEF DEBUG_CREATEWINDOW}
MOV EAX, EBX
MOV EDX, ESP
CALL Debug_CreateWindow2
{$ENDIF}
CALL CreateWindowEx
MOV [EBX].fHandle, EAX
TEST EAX, EAX
JZ @@fin
PUSH EAX
{$IFDEF USE_PROP}
PUSH offset ID_SELF
{$ELSE}
PUSH GWL_USERDATA
{$ENDIF}
PUSH EAX
PUSH 0
PUSH $10002 //UIS_CLEAR or (UISF_HIDEFOCUS shl 16)
PUSH $0128 //WM_UPDATEUISTATE
PUSH EAX
CALL SendMessage
{$IFDEF USE_PROP}
CALL GetProp
{$ELSE}
CALL GetWindowLong
{$ENDIF}
XCHG ECX, EAX
POP EAX
INC ECX
LOOP @@propSet
MOV [CreatingWindow], ECX
PUSH EBX
{$IFDEF USE_PROP}
PUSH offset ID_SELF
PUSH EAX
CALL SetProp
{$ELSE}
PUSH GWL_USERDATA
PUSH EAX
CALL SetWindowLong
{$ENDIF}
@@propSet:
{$IFDEF SMALLEST_CODE}
{$ELSE}
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG3, 1 shl G3_IsControl
{$ELSE}
CMP [EBX].fIsControl, 0
{$ENDIF}
JNZ @@iconSet
MOV EAX, EBX
CALL GetIcon
PUSH EAX
PUSH 1
PUSH WM_SETICON
PUSH EBX
CALL Perform
@@iconSet:
{$ENDIF}
MOV ECX, [EBX].PP.fCreateWndExt
{$IFDEF NIL_EVENTS}
JECXZ @@dblbufcreate
{$ENDIF}
MOV EAX, EBX
CALL ECX
@@dblbufcreate:
@@applyfont:
MOV EAX, EBX
CALL [ApplyFont2Wnd_Proc]
MOV EAX, EBX
CALL [ApplyFont2Wnd_Proc]
@@createchildren:
XCHG EAX, EBX
CALL CreateChildWindows
MOV AL, 1
@@fin:
MOV ESP, EBP
POP EBP
@@ret_false:
POP EBX
end;
function WndProcKeybd( Self_: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
asm
PUSH EBX
MOV ECX, [EDX].TMsg.message
SUB CX, $100
CMP ECX, 5
JA @@fin_false
XCHG EBX, EAX // EBX = @Self
XCHG EAX, ECX // EAX = message - WM_KEYFIRST
{$IFDEF EVENTS_DYNAMIC}
MOV ECX, [EBX].TControl.EV
LEA ECX, [ECX].TEvents.fOnKeyUp
{$ELSE}
LEA ECX, [EBX].TControl.EV.fOnKeyUp
{$ENDIF}
JZ @@event
{$IFDEF PARANOIA} DB $34, 1 {$ELSE} XOR AL, 1 {$ENDIF}
JZ @@event
//LEA ECX, [EBX].TControl.EV.fOnKeyDown
ADD ECX, 8
{$IFDEF PARANOIA} DB $34, 1 {$ELSE} XOR AL, 1 {$ENDIF}
JZ @@event
{$IFDEF PARANOIA} DB $34, 4 {$ELSE} XOR AL, 4 {$ENDIF}
JZ @@event
//LEA ECX, [EBX].TControl.EV.fOnChar
SUB ECX, 24
{$IFDEF PARANOIA} DB $34, 6 {$ELSE} XOR AL, 2 xor 4 {$ENDIF}
JZ @@event
{$IFDEF PARANOIA} DB $34, 4 {$ELSE} XOR AL, 6 xor 2 {$ENDIF}
JNZ @@fin_false
@@event:
{$IFDEF NIL_EVENTS}
CMP word ptr [ECX].TMethod.Code+2, 0
JZ @@fin_false
{$ENDIF}
PUSH EDX
PUSH ECX
LEA ECX, [EDX].TMsg.wParam
PUSH ECX
CALL GetShiftState
POP ECX // @wParam
XCHG EAX, [ESP] // ShiftState; EAX=@event
MOV EDX, EBX // @Self
MOV EBX, [EAX].TMethod.Code
MOV EAX, [EAX].TMethod.Data
CALL EBX
POP EDX
MOV ECX, [EDX].TMsg.wParam
JECXZ @@fin_true
@@fin_false:
XOR EAX, EAX
POP EBX
RET
@@fin_true:
MOV AL, 1
POP EBX
end;
function TControl.GetCaption: KOLString;
asm
PUSH EBX
PUSH EDI
XCHG EBX, EAX
MOV EDI, EDX
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG1, (1 shl G1_IgnoreWndCaption)
{$ELSE}
CMP [EBX].fIgnoreWndCaption, 0
{$ENDIF USE_FLAGS}
JNZ @@getFCaption
MOV ECX, [EBX].fHandle
JECXZ @@getFCaption
@@getWndCaption:
PUSH ECX
CALL GetWindowTextLength
PUSH EAX
XCHG EDX, EAX
LEA EAX, [EBX].fCaption
CALL System.@LStrSetLength
POP ECX
JECXZ @@getFCaption
INC ECX
PUSH ECX
PUSH [EBX].fCaption
PUSH [EBX].fHandle
CALL GetWindowText
@@getFCaption:
MOV EDX, [EBX].fCaption
XCHG EAX, EDI
{$IFNDEF UNICODE_CTRLS}
CALL System.@LStrAsg
{$ELSE}
CALL System.@WStrFromPChar
{$ENDIF}
@@exit:
POP EDI
POP EBX
end;
function TControl.get_ClassName: AnsiString;
asm
PUSH EBX
XCHG EBX, EAX
XCHG EAX, EDX
MOV EDX, [EBX].fControlClassName
PUSH EAX
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar // EAX^ := String(EDX)
POP EAX
{$IFDEF USE_FLAGS}
TEST [EBX].fFlagsG6, 1 shl G6_CtlClassNameChg
{$ELSE}
CMP [EBX].fCtlClsNameChg, 0
{$ENDIF}
JNZ @@exit
MOV ECX, [EAX]
MOV EDX, offset[ @@obj ]
CALL System.@LStrCat3 // EAX^ := EDX + ECX
JMP @@exit
{$IFDEF _D2009orHigher}
DW 1252, 1 // CP_ANSI_LATIN1, Byte // TODO: CP_ACP
{$ENDIF}
DD -1, 4 // FFFFFFFF 04000000 obj_, 0
@@obj: DB 'obj_', 0
@@exit:
POP EBX
end;
function TControl.GetItems(Idx: Integer): AnsiString;
asm
PUSH ESI
PUSH EDI
PUSH EBX
PUSH EBP
MOV EBP, ESP
MOV EBX, EAX // @Self
MOV ESI, EDX // Idx
MOV EDI, ECX // @Result
CALL Item2Pos
PUSH 0 // push 0
PUSH EAX // store Pos
XCHG EDX, EAX
MOV EAX, EBX
CALL Pos2Item // EAX = Idx'
XCHG ESI, EAX // ESI = Idx'
XOR EAX, EAX
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EBX].fCommandActions
MOVZX ECX, [ECX].TCommandActionsObj.aGetItemLength
{$ELSE}
MOVZX ECX, [EBX].fCommandActions.aGetItemLength
{$ENDIF}
JECXZ @@ret_empty
PUSH ECX // push aGetItemLength
PUSH EBX
CALL Perform
TEST EAX, EAX
JZ @@ret_empty
PUSH EAX // save L
ADD EAX, 4
CALL System.@GetMem // GetMem( L+4 )
POP EDX // restore L
LEA ECX, [EDX+1]
MOV dword ptr [EAX], ECX
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EBX].fCommandActions
MOVZX ECX, [ECX].TCommandActionsObj.aGetItemText
{$ELSE}
MOVZX ECX, [EBX].fCommandActions.aGetItemText
{$ENDIF}
JECXZ @@ret_buf
PUSH EDX // save L
PUSH EAX
PUSH EAX // push Buf
PUSH ESI // push Idx
PUSH ECX // push aGetItemText
PUSH EBX
CALL Perform
POP EAX
POP EDX
@@ret_buf:
MOV byte ptr [EAX + EDX], 0 // Buf[ L ] := #0
@@ret_empty: // EAX = 0
XCHG EDX, EAX
MOV EAX, EDI
PUSH EDX
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
POP ECX
JECXZ @@exit
XCHG EAX, ECX
CALL System.@FreeMem
@@exit:
MOV ESP, EBP
POP EBP
POP EBX
POP EDI
POP ESI
end;
procedure TControl.SetItems(Idx: Integer; const Value: AnsiString);
asm
PUSH EDI
PUSH EBX
XCHG EBX, EAX
XCHG EDI, EDX // EDI = Idx
CALL ECX2PChar
PUSH ECX // @Value[1]
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EBX].fCommandActions
MOVZX ECX, [ECX].TCommandActionsObj.aSetItemText
{$ELSE}
MOVZX ECX, [EBX].fCommandActions.aSetItemText
{$ENDIF}
JECXZ @@1
PUSH 0
PUSH ECX
MOV EDX, EDI
MOV EAX, EBX
CALL Item2Pos
PUSH EAX // store Strt
MOV EDX, EDI
INC EDX
MOV EAX, EBX
CALL Item2Pos
POP EDX // EDX = Strt
SUB EAX, EDX
PUSH EAX // store L
MOV EAX, EBX
CALL SetSelStart
POP EDX // EDX = L
PUSH EBX // prepare @Self for Perform
XCHG EAX, EBX
CALL SetSelLength
// @Value[1] already in stack,
// 0 already in stack
// aSetItemText already in stack
// @Self already in stack
CALL Perform
JMP @@exit
@@1: // @Value[1] in stack already
POP EDX
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EBX].fCommandActions
MOVZX ECX, [ECX].TCommandActionsObj.aDeleteItem
{$ELSE}
MOVZX ECX, [EBX].fCommandActions.aDeleteItem
{$ENDIF}
JECXZ @@exit
{$IFNDEF NOT_FIX_CURINDEX}
PUSH ESI
PUSH EBP
PUSH EDX
MOV EAX, EBX // +AK
CALL GetCurIndex // +AK
XCHG ESI, EAX // ESI = TmpCurIdx
MOV EAX, EBX
MOV EDX, EDI
CALL GetItemData
XCHG EBP, EAX // EBP = TmpData
MOV EDX, EDI
MOV EAX, EBX
CALL Delete
MOV EAX, EBX // *AK
MOV EDX, EDI
POP ECX
CALL Insert
MOV ECX, EBP // ECX = TmpData
MOV EDX, EDI
MOV EAX, EBX
CALL SetItemData
XCHG EAX, EBX // +AK
MOV EDX, ESI // +AK
CALL SetCurIndex // +AK
POP EBP
POP ESI
{$ELSE NOT_FIX_CURINDEX}
PUSH EDX
MOV EDX, EDI
MOV EAX, EBX
CALL Delete
XCHG EAX, EBX
XCHG EDX, EDI
POP ECX
CALL Insert
{$ENDIF NOT_FIX_CURINDEX}
@@exit:
POP EBX
POP EDI
end;
function TControl.Add(const S: KOLString): Integer;
asm
PUSH EBX
MOV EBX, EAX // EBX = @Self
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EBX].fCommandActions
MOVZX ECX, [ECX].TCommandActionsObj.aAddItem
{$ELSE}
MOVZX ECX, [EBX].fCommandActions.aAddItem // ECX = aAddItem
{$ENDIF}
JECXZ @@chk_addtext
CALL EDX2PChar
PUSH EDX
PUSH 0
PUSH ECX
PUSH EBX
CALL Perform
PUSH EAX
MOV EAX, EBX
CALL TControl.GetItemsCount
XCHG EAX, ECX
LOOP @@ret_EAX
XCHG EAX, EBX
INC ECX
XOR EDX, EDX
CALL TControl.SetItemSelected
@@ret_EAX:
POP EAX
JMP @@exit
@@chk_addtext:
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EBX].fCommandActions
MOV ECX, [ECX].TCommandActionsObj.aAddText
{$ELSE}
MOV ECX, [EBX].fCommandActions.aAddText
{$ENDIF}
JECXZ @@add_text_simple
CALL ECX
JMP @@exit_0
@@add_text_simple:
LEA EAX, [EBX].fCaption
CALL System.@LStrCat
MOV EDX, [EBX].fCaption
MOV EAX, EBX
CALL SetCaption
@@exit_0:
XOR EAX, EAX
@@exit:
POP EBX
end;
function TControl.Insert(Idx: Integer; const S: AnsiString): Integer;
asm
CALL ECX2PChar
PUSH ECX
{$IFDEF COMMANDACTIONS_OBJ}
MOV ECX, [EAX].fCommandActions
MOVZX ECX, [ECX].TCommandActionsObj.aInsertItem
{$ELSE}
MOVZX ECX, [EAX].fCommandActions.aInsertItem
{$ENDIF}
JECXZ @@exit_1
PUSH EDX
PUSH ECX
PUSH EAX
CALL Perform
RET
@@exit_1:OR EAX, -1
POP ECX
end;
procedure TTrayIcon.SetTooltip(const Value: AnsiString);
asm
PUSH EBX
XCHG EBX, EAX
MOV EAX, [EBX].fTooltip
PUSH EDX
CALL System.@LStrCmp
POP EDX
JE @@exit
LEA EAX, [EBX].fTooltip
CALL System.@LStrAsg
CMP [EBX].fActive, 0
JE @@exit
XOR EDX, EDX
INC EDX // EDX = NIM_MODIFY
XCHG EAX, EBX
CALL SetTrayIcon
@@exit:
POP EBX
end;
procedure TTrayIcon.SetTrayIcon(const Value: DWORD);
const sz_tid = sizeof( TNotifyIconData );
asm
CMP [AppletTerminated], 0
JE @@1
MOV DL, NIM_DELETE
@@1:
PUSH EBX
PUSH ESI
MOV ESI, EAX
MOV EBX, EDX
XOR ECX, ECX
PUSH ECX
ADD ESP, -60
MOV EDX, [ESI].fToolTip
CALL EDX2PChar
MOV EAX, ESP
MOV CL, 63
CALL StrLCopy
PUSH [ESI].fIcon
PUSH CM_TRAYICON
XOR EDX, EDX
CMP BL, NIM_DELETE
JE @@2
MOV DL, NIF_ICON or NIF_MESSAGE or NIF_TIP
@@2: PUSH EDX
PUSH ESI
MOV EAX, [ESI].FWnd
TEST EAX, EAX
JNZ @@3
MOV EAX, [ESI].fControl
MOV EAX, [EAX].TControl.fHandle
@@3:
PUSH EAX
PUSH sz_tid
PUSH ESP
PUSH EBX
CALL Shell_NotifyIcon
ADD ESP, sz_tid
POP ESI
POP EBX
@@exit:
end;
function WndProcJustOneNotify( Control: PControl; var Msg: TMsg; var Rslt: Integer ) : Boolean;
asm
PUSH EBP
MOV EBP, ESP
PUSHAD
CALL WndProcJustOne
POPAD
XOR EAX, EAX
PUSH ECX
MOV ECX, [EDX].TMsg.message
SUB ECX, [JustOneMsg]
POP ECX
JNE @@exit
MOV [ECX], EAX
CMP [OnAnotherInstance].TMethod.Code, EAX
JE @@exit_1
//MOV EAX, (MAX_PATH + 3) and 0FFFFCh
MOV AH, 2
SUB ESP, EAX
MOV ECX, ESP
PUSH EAX
PUSH ECX
PUSH [EDX].TMsg.lParam
CALL GetWindowText
MOV EDX, ESP
PUSH 0
MOV EAX, ESP
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
MOV EDX, [ESP]
MOV EAX, [OnAnotherInstance].TMethod.Data
CALL [OnAnotherInstance].TMethod.Code
MOV EAX, ESP
CALL System.@LStrClr
@@exit_1:
MOV AL, 1
@@exit:
MOV ESP, EBP
POP EBP
end;
function JustOneNotify( Wnd: PControl; const Identifier : AnsiString;
const aOnAnotherInstance: TOnAnotherInstance ) : Boolean;
asm
PUSHAD
MOV EBP, ESP
XCHG EAX, EDX
PUSH EAX
CALL System.@LStrLen
POP EDX
ADD EAX, EAX
SUB ESP, EAX
MOV EAX, ESP
CALL StrPCopy
PUSH '.ega'
PUSH 'sseM'
PUSH ESP
CALL RegisterWindowMessage
MOV [JustOneMsg], EAX
TEST EAX, EAX
MOV ESP, EBP
POPAD
JE @@exit_f
PUSHAD
CALL JustOne
DEC AL
POPAD
JZ @@exit_t
PUSH EBX
XCHG EBX, EAX
XOR EDX, EDX
XCHG [EBX].TControl.fCaption, EDX
PUSH EDX
CALL GetCommandLine
XCHG EDX, EAX
LEA EAX, [EBX].TControl.fCaption
{$IFDEF _D2009orHigher}
PUSH ECX
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
{$IFDEF _D2009orHigher}
POP ECX
{$ENDIF}
MOV EAX, EBX
MOV EDX, [EBX].TControl.fCaption
CALL TControl.SetCaption
MOV EAX, EBX
CALL TControl.GetWindowHandle
TEST EAX, EAX
JZ @@rest_cap
PUSH BSM_APPLICATIONS
MOV EDX, ESP
PUSH EAX
PUSH 0
PUSH [JustOneMsg]
PUSH EDX
PUSH BSF_QUERY or BSF_IGNORECURRENTTASK
CALL BroadcastSystemMessage
POP EDX
@@rest_cap:
LEA EAX, [EBX].TControl.fCaption
CALL System.@LStrClr
POP EDX
MOV [EBX].TControl.fCaption, EDX
MOV EAX, EBX
CALL TControl.SetCaption
POP EBX
@@exit_f:
XOR EAX, EAX
JMP @@exit
@@exit_t:
PUSHAD
LEA ESI, [aOnAnotherInstance]
LEA EDI, [OnAnotherInstance]
MOVSD
MOVSD
MOV EDX, offset[WndProcJustOneNotify]
CALL TControl.AttachProc
POPAD
MOV AL, 1
@@exit:
end;
function TStrList.AppendToFile(const FileName: Ansistring): Boolean;
asm
PUSH EBX
MOV EBX, EDX
PUSH 0
MOV EDX, ESP
CALL GetTextStr
XCHG EAX, EBX
MOV EDX, ofOpenWrite or ofOpenAlways
CALL FileCreate
MOV EBX, EAX
INC EAX
JZ @@exit
DEC EAX
XOR EDX, EDX
XOR ECX, ECX
MOV CL, spEnd
CALL FileSeek
POP EAX
PUSH EAX
CALL System.@LStrLen
XCHG ECX, EAX
MOV EAX, EBX
POP EDX
PUSH EDX
CALL FileWrite
XCHG EAX, EBX
CALL FileClose
@@exit:
CALL RemoveStr
POP EBX
end;
function TStrList.LoadFromFile(const FileName: AnsiString): Boolean;
asm
PUSH EAX
XCHG EAX, EDX
MOV EDX, ofOpenRead or ofShareDenyWrite or ofOpenExisting
CALL FileCreate
INC EAX
JZ @@exit
DEC EAX
PUSH EBX
XCHG EBX, EAX
PUSH 0
PUSH EBX
CALL GetFileSize
XOR EDX, EDX
PUSH EDX
XCHG ECX, EAX
MOV EAX, ESP
PUSH ECX
{$IFDEF _D2}
CALL _LStrFromPCharLen
{$ELSE}
{$IFDEF _D2009orHigher}
PUSH EDX // ushort 0, CodePage?
{$ENDIF}
CALL System.@LStrFromPCharLen
{$ENDIF}
POP ECX
MOV EAX, EBX
POP EDX
PUSH EDX
CALL FileRead
XCHG EAX, EBX
CALL FileClose
POP EDX
POP EBX
POP EAX
PUSH EDX
XOR ECX, ECX
CALL SetText
CALL RemoveStr
PUSH EDX
MOV AL, 1
@@exit: POP EDX
end;
function TStrList.SaveToFile(const FileName: Ansistring): Boolean;
asm
PUSH EBX
PUSH EAX
XCHG EAX, EDX
MOV EDX, ofOpenWrite or ofCreateAlways
CALL FileCreate
INC EAX
JZ @@exit
DEC EAX
XCHG EBX, EAX
POP EAX
PUSH 0
MOV EDX, ESP
CALL GetTextStr
POP EAX
PUSH EAX
CALL System.@LStrLen
XCHG ECX, EAX
POP EDX
PUSH EDX
MOV EAX, EBX
CALL FileWrite
PUSH EBX
CALL SetEndOfFile
XCHG EAX, EBX
CALL FileClose
CALL RemoveStr
PUSH EDX
INC EAX
@@exit:
POP EDX
POP EBX
end;
procedure TControl.SetStatusText(Index: Integer; const Value: KOLString);
asm
PUSHAD
MOV EBX, EDX // EBX = Index
MOV ESI, EAX // ESI = @Self
PUSH Value // prepare value for call at the end of procedure
PUSH EBX // prepare Index for call at the end of procedure
MOV ECX, [ESI].fStatusCtl
MOV EBP, ECX
INC ECX
LOOP @@status_created
CALL GetClientHeight
PUSH EAX // ch = old client height
MOV EAX, ESI
CALL _NewStatusBar
MOV [ESI].fStatusCtl, EAX
XCHG EBP, EAX
XOR EDX, EDX
PUSH EDX
INC DH
DEC EDX
CMP EBX, EDX
SETZ DL
NEG EDX
PUSH EDX
PUSH SB_SIMPLE
PUSH EBP
CALL TControl.Perform
ADD ESP, -16
PUSH ESP
PUSH [EBP].fHandle
CALL GetWindowRect
POP EAX
POP EDX
POP EAX
POP EAX
SUB EAX, EDX
MOV [ESI].fClientBottom, AL
POP EDX // ch
PUSH 0
PUSH 0
PUSH WM_SIZE
PUSH EBP
MOV EAX, ESI
CALL TControl.SetClientHeight
CALL TControl.Perform
@@status_created:
CMP EBX, 255
JGE @@not_simple
PUSH 0
PUSH 0
PUSH SB_GETPARTS
PUSH EBP
CALL Perform
CMP EAX, EBX
JG @@reset_simple
MOV EAX, ESI
CALL GetWidth
CDQ
MOV ECX, EBX
INC ECX
IDIV ECX
MOV EDX, EAX
ADD ESP, -1024
///////////////////
MOV ECX, EBX
MOV EDI, ESP
JECXZ @@2
@@store_loo:
STOSD
ADD EAX, EDX
LOOP @@store_loo
@@2:
OR dword ptr [ESP+EBX*4], -1
PUSH ESP
INC EBX
PUSH EBX
PUSH SB_SETPARTS
PUSH EBP
CALL Perform
////////////////////
ADD ESP, 1024
@@reset_simple:
PUSH 0
PUSH 0
PUSH SB_SIMPLE
PUSH EBP
CALL Perform
@@not_simple:
PUSH SB_SETTEXT
PUSH EBP
CALL Perform
POPAD
end;
function TOpenSaveDialog.Execute: Boolean;
asm
PUSH EBX
XCHG EBX, EAX
XOR ECX, ECX
{$IFDEF OpenSaveDialog_Extended}
MOVZX EAX, [EBX].NoPlaceBar
PUSH EAX
PUSH ECX
PUSH ECX
PUSH [EBX].TemplateName
PUSH [EBX].HookProc
{$ELSE}
PUSH ECX // prepare lpTemplateName = nil
PUSH ECX // prepare lpfnHook = nil
{$ENDIF}
PUSH EBX // prepare lCustData = @Self
MOV EDX, [EBX].FDefExtension
CALL EDX2PChar
PUSH EDX // prepare lpstrDefExt = FDefExtension
PUSH ECX // prepare nFileExtension, nFileOffset: Word = 0, 0
// prepare flags:
LEA EAX, [EBX].FOptions
MOV EDX, Offset[@@OpenSaveFlags]
{$IFDEF OpenSaveDialog_Extended}
MOV CL, 14
{$ELSE}
MOV CL, 12
{$ENDIF}
CALL MakeFlags
XOR ECX, ECX
OR EAX, OFN_EXPLORER or OFN_LONGNAMES or OFN_ENABLESIZING
PUSH EAX // push Flags
PUSH [EBX].FTitle // prepare lpstrTitle
PUSH [EBX].FInitialDir // prepare lpstrInitialDir
PUSH ECX // prepare nMaxFileTitle = 0
PUSH ECX // prepare lpstrFileTitle = nil
TEST AH, 2 // MultiSelect?
MOV EAX, 65520
JNZ @@1
MOV AX, MAX_PATH+2
@@1: PUSH EAX // prepare nMaxFile
CALL System.@GetMem
POP ECX
PUSH ECX
PUSH EAX // prepare lpStrFile
XOR EDX, EDX
@@2: MOV EDX, [EBX].fFileName // no, fill it initilly by FileName
CALL EDX2PChar
DEC ECX // added 5 october 2003 to prevent possible error if FileName too big
CALL StrLCopy
XOR EDX, EDX
PUSH [EBX].FFilterIndex // prepare nFilterIndex
PUSH EDX // prepare nMaxCustFilter
PUSH EDX // prepare lpstrCustomFilter
PUSH EDX // prepare lpstrFilter = nil
MOV EAX, ESP
OR EDX, [EBX].FFilter
JZ @@5
MOV ECX, offset[@@0]
CALL System.@LStrCat3 // prepare lpStrFilter = FFilter + #0
POP EAX
PUSH EAX
XOR EDX, EDX
@@3: INC EAX // filter is not starting from ';' or '|'...
CMP [EAX], DL
JZ @@5
CMP byte ptr [EAX], '|'
JNZ @@3
@@4: MOV [EAX], DL
JMP @@3
@@OpenSaveFlags:
DD OFN_CREATEPROMPT, OFN_EXTENSIONDIFFERENT, OFN_FILEMUSTEXIST
DD OFN_HIDEREADONLY, OFN_NOCHANGEDIR, OFN_NODEREFERENCELINKS
DD OFN_ALLOWMULTISELECT, OFN_NONETWORKBUTTON, OFN_NOREADONLYRETURN
DD OFN_OVERWRITEPROMPT, OFN_PATHMUSTEXIST, OFN_READONLY, OFN_NOVALIDATE
{$IFDEF OpenSaveDialog_Extended}
DD OFN_ENABLETEMPLATE, OFN_ENABLEHOOK
{$ENDIF}
{$IFDEF _D2009orHigher}
DW 0, 1
{$ENDIF}
DD -1, 1
@@0: DB 0
@@5:
PUSH [hInstance] // prepare hInstance
MOV ECX, [EBX].TControl.fWnd
INC ECX
LOOP @@6
MOV ECX, [Applet]
JECXZ @@6
MOV ECX, [ECX].TControl.fHandle
@@6: PUSH ECX // prepare hWndOwner
{$IFDEF OpenSaveDialog_Extended}
CALL WinVer
CMP AL, wvNT
MOV DL, 76+12
JA @@6a
CMP AL, wvME
JE @@6a
MOV DL, 76
@@6a: MOVZX EAX, DL
PUSH EAX
{$ELSE}
PUSH 76 // prepare lStructSize
{$ENDIF}
PUSH ESP
CMP [EBX].TControl.FOpenDialog, 0
JZ @@7
CALL GetOpenFileName
JMP @@8
@@7: CALL GetSaveFileName
@@8:
PUSH EAX
XOR EDX, EDX
TEST EAX, EAX
JZ @@10
MOV EAX, [ESP+4].TOpenFileName.nFilterIndex
MOV [EBX].FFilterIndex, EAX
TEST BYTE PTR [ESP+4].TOpenFileName.Flags, OFN_READONLY
SETNZ AL
MOV [EBX].fOpenReadOnly, AL
MOV EAX, [ESP+4].TOpenFileName.lpstrFile
MOV EDX, EAX
XOR ECX, ECX
TEST [EBX].FOptions, 1 shl OSAllowMultiSelect
JZ @@10
DEC EAX
@@9: INC EAX
CMP byte ptr [EAX], CL
JNZ @@9
CMP byte ptr [EAX+1], CL
JZ @@10
MOV byte ptr [EAX], 13
JMP @@9
@@10:
LEA EAX, [EBX].FFileName
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
MOV EAX, [ESP+4].TOpenFileName.lpstrFile
CALL System.@FreeMem // v1.86 +AK
LEA EAX, [ESP+4].TOpenFileName.lpstrFilter
CALL System.@LStrClr
POP EAX
{$IFDEF OpenSaveDialog_Extended}
ADD ESP, 76+12
{$ELSE}
ADD ESP, 76
{$ENDIF}
POP EBX
end;
function TOpenDirDialog.Execute: Boolean;
asm
PUSH EBX
XCHG EBX, EAX
XOR ECX, ECX
PUSH ECX // prepare iImage = 0
PUSH EBX // prepare lParam = @Self
PUSH [EBX].FCallBack // prepare lpfn = FCallBack
LEA EAX, [EBX].FOptions
MOV EDX, Offset[@@FlagsArray]
MOV CL, 8
CALL MakeFlags
PUSH EAX // prepare ulFlags = Options
PUSH [EBX].FTitle // prepare lpszTitle
LEA EAX, [EBX].FBuf
PUSH EAX // prepare pszDisplayName
PUSH 0 // prepare pidlRoot
MOV ECX, [EBX].fWnd
INC ECX
LOOP @@1
MOV ECX, Applet
JECXZ @@1
MOV ECX, [ECX].TControl.fHandle
@@1: PUSH ECX // prepare hwndOwner
PUSH ESP
CALL SHBrowseForFolderA
ADD ESP, 32
TEST EAX, EAX
JZ @@exit
PUSH EAX
LEA EDX, [EBX].FBuf
PUSH EDX
PUSH EAX
CALL SHGetPathFromIDListA
CALL CoTaskMemFree
MOV AL, 1
JMP @@fin
@@FlagsArray:
DD BIF_BROWSEFORCOMPUTER, BIF_BROWSEFORPRINTER, BIF_DONTGOBELOWDOMAIN
DD BIF_RETURNFSANCESTORS, BIF_RETURNONLYFSDIRS, BIF_STATUSTEXT
DD BIF_BROWSEINCLUDEFILES, BIF_EDITBOX, BIF_NEWDIALOGSTYLE
@@exit: XOR EAX, EAX
@@fin:
POP EBX
end;
function OpenDirSelChangeCallBack( Wnd: HWnd; Msg: DWORD; lParam, lpData: LParam ):
Integer; stdcall;
asm
MOV EAX, [lpData]
MOV ECX, [EAX].TOpenDirDialog.FOnSelChanged.TMethod.Code
JECXZ @@exit
LEA EDX, [EAX].TOpenDirDialog.FBuf
PUSH EDX
PUSH [lParam]
CALL SHGetPathFromIDListA
MOV EDX, [lpData]
LEA ECX, [EDX].TOpenDirDialog.FBuf
PUSH 0
PUSH ESP
LEA EAX, [EDX].TOpenDirDialog.FStatusText
PUSH EAX
MOV EAX, [EDX].TOpenDirDialog.FOnSelChanged.TMethod.Data
CALL dword ptr [EDX].TOpenDirDialog.FOnSelChanged.TMethod.Code
PUSH 0
PUSH BFFM_ENABLEOK
PUSH [Wnd]
CALL SendMessage
@@1: MOV EDX, [lpData]
MOV ECX, [EDX].TOpenDirDialog.FStatusText
JECXZ @@exit
PUSH ECX
PUSH 0
PUSH BFFM_SETSTATUSTEXT
PUSH [Wnd]
CALL SendMessage
@@exit: XOR EAX, EAX
end;
function TControl.TBAddInsButtons(Idx: Integer; const Buttons: array of PKOLChar;
const BtnImgIdxArray: array of Integer): Integer; stdcall;
asm { [EBP+$8] = @Self
[EBP+$C] = Idx
[EBP+$10] = Buttons
[EBP+$14] = High(Butons)
[EBP+$18] = BtnImgIdxArray
[EBP+$1C] = High(BtnImgIdxArray) }
PUSH EBX
PUSH ESI
PUSH EDI
OR EBX, -1
MOV EAX, 20
MOV ECX, [EBP+$14]
CMP ECX, EBX
JLE @@fin
INC ECX
MUL ECX
CALL System.@GetMem
PUSH EAX // save AB to FreeMem after
MOV EDX, EBX
DEC EDX // nBmp := -2
MOV ECX, [EBP+$14]
INC ECX
JZ @@exit
MOV ECX, [EBP+$1C]
INC ECX
JZ @@1
MOV ECX, [BtnImgIdxArray]
MOV EDX, [ECX]
DEC EDX // nBmp := BtnImgIdxArray[ 0 ] - 1
@@1: MOV ECX, [EBP+$14]
INC ECX
MOV ESI, [Buttons]
MOV EDI, EAX // EDI = PAB
PUSH 0 // N:=0 in [EBP-$14]
@@loop:
LODSD
TEST EAX, EAX
JZ @@break
PUSH ECX
CMP word ptr [EAX], '-'
JNE @@2
OR EAX, -1
STOSD
MOV EAX, [ToolbarsIDcmd]
TEST EBX, EBX
{$IFDEF USE_CMOV}
CMOVL EBX, EAX
{$ELSE}
JGE @@b0
MOV EBX, EAX
@@b0: {$ENDIF}
STOSD
XOR EAX, EAX
INC AH // TBSTYLE_SEP = 1
STOSD
DEC AH
STOSD
DEC EAX
JMP @@3
{$IFDEF _D2009orHigher}
DW 0, 1
{$ENDIF}
DD -1, 1
@@0: DB 0
@@2:
INC EDX // Inc( nBmp )
PUSH EAX
MOV EAX, [EBP+$1C]
MOV ECX, [EBP-$14]
CMP EAX, ECX
MOV EAX, EDX
JL @@21
MOV EAX, [BtnImgIdxArray]
MOV EAX, [EAX+ECX*4]
@@21: STOSD
TEST EDX, EDX
JGE @@2a
DEC EDX
@@2a:
MOV EAX, [ToolbarsIDcmd]
STOSD
TEST EBX, EBX
{$IFDEF USE_CMOV}
CMOVL EBX, EAX
{$ELSE}
JGE @@210
MOV EBX, EAX
@@210: {$ENDIF}
MOV ECX, [EBP+8]
MOV AH, BYTE PTR [ECX].TControl.DF.fDefaultTBBtnStyle
POP ECX
MOV AL, 4 // AL=fsState=_ENABLED, AH=fsStyle=_AUTOSIZE if fDefaultTBBtnStyle contains
CMP byte ptr [ECX], '^'
JNE @@22
OR AH, TBSTYLE_DROPDOWN
INC ECX
@@22: CMP byte ptr [ECX], '-'
JZ @@23
CMP byte ptr [ECX], '+'
JNZ @@24
MOV AL, TBSTATE_ENABLED or TBSTATE_CHECKED
@@23: INC ECX
OR AH, TBSTYLE_CHECK
CMP byte ptr [ECX], '!'
JNZ @@24
OR AH, TBSTYLE_GROUP
INC ECX
@@24: {$IFDEF TOOLBAR_DOT_NOAUTOSIZE_BUTTON}
CMP byte ptr [ECX], '.'
JNZ @@25
AND AH, not TBSTYLE_AUTOSIZE
INC ECX
@@25:
{$ENDIF TOOLBAR_DOT_NOAUTOSIZE_BUTTON}
STOSD
MOV EAX, [EBP+8]
STOSD
OR EAX, -1
CMP word ptr [ECX], ' '
JZ @@3
CMP byte ptr [ECX], 0
JZ @@3
PUSH EDX
PUSH 0
MOV EDX, ECX
MOV EAX, ESP
{$IFDEF _D2009orHigher}
PUSH ECX
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
{$IFDEF _D2009orHigher}
POP ECX
{$ENDIF}
MOV EAX, ESP
MOV EDX, offset[@@0]
CALL System.@LStrCat
PUSH dword ptr [ESP]
PUSH 0
PUSH TB_ADDSTRING
PUSH dword ptr [EBP+8]
CALL Perform
STOSD
CALL RemoveStr
POP EDX
JMP @@30
@@3: STOSD
@@30: INC dword ptr [EBP-$14]
INC [ToolbarsIDcmd]
POP ECX
DEC ECX
JNZ @@loop
@@break:
POP ECX
JECXZ @@exit
PUSH dword ptr [ESP]
MOV EAX, [Idx]
TEST EAX, EAX
JGE @@31
PUSH ECX
PUSH TB_ADDBUTTONS
JMP @@32
@@31:
PUSH EAX
PUSH TB_INSERTBUTTON
@@32:
PUSH dword ptr [EBP+8]
CALL Perform
@@exit:
POP EAX
CALL System.@FreeMem
@@fin:
POP EDI
POP ESI
XCHG EAX, EBX
POP EBX
end;
function TControl.TBGetButtonText( BtnID: Integer ): AnsiString;
asm
PUSH ECX
ADD ESP, -1024
PUSH ESP
PUSH EAX
CALL GetTBBtnGoodID
POP EDX
PUSH EAX
PUSH TB_GETBUTTONTEXT
PUSH EDX
CALL Perform
TEST EAX, EAX
JLE @@2
MOV EDX, ESP
JMP @@1
@@2: XOR EDX, EDX
@@1: MOV EAX, [ESP+1024]
{$IFDEF _D2009orHigher}
XOR ECX, ECX
{$ENDIF}
CALL System.@LStrFromPChar
ADD ESP, 1028
end;
procedure TBitmap.LoadFromResourceName(Inst: DWORD; ResName: PAnsiChar);
asm
PUSH EBX
MOV EBX, EAX
PUSHAD
CALL Clear
POPAD
XOR EAX, EAX
PUSH ECX
MOVZX ECX, [EBX].fHandleType
INC ECX
LOOP @@1
MOV AH, LR_CREATEDIBSECTION shr 8 // = $2000
@@1: MOV AL, LR_DEFAULTSIZE // = $40
POP ECX
PUSH EAX
PUSH 0
PUSH 0
PUSH IMAGE_BITMAP
PUSH ECX
PUSH EDX
CALL LoadImage
TEST EAX, EAX
JZ @@exit
XCHG EDX, EAX
XCHG EAX, EBX
CALL SetHandle
@@exit: POP EBX
end;
{$ENDIF}