Вот помню юзал я раньше (давно это было) какой-то темплейт, который версию приложения при каждой сборке наращивал на единичку и в глобальную переменную пихал (или это константа была - не помню)
Главное, что можно было этот номер билда вывести на экран.
Где бы такой темплейт взять или хотя бы кусочек кода, делающий что-нибудь подобное?
Версия приложения
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Олег
- Ветеран движения
- Сообщения: 122
- Зарегистрирован: 16 Июль 2005, 2:35
- Откуда: Москва
- Контактная информация:
Шаблончик, в принципе, очень простой. Он, обычно, связан с другими подобными "штучками" типа генерация переменных с датой и временем билда. У меня подобный выглядит так:
#EXTENSION(DefineProgramBuildDateTime,'Определение даты, времени построения и номера билда приложения')
#!------------------------------------------------------------------------------
#BOXED('')
#DISPLAY('Обьявляет три ULONG-константы:')
#DISPLAY(' ProgramBuildDate - дата последней сборки')
#DISPLAY(' ProgramBuildTime - время последней сборки')
#DISPLAY(' ProgramBuildNum - внутренний номер сборки')
#BOXED('')
#PROMPT('Обьявлять как глобальные',CHECK),%GlobalDef,AT(10),DEFAULT(%True)
#PROMPT('Обьявлять ProgramBuildDate',CHECK),%DefBuildDate,AT(10),DEFAULT(%True)
#PROMPT('Обьявлять ProgramBuildTime',CHECK),%DefBuildTime,AT(10),DEFAULT(%True)
#PROMPT('Обьявлять ProgramBuildNum',CHECK),%DefBuildNum,AT(10),DEFAULT(%True)
#BOXED(''),WHERE(%DefBuildNum)
#PROMPT('ProgramBuildNum = ',@S10),%ProgramBuildNum,PROP(PROP:ReadOnly,%True),DEFAULT('0')
#BUTTON('"Сбросить" значение счетчика в 0!'),WHENACCEPTED(%ClearBuildNum()),AT(,,155)
#ENDBUTTON
#ENDBOXED
#ENDBOXED
#ENDBOXED
#!
#AT(%BeforeGenerateApplication)
#FOR(%Module)
#FOR(%ModuleProcedure)
#FIX(%Procedure,%ModuleProcedure)
#FOR(%ActiveTemplate),WHERE(UPPER(%ActiveTemplate) = 'DEFINEPROGRAMBUILDDATETIME(ROA_EXTENSIONS)')
#SET(%GenerationCompleted,%False)
#CONTEXT(%Procedure,%ActiveTemplate)
#SET(%ProgramBuildNum,%ProgramBuildNum+1)
#ENDCONTEXT
#BREAK
#ENDFOR
#ENDFOR
#ENDFOR
#ENDAT
#!
#AT(%BeforeGlobalIncludes),WHERE(%GlobalDef)
!-------------------------------------------------------------------------------
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
!-------------------------------------------------------------------------------
#ENDAT
#!
#AT(%DataSectionBeforeWindow),WHERE(~%GlobalDef)
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
#ENDAT
#!
#AT(%DataSectionBeforeReport),WHERE(~%GlobalDef)
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
#ENDAT
#!
#AT(%DataSection),WHERE(~%GlobalDef)
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
#ENDAT
#!
#GROUP(%ClearBuildNum)
#SET(%ProgramBuildNum,0)
#!
Я сделал этот шаблон локальным, что-бы можно было подключить его к какой-либо процедуре (у меня, к примеру, он подключен к About) - в этом случае не нужно перекомпилировать все приложение при изменении глобальной переменной. Перекомпилится только процедура, к которой подключен шаблон. Но, если очень хочется, то шаблон позволяет включать генерацию этих констант в секции глобальных данных.
Удачи!
#EXTENSION(DefineProgramBuildDateTime,'Определение даты, времени построения и номера билда приложения')
#!------------------------------------------------------------------------------
#BOXED('')
#DISPLAY('Обьявляет три ULONG-константы:')
#DISPLAY(' ProgramBuildDate - дата последней сборки')
#DISPLAY(' ProgramBuildTime - время последней сборки')
#DISPLAY(' ProgramBuildNum - внутренний номер сборки')
#BOXED('')
#PROMPT('Обьявлять как глобальные',CHECK),%GlobalDef,AT(10),DEFAULT(%True)
#PROMPT('Обьявлять ProgramBuildDate',CHECK),%DefBuildDate,AT(10),DEFAULT(%True)
#PROMPT('Обьявлять ProgramBuildTime',CHECK),%DefBuildTime,AT(10),DEFAULT(%True)
#PROMPT('Обьявлять ProgramBuildNum',CHECK),%DefBuildNum,AT(10),DEFAULT(%True)
#BOXED(''),WHERE(%DefBuildNum)
#PROMPT('ProgramBuildNum = ',@S10),%ProgramBuildNum,PROP(PROP:ReadOnly,%True),DEFAULT('0')
#BUTTON('"Сбросить" значение счетчика в 0!'),WHENACCEPTED(%ClearBuildNum()),AT(,,155)
#ENDBUTTON
#ENDBOXED
#ENDBOXED
#ENDBOXED
#!
#AT(%BeforeGenerateApplication)
#FOR(%Module)
#FOR(%ModuleProcedure)
#FIX(%Procedure,%ModuleProcedure)
#FOR(%ActiveTemplate),WHERE(UPPER(%ActiveTemplate) = 'DEFINEPROGRAMBUILDDATETIME(ROA_EXTENSIONS)')
#SET(%GenerationCompleted,%False)
#CONTEXT(%Procedure,%ActiveTemplate)
#SET(%ProgramBuildNum,%ProgramBuildNum+1)
#ENDCONTEXT
#BREAK
#ENDFOR
#ENDFOR
#ENDFOR
#ENDAT
#!
#AT(%BeforeGlobalIncludes),WHERE(%GlobalDef)
!-------------------------------------------------------------------------------
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
!-------------------------------------------------------------------------------
#ENDAT
#!
#AT(%DataSectionBeforeWindow),WHERE(~%GlobalDef)
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
#ENDAT
#!
#AT(%DataSectionBeforeReport),WHERE(~%GlobalDef)
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
#ENDAT
#!
#AT(%DataSection),WHERE(~%GlobalDef)
#IF(%DefBuildDate)
ProgramBuildDate ULONG(%ProgramDateChanged)
#ENDIF
#IF(%DefBuildTime)
ProgramBuildTime ULONG(%ProgramTimeChanged)
#ENDIF
#IF(%DefBuildNum)
ProgramBuildNum ULONG(%ProgramBuildNum)
#ENDIF
#ENDAT
#!
#GROUP(%ClearBuildNum)
#SET(%ProgramBuildNum,0)
#!
Я сделал этот шаблон локальным, что-бы можно было подключить его к какой-либо процедуре (у меня, к примеру, он подключен к About) - в этом случае не нужно перекомпилировать все приложение при изменении глобальной переменной. Перекомпилится только процедура, к которой подключен шаблон. Но, если очень хочется, то шаблон позволяет включать генерацию этих констант в секции глобальных данных.
Удачи!
Спасибо, я что-то подобное выцепил из FreeTemplates старых.Олег писал(а):Шаблончик, в принципе, очень простой.
................
Удачи!
НО!
есть одно неудобство -- для смены билда надо обязательно перегенерировать эту процедуру (в которую вставил темплейт).
как бы сделать, что она всегда перегенерировалась? (и соответственно всегда счетчик наращивался).
Я можно конечно глобальный темплейт вставить, но все приложение целиком не очень интересно пересобирать.

