我尝试在imgQInput(这是一个TImage)中加载图像,将其分配给TJpegImage,压缩它(压缩因子5)并在imgQOutput(另一个TImage)中显示它.但它不起作用.imgQOutput中的图像与原始图像相同.由于压缩因素,它应该看起来非常像素化!然而,压缩工作正常,因为当我将JPEG保存到磁盘时,它真的很小.
JPG:= TJPEGImage.Create;
TRY
JPG.CompressionQuality:= trkQuality.Position;
JPG.Assign(imgQInput.Picture.Graphic);
CompressJpeg(JPG);
imgQOutput.Picture.Assign(JPG); <--------- something wrong here. the shown image is not the compressed image but the original one
FINALLY
FreeAndNil(JPG);
END;
function CompressJpeg(OutJPG: TJPEGImage): Integer;
VAR tmpQStream: TMemoryStream;
begin
tmpQStream:= TMemoryStream.Create;
TRY
OutJPG.Compress;
OutJPG.SaveToStream(tmpQStream);
OutJPG.SaveToFile('c:\CompTest.jpg'); <--------------- this works
Result:= tmpQStream.Size;
FINALLY
FreeAndNil(tmpQStream);
END;
end;
Run Code Online (Sandbox Code Playgroud) 似乎StrToInt没有Ansi重载.这是正确的吗?或许我错过了一些东西.StrToInt坚持将我的ansistrings转换为字符串.
我有一个项目 (C:\Test\Test.dpr) 使用属于库 (MyLib.DPK) 的文件 (External.pas)。库中的所有文件都可以通过“搜索”路径访问,但我也直接在我的 DPR 文件中包含了 External.pas:
program Test;
uses
External in '..\Packages\MyLib\External.pas', <------ the 'external' file
FormMain in 'FormMain.pas' {frmMain};
Run Code Online (Sandbox Code Playgroud)
对于这个项目,我将“输出目录”和“输出 DCU 目录”设置为“.\$(Platform)_$(Config)”。
当我编译时,这个项目的所有DCU的exe文件都写在正确的输出文件夹中:c:\Test\Win64_Debug\
但是,External.dcu 生成在 ..\Packages\MyLib\External.dcu
而不是 c:\Test\Win64_Debug\
这是为什么?
让我换个方式问这个问题:如果我将一个位于不同文件夹中的 PAS 文件附加到 DPR 项目中,那么所有 DCU 文件(包括外部文件)不应该与 EXE 文件在同一文件夹中生成吗?
据说经常(但并非总是)当你在一个接近于零的内存位置(如89美元)获得AV时,你有一个未初始化的指针.
但是我也在德尔福书中看过这个......嗯......或者他们都是由同一个作者写的?
更新:
引自Bob Swart等人的"C++ builder 6开发人员指南",第71页:
当存储器地址ZZZZZZZZZ接近零时,原因通常是已被访问的未初始化指针.
为什么会这样?为什么未初始化的指针包含低数字?为什么不像$ FFFFFFF这样的大数字或普通的随机数呢?这是都市神话吗?
我想创建一个字符串网格来显示某种垂直光标以突出显示当前选定的列.因此,在MouseDown中我调用setCurPos,然后调用InvalidateCol使当前列无效.这称为DrawCell.DrawCell将光标绘制在当前列上.
问题是:如果我在网格中有更多行,那么它可以显示其中一些不可见(当然),因此网格的垂直滚动条将自动出现.当我向下滚动以查看网格底部的行时,光标不会在这些行中绘制.看起来像未绘制光标的底行(现在在屏幕上可见)的数量与网格顶部的不可见行的数量成比例.
如果我最小化并恢复应用程序,光标很好地绘制.所以,很明显invalidateColumn()不起作用.
procedure TmyGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
VAR aCol, aRow: Integer;
begin
MouseToCell(X, Y, ACol, ARow);
...
inherited MouseDown(Button, Shift, X, Y);
CursorPosFocus:= ACol;
end;
procedure TmyGrid.setCurPos(CONST NewColumn: Integer);
VAR OldPos: Integer;
begin
...
OldPos:= CursorPos;
FCursorPos:= NewColumn;
...
//- This is not working:
//InvalidateCol(OldPos);
//InvalidateCol(NewColumn);
//Update;
//- THIS WORKS:
InvalidateGrid;
end;
procedure TmyGrid.DrawCell(ACol, ARow: integer; ARect: TRect; AState: TGridDrawState);
Var TempRect: TRect;
begin
inherited;
...
{DRAW CURSOR}
if CursorPos= ACol then
begin
TempRect.Top := 0; …Run Code Online (Sandbox Code Playgroud) 我在这里有一个类似的问题,但它面向PHP方面.看起来PHP能够接收一个数据包并立即(在同一个会话中)发送和回复.我的问题是Delphi能做到吗?据我所知,答案是一个很大的NO.我需要分两步完成(两个程序).问题是当第一个程序结束时,会话可能会关闭.我可以在两个过程调用之间保持会话打开.
我在Indy 10.5.7(Delphi 7下)中有这个漏洞.
5 - 12字节:TIdThreadSafeInteger x 1
21 - 36字节:TIdCriticalSection x 2
我像这样使用Indy:
function getWeb(a,b:Integer):Integer;
var url: string;
H: TIdHttp;
SS: TStringStream;
begin
url := 'http://blabla';
H := TIdHttp.Create(nil);
try
SS := TStringStream.Create('');
try
H.Get(url, SS);
Result := StrToInt(SS.DataString);
FINALLY
SS.Free;
END;
finally H.Free;
end;
Run Code Online (Sandbox Code Playgroud)
泄漏本身并不打扰我,因为在应用程序关闭.这使得我的瓜爆炸是我每次关闭应用程序时看到的错误消息.
为什么会出现这种泄漏
我检查了Indy网站,但它几乎没有意义.无论如何,看起来这个bug无法修复:最新版本的Indy无法用Delphi 7编译.唯一的解决方案可能是Indy 9.更新:看起来网站上的内容调用v10.203实际上是v10.2.3 .
我想快速显示一些图像(jpg,png等)作为缩略图.因为解码和调整大小过程是懒惰的,所以我要在一个或多个线程中完成它.
但是,看起来使用TBitmap的画布并且TJpeg不是多线程安全的.
在这种情况下,我的问题是:
1.如果不完全重写GIF/PNG/BMP/JPG库,怎么办呢?
2.有人知道Embarcadero的Gif和Png libs是否也不安全?
3.如果我使用Lock锁定画布不会破坏性能,因为调整大小部分访问画布并占用大部分CPU周期?
我发现这让我很烦恼:
David HAROUCHE写道:这不正确.真正令人困惑的部分是,即使本地TBitmap不是线程安全的,除非你锁定它们.这是因为每个TBitmap都将自己注册到graphics.pas中的全局BitmapCanvasList列表.当DC垃圾收集FreeMemoryContexts()
http://www.codenewsfast.com/cnf/thread/0/permalink.thr-ng1908q2024
人们会相信,看看名称,SysUtils(Delphi XE)中定义的AnsiSameText将接收ANSI字符串作为参数,但函数定义如下:
function AnsiSameText(const S1, S2: string): Boolean
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?
在AnsiStrings单元中有一个ANSI函数,但为什么这个(在Sysutils中)称为'ansi'?
在某些情况下,我需要设置动态数组的大小,然后用零填充它.
就像是:
procedure SetLengthAndZero(VAR X; NewSize: Integer);
begin
SetLength(x, newsize);
if newsize > 0
then FillChar(x[0], length(x)* SizeOf(x[0]), 0);
end;
Run Code Online (Sandbox Code Playgroud)
但上面的代码(显然)不会编译.