Почему вы не первый раз переименовываете удаляемый файл, а затем удаляете его?
Используйте GetTempFileName()
для получения уникального имени, затем используйте MoveFile()
для переименования файла. Затем удалите переименованный файл. Если фактическое удаление действительно асинхронно и может конфликтовать с созданием одного и того же файла (как показывают ваши тесты), это должно решить проблему.
Редактирование: Конечно, если ваш анализ прав, и файловые операции происходят несколько асинхронно, это может привести к проблеме, которую вы пытаетесь удалить файл до того, как будет выполнено переименование. Но тогда вы всегда можете попытаться удалить фоновый поток.
Редактировать # 2: Если Ганс прав (и я склонен верить его анализу), то перемещение может не помочь, потому что вы не сможете фактически переименовать файл, открытый другим процессом. (Но тогда вы могли бы, я не знаю этого.) Если это действительно так, единственный способ, который я могу придумать, - «продолжать пытаться». Вам придется подождать несколько миллисекунд и повторить попытку. Храните тайм-аут, чтобы отказаться, когда это не поможет.
TBitmap
VCL поддерживает только изображения BMP. Если вы попытаетесь загрузить в него любое другое изображение, вы получите исключение.
Чтобы загрузить JPG, вам нужно использовать TJPEGImage
. Чтобы загрузить PNG, используйте вместо этого TPNGImage
.
Вы можете использовать TPicture
, чтобы помочь вам с этой задачей, например:
uses
..., Vcl.Graphics, Vcl.Imaging.jpeg, Vcl.Imaging.pngimage;
function resize2(source: string): TBitmap;
var
Pic: TPicture;
begin
Pic := TPicture.Create;
try
Pic.LoadFromFile(source);
Result := TBitmap.Create;
try
if Pic.Graphic is TBitmap then
Result.PixelFormat := TBitmap(Pic.Graphic).PixelFormat
else
Result.PixelFormat := pf32bit;
Result.Width := 10;
Result.Height := 10;
Result.Canvas.StretchDraw(Rect(0, 0, Result.Width, Result.Height), Pic.Graphic);
except
Result.Free;
raise;
end;
finally
Pic.Free;
end;
end;
procedure TAlpha.dbeditTextBoxChange(Sender: TObject);
var
pic1: string;
mimapa: TBitmap;
begin
try
pic1 := dm.TableNotes.FieldByName('PathPic').AsString;
mimapa := resize2(pic1);
try
image2.Picture.Assign(mimapa);
finally
mimapa.Free;
end;
...
except
...
end;
end;