--[===[ Author: YoucefHam Email: youcefham20@gmail.com Discord: YoucefHam#5634 ADD to Edit Menu "Referenced Code" "Save Referenced Functions", => Export Referenced Functions list to file (Window must be open) "Save Referenced Strings", => Export Referenced Strings list to file (Window must be open) Hold "F4" to stop. ]===] --[[ Show Message and close it after Delay ]]-- local function showAutoMessage(TXT) createThread(function (thread) local StartTime = os.clock() while os.clock() - StartTime < 1.5 do sleep(5) end doKeyPress(VK_ESCAPE) thread.terminate() end,thread) ShowMessage(translate(TXT)) return translate(TXT) end --[[ createRefrencedFile(Reftype) create a file Save the list of Referenced Functions or Strings to file Reftype :string 'f' for Referenced Functions 's' for Referenced Strings ]]-- local function createRefrencedFile(Reftype) --[[ get All existing windows in CE ]]-- local frmCE = {} for i = 0, getFormCount() - 1 do local frmVarName = 'frm'..(getForm(i).ClassName~='' and getForm(i).ClassName or i) frmCE[frmVarName] = getForm(i) --[[print("WinID:\tfrmCE['"..frmVarName.."']", '\nName:\t', frmCE[frmVarName].Name, '\nClass:\t',frmCE[frmVarName].ClassName, '\nCaption:\t',frmCE[frmVarName].Caption,'\n') ]]-- --for debuging to get the list of windows end --error() --for debuging to get the list of windows local rsf = nil local rsfType = '' local rsfTitle = '' local StopKey = VK_F4 --Overwrite key to stop local rsfStoped = false local RefFunctionsList = nil local RefAddressList = nil if frmCE['frmTfrmReferencedStrings'] and Reftype:lower() == 's' then rsf = frmCE['frmTfrmReferencedStrings'] rsf.show() rsf.WindowState = 'wsMinimized' if rsf.lvStringlist.Items.Count <= 0 then return error({('!!! Referenced Strings List Empty !!!'),''},2) end RefFunctionsList = rsf.lvStringlist rsfType = 'frmTfrmReferencedStrings' elseif frmCE['frmTfrmReferencedFunctions'] and Reftype:lower() == 'f' then rsf = frmCE['frmTfrmReferencedFunctions'] rsf.show() rsf.WindowState = 'wsMinimized' if rsf.lvCallList.Items.Count <= 0 then return error({('!!! Referenced Functions List Empty !!!'),''},2) end RefFunctionsList = rsf.lvCallList rsfType = 'frmTfrmReferencedFunctions' else return error({('!!! Windows Not Found !!!'),''},2) end RefAddressList = rsf.lbReflist rsfTitle = rsfType:gsub('frmTfrmReferenced(.*)','Referenced %1') if messageDialog(rsfTitle..' List have ('..RefFunctionsList.Items.Count..'), Continue?\n Note: Hold "'..shortCutToText(StopKey)..'" to stop.', mtConfirmation, mbYes, mbAbort) == mrAbort then return error({('!!! User Aborted !!!'),''},2) end local filePath = os.getenv('appdata'):gsub('AppData\\.*','')..'Desktop\\'..process:gsub('%.exe','')..'\\'..rsfTitle..'\\' os.execute('mkdir "'..filePath..'"') local fileName= process..'-'..rsfTitle..' '..os.date('%d-%m-%Y-%H.%M.%S')..'.txt' local fileFullPath = filePath..fileName local file,err = io.open(fileFullPath, 'w') assert(file,err) file:write(string.format(rsfTitle..' of Process:\t\t%s\nTimeStamp:'..('\t'):rep(8)..'%s\n\n',process,os.date('%d/%m/%Y - %H:%M:%S'))) local RefrencedStringFile = '' rsf.WindowState = 'wsMinimized' local Stats,err = pcall(function () local tabs = '\t\t\t' for i = 0, RefFunctionsList.Items.Count - 1 do local k = RefFunctionsList.Items[i] k.Selected = true RefrencedStringFile = '('..tonumber(k.SubItems[0])..'): '..getNameFromAddress(k.Caption) if rsfType == 'frmTfrmReferencedStrings' then RefrencedStringFile = RefrencedStringFile..tabs..k.SubItems[2] end RefrencedStringFile = RefrencedStringFile..'\n' if tonumber(k.SubItems[0]) > 1 then for j= 0 , RefAddressList.Items.Count - 1 do RefrencedStringFile = RefrencedStringFile..tabs..getNameFromAddress(RefAddressList.Items[j])..'\n' if isKeyPressed( StopKey ) then rsfStoped = true break end end if rsfStoped then break end elseif tonumber(k.SubItems[0]) then RefrencedStringFile = RefrencedStringFile..tabs..getNameFromAddress(RefAddressList.Items[0])..'\n' end if RefrencedStringFile then file:write(RefrencedStringFile) end if isKeyPressed( StopKey ) or rsfStoped then rsfStoped = true break end --if i == 10 then break end --for debuging loop only first 10 end end) local str if Stats then str = '*** '..rsfTitle..(rsfStoped and ' Stoped By User ***' or ' Finished Successfully ***') file:write(str) file:close() print(showAutoMessage(str)) return fileFullPath else str = '!!! '..rsfTitle..' Failled !!!!!\n\t >'..err:gsub('\r','') file:write(str) file:close() return error({str,fileFullPath},2) end end -- Create Menu local ExtractRefrencedName = 'miExtractRefrenced' local ExtractRefrencedCaption = '&Referenced Code' if not getMainForm().ComponentByName['Edit3'].Visible then getMainForm().ComponentByName['Edit3'].Visible = true end local parent = getMainForm().ComponentByName['Edit3'] or getMainForm().Menu.Items local separatorMenu = createMenuItem(parent) separatorMenu.Caption = '-' parent.add(separatorMenu) local miExtractRefrenced = createMenuItem(parent) miExtractRefrenced.Name = ExtractRefrencedName miExtractRefrenced.Caption = ExtractRefrencedCaption parent.add(miExtractRefrenced) local function addMenuItem(MenuItem, caption, onClick) local newItem = createMenuItem(MenuItem) MenuItem.add(newItem) newItem.Caption = caption newItem.OnClick = onClick return newItem end addMenuItem(miExtractRefrenced,translate('Save Referenced &Functions'), function () createThread(function (thread) local Stats,err = pcall(createRefrencedFile,'f') if Stats then shellExecute(err) else print(showAutoMessage(err[1]:gsub('\r','')..'')) if not(err[2]=='' or err[2]==nil) then shellExecute(err[2]) end end thread.terminate() end) end) addMenuItem(miExtractRefrenced,'-') addMenuItem(miExtractRefrenced,translate('Save Referenced &Strings'), function () createThread(function (thread) local Stats,err = pcall(createRefrencedFile,'s') if Stats then shellExecute(err) else print(showAutoMessage(err[1]:gsub('\r','')..'')) if not(err[2]=='' or err[2]==nil) then shellExecute(err[2]) end end thread.terminate() end) end)