Николай Ряполов

Пользователи
  • Публикации

    8
  • Зарегистрирован

  • Посещение

О Николай Ряполов

  • Звание
    Новичок

Посетители профиля

231 просмотр профиля
  1. Таким образом подытожим выше сказанное: 1. класс создаем таким образом: var LF: TListFile<T>; begin ... LF:= TListFile<T>.Create(True); //так мы говорим что надобно освобождать память автоматически try ... //тут работаем с нашим кодом ... finally LF.Free; //корректно подчищает за собой при установленном флаге AOwnerObject end; end Сам класс для хранения объектов меняем с TObjectList на TDictonary для увеличения производительности при сортировке массивов ввиду уже заложенных в "Словарь" алгоритмов на уровне системы. Спасибо огромное!
  2. Изначально мой класс базировался на TList<T>, но по ряду причин после обработки 500к файлов память забивалась до 150 Мб, и методом TList.Free не освобождалась. Изменил базовый класс на TObjectList , память этим методом TObjectList.Free очищается полностью (100 итераций заполнение - очистка списка). Если я Вас верно понял то в описании класса достаточно описать так: TListFile<T: TFileInfo> = class(TObjectList<T>) private ... AOwnsObjects = True; ... function GetAllSize: Int64; public ... property AllSize: Int64 read GetAllSize; // procedure Clear; overload; //тут можно удалить процедуру ... end; Или требуется сделать так: TListFile<T: TFileInfo> = class(TObjectList<T>) private ... function GetAllSize: Int64; public ... property AllSize: Int64 read GetAllSize; constructor Create; overload; // procedure Clear; overload; //тут можно удалить процедуру ... end; ... constructor TListFile<T>.Create; begin inherited create; AOwnsObjects = True; end; ... Если Вас не затруднит еще один небольшой вопрос. Столкнулся со сравнением двух списков TListObject<T>, где Т: class содержащий информацию о файлах. Сравнивать как списки как: for T in ObjectList1 do if ObjectList2.IndexOf(T)>0 then // тут код сравнения однозначно позволяет установить что именно class 'T' в ObjectList1 точно соответствует class 'T' в ObjectList2. Так как отсутствие class 'Т' из ObjectList1 или малейшее его изменение в списке ObjectList2 однозначно требует проверки на внутреннюю проверку списков методом: var isModif: Boolean; begin ... for T1 in ObjectList1 do begin isModif := False; for T2 in ObjectList2 do begin if T1.Name = T2.Name then begin if (T1.Size <> T2.Size) or (T1.ModDate <> T2.ModDate) then T1.Status := fiModif // const fiModif = $00000001 else T1.Status := fiNoModif; // const fiNoNodif = $00000002 isModif := True; end; if not isModif then T1.Status := fiCreate; // const fiCreate = $00000004 end; end; Если этот же класс реализовать через TDictonary добавив в TKey T1.Name и уже сравнение проводить согласно вхождению файлов в список ObjectList2 скорость сравнения достаточно увеличится или можно пренебречь реализацией?
  3. Доброго дня. Возник небольшой вопрос при создании классов. Выдержка из кода: //объявление классов TFileInfo = class private ... FSize: Int64; Public ... property Size: Int64 read FSize write FSize; procedure Free; ... end; TListFile<T: TFileInfo> = class(TObjectList<T>) private ... function GetAllSize: Int64; public ... property AllSize: Int64 read GetAllSize; procedure Clear; overload; ... end; // реализация классов ... procedure TFileInfo.Free; begin if Self <> nil then Destroy; end; ... function TListFile<T>.GetAllSize: Int64; var i: integer; begin Result := 0; for i := 0 to Count - 1 do Result := Result + Items[i].Size; end; ... procedure TListFile<T>.Clear; var i: integer; begin for i := 0 to Count - 1 do Items[i].Free; inherited Clear; end; В общем IDE в секции "Structure" выдает ошибки "Undeclared identifier 'Free'('Size') at line №строки в процедуре Clear и GetAllSize Сам код не смотря на выдаваемые ошибки компилируются без Hints и Warnings Ткните меня плиз в мое не совершенство. P.S. Выкрутился таким путем ... function TListFile<T>.GetAllSize: Int64; var tb: T; begin Result:=0; for tb in List do if tb <> nil then Result := Result + tb.Size; end; ... procedure TListFile<T>.Clear; var tb: T; begin for tb in List do if tb <> nil then tb.Free; inherited Clear; end; Подскажите верно ли я поступил?
  4. Благодарю за помощь.
  5. Прикладываю Демо проект (пустая форма с фреймом) и файл фрейма. Стиль - пустой проект - Multi-Device Application Стили фрейма - все стандартные, ничего не трогал. Добавляю фрейм на форму Tool-Palette-Standart-Frames выбираю свой фрейм. Все в режиме Дизайна. Баг воспроизвелся отдельно от основного проекта. Среда XE7 Update1 Win 8.1 Архив с исходниками demo.zip
  6. Доброго дня. Решил попробовать начать работу с фреймами, но столкнулся со следующей ситуацией. При отображении фрейма на главной форме своевременно не отрисовываются события и перемещения курсора по компонентам фрейма. Фрейм добавляю с палитры компонентов. Плолучается примерно следующий вид: Как избавиться от этого?
  7. Из-за не знания основных свойств компонентов, городил такие Небоскребы )))) Благодарю, для Windows подходит, для Android так же не работает (
  8. Я делаю проверку следующим образом procedure TForm1.Edit1ChangeTracking(Sender: TObject); var i: integer; sb: string; begin sb:=Edit1.Text; i:= low(sb); //так как разное начало строки в Win и Android платформах использую такую запись while i <= High(sb) do begin if Pos(sb[i],CharOfSimv)<1 then //CharOfSimv - простая строка вида '+-0123456789' begin delete(sb,i+1-Low(sb),1); // от платформы пляшем ) end; inc(i); end; if sb<>Edit1.Text then ShowMessage('Вы ввели не верный символ'); Edit1.Text:=sb; //ставим каретку в конец Edit Edit1.CaretPosition:=High(sb); //Update Label1.Text:= Edit1.Text; end; Update: При тестировании на платформе Android выявил следующее: 1. При вводе с экранной клавиатуры в Edit текст после обработки не меняется на исправленный (12345р67) 2. При передаче значения в Label (коммент Update) метке присваивается истинное значение (1234567) Как обойти данный баг? Платформа тестирования XE7 update1, Android 4.4.4 Sony Z1Compact