Robby
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору ubian сравнивать шрифты по имени получается не очень хорошая идея, потому что попадаються разные файлы с одинаковым именем шрифта вот код со сравением, удаляются шрифты с одинаковым именем файла и именем шрифта Код: -- #FUNCTION# ============================================================ -- Name...........: System.GetFontName -- Description....: Возвращает индексированную числами таблицу -- Syntax.........: System.GetFontName (tFontsPath) -- Parameters.....: tFontsPath - таблица, содержащая полные пути шрифтов -- Return values..: tRet[i].Name - Название шрифта. -- tRet[i].Path - Путь к шрифту. -- ================================================================== System.GetFontsName = function (tFontsPath) local tFontsName = {}; local tFontsLink = {}; if type(tFontsPath) ~= "table" then return nil; end Memory.OpenLibrary(0, _SystemFolder.."\\kernel32.dll"); Memory.OpenLibrary(1, _SystemFolder.."\\gdi32.dll"); local nF1 = Memory.OpenFunction(0, "MultiByteToWideChar", DLL_CALL_STDCALL, DLL_RETURN_INT); local nF2 = Memory.OpenFunction(1, "GetFontResourceInfoW", DLL_CALL_STDCALL, DLL_RETURN_INT); for i = 1, #tFontsPath do local pTmp, pTmp2 = Memory.Allocate(4), Memory.Allocate(4); if DLL.CallFunction("gdi32.dll", "AddFontResourceExA", "\""..tFontsPath[i].."\",32,0", 0, 1) ~= "0" then local nBuffersize = Memory.CallFunction(nF1, 0, 1, tFontsPath[i], -1, 0, 0); local pWideString = Memory.Allocate(2 * nBuffersize); Memory.CallFunction(nF1, 0, 1, tFontsPath[i], -1, pWideString, nBuffersize); --------------------------------------------------- Memory.CallFunction(nF2, pWideString, pTmp, 0, 1); local pBuffer = Memory.Allocate(2 * Memory.GetInt(pTmp)); Memory.PutLong(pTmp2, Memory.GetInt(pTmp)); Memory.CallFunction(nF2, pWideString, pTmp2, pBuffer, 1); local key = String.Mid(tFontsPath[i], String.ReverseFind(tFontsPath[i], "\\") + 1, -1).."_"..Memory.GetString(pBuffer, -1, "Unicode"); tFontsName[Table.Count(tFontsName) + 1] = {Name = Memory.GetString(pBuffer, -1, "Unicode"), Path = tFontsPath[i], Key = key}; tFontsLink[key] = Table.Count(tFontsName); -- сохраняем в таблице индексы таблицы tFontsName Memory.Free(pTmp); Memory.Free(pTmp2); Memory.Free(pBuffer); Memory.Free(pWideString); DLL.CallFunction("gdi32.dll", "RemoveFontResourceEx", "\""..tFontsPath[i].."\",32,0", 0, 1); end end Memory.CloseLibrary(1); Memory.CloseLibrary(0); return tFontsName, tFontsLink; -- возвращаем две таблицы tFontsName - свойствва шрифтов, tFontsLink - ключ (имя файла) = индексу tFontsName end -- Sample local tSystemFonts = File.Find(Shell.GetFolder(SHF_FONTS), "*.*", false, false, nil, nil); if tSystemFonts then tFonts = System.GetFontsName(tSystemFonts); for i = 1, #tFonts do ListBox.AddItem("ListBox1", i..". "..tFonts[i].Name.." - "..tFonts[i].Path, tFonts[i].Path); end end Debug.ShowWindow(true); local tUserFont = File.Find("Fonts", "*.*", false, false, nil, nil); if tUserFont then local tFontsUser, tFontsCompare = System.GetFontsName(tUserFont); for i=1, #tFonts do if tFontsCompare[tFonts[i].Key] then --File.Delete(tFontsUser[tFontsCompare[tFonts[i].Key]].Path, false, false, true, nil); Debug.Print(i..". Удалены: "..tFontsUser[tFontsCompare[tFonts[i].Key]].Path.."\r\n"); end end end | А теперь вопрос! Есть две таблицы: в первой содержаться индексы для удаления из второй таблицы, вторая содержит собственно данные. Нужно получая номер индекса из первой таблицы удалить данные из второй Код: Проблема в том что после первого удаления все индексы во второй таблице смещаются и уже не соответсвуют индексам из первой. Как можно это скомпенсировать? Что-то ничеего путевого не выходит. | Всего записей: 879 | Зарегистр. 28-09-2003 | Отправлено: 18:09 20-12-2011 | Исправлено: Robby, 19:32 20-12-2011 |
|