小编Tri*_*ber的帖子

将Jpeg图像转换为Bmp - 一些图像呈蓝色

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无法正常保存这些文件.所有这些都不会发生蓝色图像,一次只能进行一些随机批次.该软件处理数千种产品,因此有数千种可能的图片.

delphi graphics jpeg image-processing

10
推荐指数
3
解决办法
1万
查看次数

如何在FastReport中动态分配数据集?

我创建使用FastReport的设计,把它用Delphi 6.一份报告,但DataSet对于MasterData和字段是不是在设计时assinged.我想根据选中的时间在运行时设置这些属性DataSet.我怎样才能做到这一点?我怎样才能访问DataSetMasterData调用预览/打印/设计之前在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之前设置这些属性.任何帮助表示赞赏.

delphi dataset fastreport

9
推荐指数
1
解决办法
2万
查看次数

如何比较枚举类型的集合

从某一点来说,我厌倦了编写设置条件(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)

delphi delphi-10.2-tokyo

8
推荐指数
2
解决办法
249
查看次数

在XMLDocument中使用DocumentElement时发生访问冲突

当我尝试使用我总是得到一个访问冲突DocumentElementXMLDocument.我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)

delphi xmldocument

7
推荐指数
2
解决办法
4500
查看次数

Delphi:在应用程序退出时杀死线程?

背景:我需要检查一堆网络驱动器或远程计算机是否可用.由于每个都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 multithreading

7
推荐指数
2
解决办法
1004
查看次数

向Interface使用子句而不是Implementation uses子句添加单元

当使用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.

delphi

6
推荐指数
1
解决办法
4881
查看次数

从TSpeedButton中删除闪烁

重现步骤:

  1. 添加TPanel到新的VCL表单并进行设置Align = alClient.
  2. 添加TSpeedButton到面板并将一些bmp图像分配给Glyph属性.(可选但使得它更清晰:Flat = True)
  3. 运行应用程序,抓住表单的右下角并移动它.TSpeedButton将闪烁的图像.

我阅读了很多关于消除闪烁的内容,但这些建议似乎都不适用于TSpeedButton:

  • 没有DoubleBuffered财产
  • WS_EX_COMPOSITED不能设置,因为它不是一个TWinControl而是一个TGraphicControl
  • WM_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)

delphi

6
推荐指数
1
解决办法
370
查看次数

FDQuery导致内存不足异常

我有一个拥有300万条记录的Firebird数据库。我FetchOptionsRowsetSize := 1000FetchAll禁用。我在本地主机上工作。

我没有一页一页浏览的问题,但是当我单击中的“ 转到最后一条记录 ”按钮时DBNavigator,会抛出“ 内存不足 ”异常。

如果将UniDirectionalproperty 设置为True,则没有问题。但是,移至最后一条记录会使应用程序冻结30-40秒。

有什么问题和解决方法?

delphi firebird out-of-memory firedac

5
推荐指数
1
解决办法
1311
查看次数

将TByteDynArray转换为字符串

我正在使用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)

我成功地将转换stringTByteDynArray,但是我不知道如何将其转换TByteDynArraystring

delphi

4
推荐指数
1
解决办法
466
查看次数

使用新表单禁用Application.CreateForm

我有一个在应用程序启动之前检查设置和权限的函数,如果一切都通过,它会选择要运行的版本并相应地更改主窗体.

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)

delphi delphi-10.2-tokyo

3
推荐指数
2
解决办法
1172
查看次数