Кстати, что-то твой шаблон не наращивает номерок. Всегда ноль почему-то.
C5.5, ABC
Я в данный момент нашел в закромах вот такой шаблончик (вырезано из FreeTemplates):
Но оно мне по многим соображениям не нравится.
Еще где-то был шаблон, который в 32х разрядное приложение дополнительную информацию добавляет -- автор там, номер версии и т.п.
Вот его бы тоже найти...
Код: Выделить всё
#!---------------------------------------------------------------------------------------------------------------------------------------------------------
#EXTENSION(MiscBuildInfo,'Misc: Update and display build information'),PROCEDURE
#!---------------------------------------------------------------------------------------------------------------------------------------------------------
#DISPLAY(' ')
#DISPLAY('Update a control with:')
#DISPLAY(' - the current build number')
#DISPLAY(' - the current build date/timer')
#DISPLAY(' ')
#DISPLAY('Before using, create a file named the same as your')
#DISPLAY('application with a .BN extension containing the')
#DISPLAY('current build number. ')
#DISPLAY(' ')
#PROMPT('Build number control',CONTROL),%BNum
#PROMPT('Build date control',CONTROL),%BDate
#PROMPT('Build time control',CONTROL),%BTime
#ATSTART
#EQUATE(%BuildNumber,'0')
#! Create the file if necessary
#OPEN(%Application & '.BN')
#CLOSE(%Application & '.BN')
#! Open in read-only mode
#OPEN(%Application & '.BN'),READ
#READ(%BuildNumber)
#CLOSE(%Application & '.BN'),READ
#! Increment the build number
#SET(%BuildNumber,((%BuildNumber) + 1))
#! Update the build number
#REMOVE(%Application & '.BN')
#CREATE(%Application & '.BN')
%BuildNumber
#CLOSE(%Application & '.BN')
#ENDAT
#AT(%WindowManagerMethodCodeSection,'Init'),PRIORITY(8120)
#IF(%BNum)
%BNum{Prop:Text} = %BuildNumber
#ENDIF
#IF(%BDate)
%BDate{Prop:Text} = FORMAT(%ProgramDateChanged,@d17)
#ENDIF
#IF(%BTime)
%BTime{Prop:Text} = FORMAT(%ProgramTimeChanged,@t7)
#ENDIF
#ENDAT
Еще где-то был шаблон, который в 32х разрядное приложение дополнительную информацию добавляет -- автор там, номер версии и т.п.
Вот его бы тоже найти...
Вот как добавить информацию. Это я из Локуса выдернул.
(Ну, чуть-чуть перевел еще)
Только это не вся информация, которую надо бы (можно бы) добавлять.
Кто знает, что можно сюда еще добавить?
(Ну, чуть-чуть перевел еще)
Только это не вся информация, которую надо бы (можно бы) добавлять.
Кто знает, что можно сюда еще добавить?
Код: Выделить всё
#!---------------------------------------------------------------------------------------------------------------------------------------------------------
#EXTENSION(AnDS_32bitInfo,'AnDS: Обновление и отображение информации для 32bit-приложения'),APPLICATION, LAST
#!---------------------------------------------------------------------------------------------------------------------------------------------------------
#BOXED('')
#DISPLAY ('Добавить свойства файла к " ' & LOWER(%Application) & '.' & LOWER(%ProgramExtension) & ' "'), AT(30,30)
#PROMPT ('', CHECK), %UseResourceEditor, DEFAULT(%False), AT(10,30)
#DISPLAY
#ENABLE (%Target32 AND %UseResourceEditor)
#BOXED ('Информация в файле ресурса')
#PROMPT ('Комментарий', @s255), %ResComments
#PROMPT ('Производитель', @s255), %ResCompanyName
#PROMPT ('Описание', @s255), %ResFileDescription
#PROMPT ('Версия файла', @s255), %ResFileVersion
#PROMPT ('Внутреннее имя', @s255), %ResInternalName
#PROMPT ('Авторские права', @s255), %ResLegalCopyright
#PROMPT ('Товарные знаки', @s255), %ResLegalTrademarks
#PROMPT ('Исходное имя файла', @s255), %ResOriginalFilename
#PROMPT ('Вариант (Private Build)', @s255), %ResPrivateBuild
#PROMPT ('Название продукта', @s255), %ResProductName
#PROMPT ('Версия продукта', @s255), %ResProductVersion
#PROMPT ('Дополнительные сведения (Special Build)', @s255), %ResSpecialBuild
#ENDBOXED
#DISPLAY (' <169> - ALT + 184')
#DISPLAY (' <174> - ALT + 169')
#ENDENABLE
#ENDBOXED
#ATSTART
#IF (%Target32)
#INSERT (%ResourceEdit)
#ENDIF
#ENDAT
#GROUP (%ResourceEdit)
#! -------------------------------------------------------------------------
#DECLARE (%OutStack), MULTI
#DECLARE (%Pos)
#DECLARE (%StrAddr)
#DECLARE (%HighAddr)
#DECLARE (%LowAddr)
#DECLARE (%VarFileAddr)
#DECLARE (%DistVarFileAddr1)
#DECLARE (%DistVarFileAddr2)
#MESSAGE ('Compiling ' & %Application & '.RES resource file', 2)
#! **** RESOURCE HEADER *****
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, ' ', '', '', '')
#INSERT (%OutOct, '<255>', '<255>', '', '')
#INSERT (%OutOct, '<255>', '<255>', '', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#! Adresse for start af "VarFileInfo"
#INSERT (%OutOct, ' ', '', '', '')
#INSERT (%OutOct, '<255>', '<255>', '<16>', '')
#INSERT (%OutOct, '<255>', '<255>', '<1>', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '0', '', '<9>', '<4>')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#! Adresse for start af "VarFileInfo"
#INSERT (%OutOct, '4', '', '', '')
#INSERT (%OutStr, 'VS_VERSION_INFO')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '<189>', '<4>', 'п', 'ю')
#INSERT (%OutOct, '', '', '<1>', '')
#INSERT (%OutOct, '', '', '<1>', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '<1>', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '?', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '<4>', '', '<4>', '')
#INSERT (%OutOct, '<1>', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '', '', '', '')
#! Adresse pе start af "FileVerion" Streng
#INSERT (%OutOct, '', '', '<1>', '')
#INSERT (%OutStr, 'StringFileInfo')
#INSERT (%OutHex, '', '')
#! Lжngde til start af "VarFileInfo"
#INSERT (%OutHex, '<1>', '')
#INSERT (%OutStr, '040904b0')
#INSERT (%OutHex, '', '')
#! **** RESOURCE INFORMATION *****
#INSERT (%AddResInform, 'Comments', %ResComments)
#INSERT (%AddResInform, 'CompanyName', %ResCompanyName)
#INSERT (%AddResInform, 'FileDescription', %ResFileDescription)
#INSERT (%AddResInform, 'FileVersion', %ResFileVersion)
#INSERT (%AddResInform, 'InternalName', %ResInternalName)
#INSERT (%AddResInform, 'LegalCopyright', %ResLegalCopyright)
#INSERT (%AddResInform, 'LegalTrademarks', %ResLegalTrademarks)
#INSERT (%AddResInform, 'OriginalFilename', %ResOriginalFilename)
#INSERT (%AddResInform, 'PrivateBuild', %ResPrivateBuild)
#INSERT (%AddResInform, 'ProductName', %ResProductName)
#INSERT (%AddResInform, 'ProductVersion', %ResProductVersion)
#INSERT (%AddResInform, 'SpecialBuild', %ResSpecialBuild)
#! **** VARFILEINFO ****
#INSERT (%OutOct, 'D', '', '', '')
#SET (%VarFileAddr, ITEMS(%OutStack))
#SET (%DistVarFileAddr1, %VarFileAddr - 156)
#SET (%DistVarFileAddr2, %VarFileAddr - 192)
#INSERT (%OutHex, '<1>', '')
#INSERT (%OutStr, 'VarFileInfo')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '$', '', '<4>', '')
#INSERT (%OutHex, '', '')
#INSERT (%OutStr, 'Translation')
#INSERT (%OutOct, '', '', '', '')
#INSERT (%OutOct, '<9>', '<4>', '<176>', '<4>')
#! **** DAN OG UDSKRIV FIL ****
#INSERT (%WriteResource)
#MESSAGE ('', 2)
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%OutOct, %Parm1, %Parm2, %Parm3, %Parm4)
#! -------------------------------------------------------------------------
#ADD (%OutStack, %Parm1)
#ADD (%OutStack, %Parm2)
#ADD (%OutStack, %Parm3)
#ADD (%OutStack, %Parm4)
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%OutHex, %Parm1, %Parm2)
#! -------------------------------------------------------------------------
#ADD (%OutStack, %Parm1)
#ADD (%OutStack, %Parm2)
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%OutStr, %Parm1)
#! -------------------------------------------------------------------------
#LOOP, FOR(%Pos, 1, LEN(%Parm1))
#ADD (%OutStack, SUB(%Parm1, %Pos, 1))
#ADD (%OutStack, '')
#ENDLOOP
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%AddResInform, %Parm1, %Parm2)
#! -------------------------------------------------------------------------
#IF (ITEMS(%OutStack) % 4)
#ADD (%OutStack, '')
#ADD (%OutStack, '')
#ENDIF
#IF (%Parm2)
#SET (%StrAddr, LEN(%Parm2) * 2 + LEN(%Parm1) * 2 + 10)
#IF (LEN(%Parm1) % 2)
#SET (%StrAddr, %StrAddr + 2)
#ENDIF
#INSERT (%AddStrAddr)
#SET (%StrAddr, LEN(%Parm1) * 2 + 2)
#INSERT (%AddStrAddr)
#INSERT (%OutHex, '<1>', '')
#INSERT (%OutStr, %Parm1)
#INSERT (%OutHex, '', '')
#IF (ITEMS(%OutStack) % 4)
#ADD (%OutStack, '')
#ADD (%OutStack, '')
#ENDIF
#INSERT (%OutStr, %Parm2)
#INSERT (%OutHex, '', '')
#IF (ITEMS(%OutStack) % 4)
#ADD (%OutStack, '')
#ADD (%OutStack, '')
#ENDIF
#ENDIF
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%AddStrAddr)
#! -------------------------------------------------------------------------
#SET (%HighAddr, %StrAddr / 256)
#SET (%LowAddr, %StrAddr % 256)
#ADD (%OutStack, CHR(%LowAddr))
#ADD (%OutStack, CHR(%HighAddr))
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%CalcAddr, %Parm1)
#! -------------------------------------------------------------------------
#SET (%HighAddr, %Parm1 / 256)
#SET (%LowAddr, %Parm1 % 256)
#! -------------------------------------------------------------------------
#!
#! -------------------------------------------------------------------------
#GROUP (%WriteResource)
#! -------------------------------------------------------------------------
#SET (%VarFileAddr, %VarFileAddr + 12)
#INSERT (%CalcAddr, %VarFileAddr)
#ADD (%OutStack, CHR(%LowAddr), 33)
#ADD (%OutStack, CHR(%HighAddr), 34)
#ADD (%OutStack, '', 35)
#ADD (%OutStack, '', 36)
#ADD (%OutStack, CHR(%LowAddr), 65)
#ADD (%OutStack, CHR(%HighAddr), 66)
#SET (%DistVarFileAddr1, %DistVarFileAddr1 + 8)
#INSERT (%CalcAddr, %DistVarFileAddr1)
#ADD (%OutStack, CHR(%LowAddr), 157)
#ADD (%OutStack, CHR(%HighAddr), 158)
#SET (%DistVarFileAddr2, %DistVarFileAddr2 + 8)
#INSERT (%CalcAddr, %DistVarFileAddr2)
#ADD (%OutStack, CHR(%LowAddr), 193)
#ADD (%OutStack, CHR(%HighAddr), 194)
#ADD (%OutStack, '', 195)
#ADD (%OutStack, '', 196)
#! *** Udskriv Fil ***
#DECLARE (%OutFile)
#SET (%OutFile, %Application & '.RES')
#DECLARE (%TempFile)
#SET (%TempFile, %Application & '.~RS')
#CREATE (%TempFile)
#FOR (%OutStack)
#IF (VAL(%OutStack))
%OutStack%|
#ELSE
%(CHR(0))%|
#ENDIF
#ENDFOR
#CLOSE (%TempFile)
#REPLACE (%OutFile, %TempFile)
#REMOVE (%TempFile)
#SET (%OutFile, %Application & '.PRJ')
#SET (%TempFile, %Application & '.~PJ')
#CREATE (%TempFile)
%('#message "linking ' & LOWER(%Application) & '.res into the application"')
%('#pragma link(' & %Application & '.RES)')
#CLOSE (%TempFile)
#REPLACE (%OutFile, %TempFile)
#REMOVE (%TempFile)
#PROJECT (%OutFile)