我正在拍摄照片查看器.在这种情况下,我写了一个小类,以便能够读取和使用一些EXIF数据,例如图像方向.这门课程适合阅读.
但是,我会添加一个新选项来旋转照片.我想旋转并写入照片数据本身,而不仅仅是重写方向标签.我已经编写了代码来旋转并保存主JPEG图像,它运行良好.但是我还需要旋转EXIF数据中包含的缩略图(如果有的话),以保持图像的连贯性.出于这个原因,我需要写入EXIF数据,以替换现有的缩略图.
但这提出了一些问题,我在回答时遇到了一些麻烦,即:
问候
在Delphi中,我将一个3x3矩阵表声明为Single数组的数组,如下所示:
m_Table: array [0..2] of array [0..2] of Single;
Run Code Online (Sandbox Code Playgroud)
现在我想将内容与另一个表进行内存比较,或者从另一个表中复制表内容.我知道我可以创建一个嵌套循环来做到这一点,但我希望在没有任何循环的情况下完成这项工作,如果可能的话.
我的问题是,复制或比较这样的内存是正确的:
CompareMem(m_Table, other.m_Table, 9 * SizeOf(Single));
CopyMemory(m_Table, other.m_Table, 9 * SizeOf(Single));
Run Code Online (Sandbox Code Playgroud)
如果没有,这样做的正确方法是什么?
作为一个辅助问题,是否有更好的方法来获取复制长度而不是9*SizeOf(Single),例如SizeOf(m_Table ^)?
问候
在Delphi XE7(我使用RAD Studio)中,我尝试调试包内的代码.我遇到了一个我无法解释的奇怪情况.例如,我有一个类似于下面的功能(注意我知道,这个功能没有任何智能,请不要纠正它,因为我不在现实世界中使用它.它只是一个虚拟函数来说明问题我面对.)
procedure TMyClass.DemoFunc();
var
pTest: TObjectList<TObject>;
pProperty: TObject;
begin
pTest := TObjectList<TObject>.Create;
for pProperty in pTest do
pProperty.ToString;
pTest.Free;
end;
Run Code Online (Sandbox Code Playgroud)
当我调试上面的代码时,我注意到调试器进入了该行
pProperty.ToString;
Run Code Online (Sandbox Code Playgroud)
如果我试着追踪上面的那一行,我会跳到
destructor TObject.Destroy;
Run Code Online (Sandbox Code Playgroud)
但是从我的观点来看,这是完全不合逻辑的,因为pTest显然是空的,所以不应该调用上面的行.
有人可以向我解释这种奇怪的行为吗?
注意我尝试调试的代码是在Delphi包中,但是该函数是从c ++项目调用的.
问候
我观察了几个Assign()过程并注意到在分配期间通常会忽略事件.例如,TBitmap分配方法不会复制OnChange事件.我想知道
问候
我正在创建一个程序包,其中自定义图像列表在DFM文件中读取和写入其内容。
我编写的代码在XE7和10.3 Rio之间的所有编译器中都可以很好地全局运行。但是我在XE2中有一个奇怪的问题。使用此特定的编译器,有时在读取DFM时会收到空的流内容,有时会收到损坏的内容。
我的自定义图像列表是在标准TImageList之上构建的。我以这种方式注册我的读回调:
procedure TMyImageList.DefineProperties(pFiler: TFiler);
function DoWritePictures: Boolean;
begin
if (Assigned(pFiler.Ancestor)) then
Result := not (pFiler.Ancestor is TMyImageList)
else
Result := Count > 0;
end;
begin
inherited DefineProperties(pFiler);
// register the properties that will load and save the pictures binary data in DFM files
pFiler.DefineBinaryProperty('Pictures', ReadPictures, WritePictures, DoWritePictures);
end;
Run Code Online (Sandbox Code Playgroud)
这是ReadPictures函数:
procedure TMyImageList.ReadPictures(pStream: TStream);
begin
LoadPictureListFromStream(m_pPictures, pStream);
end;
Run Code Online (Sandbox Code Playgroud)
这是LoadPictureListFromStream函数:
procedure TMyImageList.LoadPictureListFromStream(pList: IWPictureList; pStream: TStream);
var
{$if CompilerVersion <= 23}
pImgNameBytes: Pointer;
pData: Pointer;
{$else}
imgNameBytes: TBytes;
{$ifend}
count, i: …Run Code Online (Sandbox Code Playgroud)