Delphi似乎不喜欢一些Jpg图像.它似乎特定于我正在加载的文件.并且过程很简单 - a)将Jpg图像加载到TJpegImage,b)将Jpg对象分配给TBitmap对象,以及c)保存和/或显示Bmp图像.出于某种原因,这些图片不断出现蓝色调.
这些图像完美地展示了我装载它们的任何地方和任何地方(windows picture viewer,paint,photoshop等).
我正在做的很简单......
procedure Load;
var
J: TJpegImage;
B: TBitmap;
begin
J:= TJpegImage.Create;
B:= TBitmap.Create;
J.LoadFromFile('C:\SomeFile.jpg');
B.Assign(J);
//Either save or display `B` and it appears blueish at this point
....
Run Code Online (Sandbox Code Playgroud)
我想尽可能避免收到任何第三方的东西.Delphi版本7,2010和XE2中存在此问题.至少XE2中的TImage控件正确显示它(而不是旧的两个),但是如果TBitmap仍然不起作用则无关紧要.这个文件有什么问题?和/或,Delphi的渲染有什么问题?
添加了信息
我最近发现了一些关于这些图像的东西.当他们来自供应商(产品图片)时,他们采用CMYK格式.那时,Delphi 7没有正确支持这些文件(具有访问冲突和坏图像),因此所有图片都通过转换器过滤为RGB颜色格式.许多原始图像也是TIFF并转换为JPG.因此,软件似乎FastStone Image Resizer无法正常保存这些文件.所有这些都不会发生蓝色图像,一次只能进行一些随机批次.该软件处理数千种产品,因此有数千种可能的图片.
我创建使用FastReport的设计,把它用Delphi 6.一份报告,但DataSet对于MasterData和字段是不是在设计时assinged.我想根据选中的时间在运行时设置这些属性DataSet.我怎样才能做到这一点?我怎样才能访问DataSet的MasterData调用预览/打印/设计之前在Delphi?添加了以下代码frxReport1BeforePrint.
t := frxReport1.FindObject('MasterData1') as TfrxMasterData;
//if Assigned(t) then
//t.DataSet := frxIBODataset1;
m := frxReport1.FindObject('mTenderType') as TfrxMemoView;
if Assigned(m) then
begin
m.DataSet := frxIBODataset1;
m.DataField := 'ACCOUNTNAME';
m.Text := '[frxIBODataset1."ACCOUNTNAME"]';
end;
Run Code Online (Sandbox Code Playgroud)
但是我需要在调用print/design/preview之前设置这些属性.任何帮助表示赞赏.
从某一点来说,我厌倦了编写设置条件(and,or),因为对于更多条件或更长的变量名称,它开始变得笨拙并且令人讨厌再次写入.所以我开始写助手,所以我可以写ASet.ContainsOne([ceValue1, ceValue2])而不是(ceValue1 in ASet) or (ceValue2 in ASet).
type
TCustomEnum = (ceValue1, ceValue2, ceValue3);
TCustomSet = set of TCustomEnum;
TCustomSetHelper = record helper for TCustomSet
function ContainsOne(ASet: TCustomSet): Boolean;
function ContainsAll(ASet: TCustomSet): Boolean;
end;
implementation
function TCustomSetHelper.ContainsOne(ASet: TCustomSet): Boolean;
var
lValue : TCustomEnum;
begin
for lValue in ASet do
begin
if lValue in Self then
Exit(True);
end;
Result := False;
end;
function TCustomSetHelper.ContainsAll(ASet: TCustomSet): Boolean;
var
lValue : TCustomEnum;
begin
Result := …Run Code Online (Sandbox Code Playgroud) 当我尝试使用我总是得到一个访问冲突DocumentElement的XMLDocument.我XMLDocument根据一些文件的存在创建.
错误信息
项目project1.exe引发异常类EAccessViolation,消息'模块'地址0047B152中的访问冲突'project1.exe'.地址B1D59357'
我的代码
unit XMLBase;
interface
uses
SysUtils, xmldom, XMLIntf, XMLDoc, Forms;
type
TXMLbase = class
private
{ Private declarations }
public
XMLDocument1: TXMLDocument;
root: IXMLNode;
constructor Create;
end;
var
fn: string;
implementation
constructor TXMLbase.Create;
begin
fn := ChangeFileExt(Application.ExeName, '.xml');
XMLDocument1 := TXMLDocument.Create(nil);
XMLDocument1.Options := [doNodeAutoIndent];
XMLDocument1.Active := False;
//optional, is used to indent the Xml document
if FileExists(fn) then
begin
XMLDocument1.LoadFromFile(fn);
XMLDocument1.Active:= True;
root := XMLDocument1.DocumentElement; //<<--- Access Voilation
end
else
begin …Run Code Online (Sandbox Code Playgroud) 背景:我需要检查一堆网络驱动器或远程计算机是否可用.由于每个都DirectoryExists()需要大量时间直到潜在的超时,我在单独的线程中执行检查.最终用户可能会在某些检查仍在运行时关闭应用程序.由于DirectoryExists()块,我没有机会使用经典while not Terminated方法.
procedure TMyThread.Execute;
begin
AExists := DirectoryExists(AFilepath);
end;
Run Code Online (Sandbox Code Playgroud)
问题1:当应用程序退出时,某些线程是否仍在运行是否存在问题?Windows会简单地整理一下我就是这样吗?在IDE内部,我收到了未释放对象的通知,但在IDE之外它似乎很平静.
问题2:在这种情况下是否有可能终止这样的简单线程TerminateThread或者这可能是有害的?
问题3:我通常从OnTerminate()事件中的线程获取结果,然后让线程FreeOnTerminate.如果我想自己释放它们,我什么时候应该这样做?我可以在它的OnTerminate事件中释放一个线程,或者这有点太早了?一个线程如何通知我,如果没有,它会被完成OnTerminate?
当使用Delphi时:如果我有一个充满常量的单元,比如...
unit AConsts;
interface
const
Const1 : WideString = 'Const1';
Const2 : WideString = 'Const2';
Const3 : WideString = 'Const3';
Const4 = 100;
Const5 = 100;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
我想从另一个单位使用这个单位,两者之间是否有任何区别......
unit AUnit;
interface
uses
AConsts;
Implementation
end.
Run Code Online (Sandbox Code Playgroud)
和
unit AUnit;
interface
implementation
uses
AConsts;
end.
Run Code Online (Sandbox Code Playgroud)
?或者换句话说,就编译的应用程序而言,两者之间是否存在差异?
[编辑1]
谢谢你到目前为止的答案.
我没有把这个问题弄清楚,为此我道歉.问题不在于范围,避免循环引用等.它是关于编译应用程序的差异.也许另一个例子会有帮助.
如果UnitA,UnitB和UnitC都使用AConsts,那么在App1之间编译应用程序(假设AConsts单元和其他代码中的常量之间没有名称冲突)会有区别,其中这些UnitA,UnitB和UnitC都在接口中有AConsts section的uses子句和App2,其中UnitA,UnitB和UnitC都在Implementation部分的uses子句中都有AConsts.
重现步骤:
TPanel到新的VCL表单并进行设置Align = alClient.TSpeedButton到面板并将一些bmp图像分配给Glyph属性.(可选但使得它更清晰:Flat = True)TSpeedButton将闪烁的图像.我阅读了很多关于消除闪烁的内容,但这些建议似乎都不适用于TSpeedButton:
DoubleBuffered财产WS_EX_COMPOSITED不能设置,因为它不是一个TWinControl而是一个TGraphicControlWM_ERASEBKGND 消息未收到如果它有任何重要性,我实际上正在使用TPngSpeedButton,但由于实际问题在于TSpeedButton,我在示例中使用它.
这有什么解决方案吗?
编辑:由于某种原因,到目前为止没有人能够重现这一点,所以为了确保它不是我的描述,这里是dfm:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 337
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False …Run Code Online (Sandbox Code Playgroud) 我有一个拥有300万条记录的Firebird数据库。我FetchOptions是RowsetSize := 1000用FetchAll禁用。我在本地主机上工作。
我没有一页一页浏览的问题,但是当我单击中的“ 转到最后一条记录 ”按钮时DBNavigator,会抛出“ 内存不足 ”异常。
如果将UniDirectionalproperty 设置为True,则没有问题。但是,移至最后一条记录会使应用程序冻结30-40秒。
有什么问题和解决方法?
我正在使用Web服务,但在文本内容中发现无效字符时遇到问题。我没有太多的编码经验,所以我决定将数据传递为TByteDynArray。这是我从此答案中使用的代码。
class function StringHelper.StringToByteArray(value: string): TByteDynArray;
begin
SetLength(Result, Length(value) * SizeOf(Char));
if Length(value) > 0 then
begin
Move(value[1], Result[0], Length(value) * SizeOf(Char));
end;
end;
Run Code Online (Sandbox Code Playgroud)
我成功地将转换string为TByteDynArray,但是我不知道如何将其转换TByteDynArray为string。
我有一个在应用程序启动之前检查设置和权限的函数,如果一切都通过,它会选择要运行的版本并相应地更改主窗体.
function SomeControlFunction: Boolean;
var
lMainForm : TForm;
begin
if SomePermission then
Application.CreateForm(TUForm1, lMainForm)
else
Application.CreateForm(TUForm2, lMainForm);
end;
Run Code Online (Sandbox Code Playgroud)
Project.dpr
Application.Initialize;
if SomeControlFunction then
Application.Run;
Run Code Online (Sandbox Code Playgroud)
不幸的是,每次我在项目中创建一个新表单时,它都会自动添加Project.dpr,我每次都要删除它.有没有办法禁用此行为或整个过程是错误的,我应该以不同的方式运行应用程序?
Application.Initialize;
if SomeControlFunction then
Application.CreateForm(TUNewForm, UNewForm);
Application.Run;
Run Code Online (Sandbox Code Playgroud)