为什么在将 JPEG 分配给 TJPEGImages 数组时出现访问冲突?
Why do I get an access violation when assigning a JPEG to an array of TJPEGImages?
Formulae: array [1..6] of TJPEGImage;
我有一个数组,我想在其中分配图像,以便我可以将它们显示到表单上。我使用了 JPEG data-stream to TImage 问题中的类似代码,但在 if 语句
处收到访问冲突错误消息
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer; NewImage: Boolean);
var
TempImg: TJPEGImage;
begin
TempImg:= TJPEGImage.Create;
TempImg.LoadFromFile('C2F'+inttostr(ImgNo)+'.jpg');
img_Formulae.Picture.Assign(TempImg);
// assigning each picture to an element in array if it is the first time. This will be used to save the pictures later on
If NewImage = True then Formulae[ImgNo].Assign(TempImg);
TempImg.Free;
ImgDisplayed:= ImgNo;
lbl_FormulaDisplay.Caption:= 'Formula ' + inttostr(ImgNo); //user can see which formula can be seen
end;
谢谢。
Formulae[ImgNo].Assign(TempImg);
这是试图将图片分配给一个已经创建的对象。但是,您的对象很可能尚未创建,因为我看不到在上面的代码中初始化它们的方法。 Assign
要求对象已经创建。
对于您的情况,理想的做法是在启动时确保提前在数组中创建所有这些对象。然后,也一定要在关闭时销毁它们。
您的整个代码可以像...一样简单
procedure Tfrm_calc2.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := Low(Formulae) to High(Formulae) do begin
Formulae[I] := TJpegImage.Create;
end;
end;
procedure Tfrm_calc2.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := Low(Formulae) to High(Formulae) do begin
FreeAndNil(Formulae[I]);
end;
end;
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer);
begin
Formulae[ImgNo].LoadFromFile('C2F'+IntToStr(ImgNo)+'.jpg');
ImgDisplayed:= ImgNo;
lbl_FormulaDisplay.Caption:= 'Formula ' + IntToStr(ImgNo);
end;
不需要加载另一个实例并分配它。直接加载文件即可。
在对数组调用 Assign
之前,您是否使用分配的对象填充数组?可能不会。尝试更像这样的东西:
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer);
var
TempImg: TJPEGImage;
begin
TempImg := TJPEGImage.Create;
try
TempImg.LoadFromFile('C2F'+IntToStr(ImgNo)+'.jpg');
img_Formulae.Picture.Assign(TempImg);
if Formulae[ImgNo] = nil then
begin
Formulae[ImgNo] := TempImg;
TempImg := nil;
end else
Formulae[ImgNo].Assign(TempImg);
finally
TempImg.Free;
end;
ImgDisplayed := ImgNo;
lbl_FormulaDisplay.Caption := 'Formula ' + IntToStr(ImgNo);
end;
或者:
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer);
var
TempImg: TJPEGImage;
begin
TempImg := TJPEGImage.Create;
try
TempImg.LoadFromFile('C2F'+IntToStr(ImgNo)+'.jpg');
img_Formulae.Picture.Assign(TempImg);
FreeAndNil(Formulae[ImgNo]);
Formulae[ImgNo] := TempImg;
except
TempImg.Free;
raise;
end;
ImgDisplayed := ImgNo;
lbl_FormulaDisplay.Caption := 'Formula ' + IntToStr(ImgNo);
end;
来自 Embarcadero VCL 参考资料
Call Assign to copy the properties or other attributes of one object
from another.
因此必须在调用 Assign
之前创建目标 Class
另一个建议是先创建一个 TJpegImage 实例 class,然后将其分配给您的临时 TJpegImage,如下所示:
var
JPegArray : array[0..10] of TJPEGImage;
...
var
JPeg : TJPEGImage;
begin
JPeg := TJPEGImage.Create;
JPeg.LoadFromFile('C:/M.jpg');
JPegArray[1] := TJPEGImage.Create;
JPegArray[1].Assign(JPeg);
JPeg.Free;
Image1.Picture.Assign(JPegArray[1]);
...
end;
Formulae: array [1..6] of TJPEGImage;
我有一个数组,我想在其中分配图像,以便我可以将它们显示到表单上。我使用了 JPEG data-stream to TImage 问题中的类似代码,但在 if 语句
处收到访问冲突错误消息procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer; NewImage: Boolean);
var
TempImg: TJPEGImage;
begin
TempImg:= TJPEGImage.Create;
TempImg.LoadFromFile('C2F'+inttostr(ImgNo)+'.jpg');
img_Formulae.Picture.Assign(TempImg);
// assigning each picture to an element in array if it is the first time. This will be used to save the pictures later on
If NewImage = True then Formulae[ImgNo].Assign(TempImg);
TempImg.Free;
ImgDisplayed:= ImgNo;
lbl_FormulaDisplay.Caption:= 'Formula ' + inttostr(ImgNo); //user can see which formula can be seen
end;
谢谢。
Formulae[ImgNo].Assign(TempImg);
这是试图将图片分配给一个已经创建的对象。但是,您的对象很可能尚未创建,因为我看不到在上面的代码中初始化它们的方法。 Assign
要求对象已经创建。
对于您的情况,理想的做法是在启动时确保提前在数组中创建所有这些对象。然后,也一定要在关闭时销毁它们。
您的整个代码可以像...一样简单
procedure Tfrm_calc2.FormCreate(Sender: TObject);
var
I: Integer;
begin
for I := Low(Formulae) to High(Formulae) do begin
Formulae[I] := TJpegImage.Create;
end;
end;
procedure Tfrm_calc2.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := Low(Formulae) to High(Formulae) do begin
FreeAndNil(Formulae[I]);
end;
end;
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer);
begin
Formulae[ImgNo].LoadFromFile('C2F'+IntToStr(ImgNo)+'.jpg');
ImgDisplayed:= ImgNo;
lbl_FormulaDisplay.Caption:= 'Formula ' + IntToStr(ImgNo);
end;
不需要加载另一个实例并分配它。直接加载文件即可。
在对数组调用 Assign
之前,您是否使用分配的对象填充数组?可能不会。尝试更像这样的东西:
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer);
var
TempImg: TJPEGImage;
begin
TempImg := TJPEGImage.Create;
try
TempImg.LoadFromFile('C2F'+IntToStr(ImgNo)+'.jpg');
img_Formulae.Picture.Assign(TempImg);
if Formulae[ImgNo] = nil then
begin
Formulae[ImgNo] := TempImg;
TempImg := nil;
end else
Formulae[ImgNo].Assign(TempImg);
finally
TempImg.Free;
end;
ImgDisplayed := ImgNo;
lbl_FormulaDisplay.Caption := 'Formula ' + IntToStr(ImgNo);
end;
或者:
procedure Tfrm_calc2.ChangeDisplay(ImgNo: Integer);
var
TempImg: TJPEGImage;
begin
TempImg := TJPEGImage.Create;
try
TempImg.LoadFromFile('C2F'+IntToStr(ImgNo)+'.jpg');
img_Formulae.Picture.Assign(TempImg);
FreeAndNil(Formulae[ImgNo]);
Formulae[ImgNo] := TempImg;
except
TempImg.Free;
raise;
end;
ImgDisplayed := ImgNo;
lbl_FormulaDisplay.Caption := 'Formula ' + IntToStr(ImgNo);
end;
来自 Embarcadero VCL 参考资料
Call Assign to copy the properties or other attributes of one object from another.
因此必须在调用 Assign
另一个建议是先创建一个 TJpegImage 实例 class,然后将其分配给您的临时 TJpegImage,如下所示:
var
JPegArray : array[0..10] of TJPEGImage;
...
var
JPeg : TJPEGImage;
begin
JPeg := TJPEGImage.Create;
JPeg.LoadFromFile('C:/M.jpg');
JPegArray[1] := TJPEGImage.Create;
JPegArray[1].Assign(JPeg);
JPeg.Free;
Image1.Picture.Assign(JPegArray[1]);
...
end;