| | 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
 
 | 
 
 А теперь вопрос!
 Есть две таблицы: в первой содержаться индексы для удаления из второй таблицы, вторая содержит собственно данные.
 Нужно получая номер индекса из первой таблицы удалить данные из второй
 
 Код:
 Проблема в том что после первого удаления все индексы во второй таблице смещаются и уже не соответсвуют индексам из первой.  Как можно это скомпенсировать? Что-то ничеего путевого не выходит.
 |  | Всего записей: 888 | Зарегистр. 28-09-2003 | Отправлено:  18:09 20-12-2011  | Исправлено: Robby,   19:32 20-12-2011
 | 
 |