【问题标题】:Modal buttons not working on form模态按钮在表单上不起作用
【发布时间】:2016-11-01 07:56:10
【问题描述】:

我正在显示一个使用 TActionManager 的表单,如下所示:

procedure TForm2.actAddImagineExecute(Sender: TObject);
begin
  addImagineForm.Show;
end;

表单如下所示:

  • 它包含以下内容:3 个TButton、1 个TOpenDialog 和1 个TImage
  • 按钮 Salveaza保存)是 Button3 并且将 ModalResult 设置为 mrOk
  • 按钮 Incarca Imagine加载图像)是 Button1
  • 按钮取消Button2,勾选了Cancel属性并将ModalResult设置为mrAbort

问题:

  • 当我点击表单上的Cancel按钮时,它并没有关闭,基本上什么都不做。
  • 当我单击表单上的 Salveaza 按钮时,它什么也不做。

Incarca Imagine 按钮的代码如下:

procedure TaddImagineForm.Button1Click(Sender: TObject);
var
  selectedFile: string;
  dlg: TOpenDialog;
begin
  selectedFile := '';
  dlg := TOpenDialog.Create(nil);
  try
    dlg.InitialDir := 'C:\';
    dlg.Filter := 'All files (*.*)|*.*';
    if dlg.Execute(Handle) then
      selectedFile := dlg.FileName;
      Image1.Picture.LoadFromFile(selectedFile);
  finally
    dlg.Free;
  end;
end;

名为SalveazaButton3)的按钮的代码是:

procedure TaddImagineForm.Button3Click(Sender: TObject);
var
  Field: TBlobField;
  Stream: TStream;
begin
  if dbmodule.comenziQuery.Active and (Image1.Picture.Graphic <> nil) then
  begin
    dbmodule.comenziQuery.Insert;
    Field := TBlobField(dbmodule.comenziQuery.FieldByName('pscreen')); // ensure it ís a blob
    Stream := dbmodule.comenziQuery.CreateBlobStream(Field, bmWrite);
    try
      Image1.Picture.Graphic.SaveToStream(Stream);
    finally
      Stream.Free;
      dbmodule.comenziQuery.Post;
    end;
  end;
end;
  • 我正在使用的TSQLQuery(名为comenziQuery)与我正在使用的其他东西(如DataSourceDataSet、@987654344)一起位于Data module @ 等等..) 数据模块被命名为 dbmodule
  • 数据库中应保存 .bmp 图像的列名为 pscreen,并设置为 mediumblob 类型。

我尝试过的事情:

  • 我尝试添加close;modalresult:=mrok;,但它似乎没有执行图像的代码,只是使保存 按钮工作并关闭表单但没有图像添加到数据库字段
  • 搜索了这方面的教程,找到了一堆,但它们不是我需要的,或者我显然不明白如何克服这个问题并让它发挥作用

【问题讨论】:

  • 您只在帖子的底部三分之一处陈述了您的问题。感谢您尝试包含所有可能的信息。但是您的实际问题是隐藏的,埋在无关紧要的山中。而且您的问题的标题与您的实际问题完全无关
  • @CraigYoung 实际上我刚刚注意到这一点,可能在尝试组织信息时被冲昏了头脑。问题是模式按钮不起作用,下面的答案已修复 - 现在看来我用来上传 bmp 的代码没有做任何事情(没有向该字段添加任何内容)所以我想我会关闭这并为此提出一个新的具体问题。对不起!

标签: delphi modal-dialog delphi-10-seattle


【解决方案1】:

你的问题是行动

procedure TForm2.actAddImagineExecute(Sender: TObject);
begin
  addImagineForm.Show;
end;

应该是

procedure TForm2.actAddImagineExecute(Sender: TObject);
begin
  addImagineForm.ShowModal;
end;

让模态按钮有任何意义。

编辑

另外一个问题是线条

        if dlg.Execute(Handle) then
          selectedFile := dlg.FileName;
          Image1.Picture.LoadFromFile(selectedFile);

您的缩进表明 Image1 只有在 dlg 成功执行时才会尝试加载。不是这种情况。它总是会尝试加载。你的代码应该是

if dlg.Execute(Handle) then
begin
selectedFile := dlg.FileName;
Image1.Picture.LoadFromFile(selectedFile);
end;

编辑2

根据您的评论/要求

procedure TaddImagineForm.Button1Click(Sender: TObject);
begin
    if OpenDialog1.Execute then
    begin
      Image1.Picture.LoadFromFile(OpenDialog1.FileName);
    end;
end;

【讨论】:

  • 大声笑,现在我感到很尴尬。是的,这确实有效,取消和保存按钮现在可以工作了。我是否需要在我的代码中的任何地方添加其他内容,或者只是您提到的这个更改,仅此而已?此外,加载 img 的代码似乎什么也不做,也没有将 bmp 加载到 blob 字段,但我想我必须为这个问题打开一个新问题,对吧?非常感谢你:)
  • 是的,这应该就是您所需要的,是的,您应该提出一个新问题。请接受这个答案。不过,我要质疑的一件事是,当表单上有 TOpenDlg 时,为什么要动态创建 TOpenDlg?请查看我的编辑以了解其他问题。
  • 是的,将接受并为 blob 问题打开一个新问题。我使用的代码不是在表单上使用 TOpenDialog 吗?那是我的印象。就像我提到的,使用来自网络的教程,所以可能这就是为什么,正如你所说,我正在创建一个新的。
  • 不,您使用的代码不使用表单上的对话框。您不需要 dlg 的任何代码。相反,您只需要 if OpenDialog1.Execute then 就可以了。没有创造,没有尝试……最终,也没有句柄。你现在能看到我的编辑吗?我是在写完评论后写的
  • @Dsm - 这句话是开玩笑的:P 我很欣赏这个链接,澄清一下。
猜你喜欢
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
相关资源
最近更新 更多