Любопытный специфический баг

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Любопытный специфический баг

Сообщение А.Н. » 04.07.2010 13:51:12

Есть форма со стринггридом и парой кнопок: "Ok", "Отмена".
При выборе в гриде строки и нажатии "Ok", в родительской форме устанавливается серия/номер, и всё работает.

Но, при выборе строки двойным щелчком по гриду, в родительской форме перестают работать все SpeedButton'ы.

Код по dblclik:
Код: Выделить всё
procedure TfrmBlankContracts.strgridPolisesDblClick(Sender: TObject);
begin
  sbtnOk.Click();
end;


Покликав по вкладкам pagecontrol в родительской форме, функциональность Speedbutton'ов возможно восстановить.

Это странно. Может, кто знает как это лечится?
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Любопытный специфический баг

Сообщение Brainenjii » 04.07.2010 14:17:22

Привести к виду
Код: Выделить всё
    procedure TfrmBlankContracts.strgridPolisesDblClick(Sender: TObject);
    begin
      sbtnOkClick(sbtnOk);
    end;

?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Любопытный специфический баг

Сообщение А.Н. » 04.07.2010 14:51:38

Не работает. Всё также.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Любопытный специфический баг

Сообщение Odyssey » 04.07.2010 15:20:11

А если вынести содержимое sbtnOkClick в отдельную процедуру и вызывать её и из sbtnOkClick, и из strgridPolisesDblClick? И если используется принудительное закрытие формы, может быть заменить его на установку ModalResult?
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Любопытный специфический баг

Сообщение А.Н. » 04.07.2010 15:24:05

Весь код этой процедуры:
Код: Выделить всё
//---------------------------------------------------------------------------
procedure TfrmBlankContracts.sbtnPanelClick(Sender: TObject);
begin
  if (Sender = sbtnOk) then
    begin
      with strgridPolises do
        FPolis := Rows[Row].Objects[0] as TBlankEntity;
      ModalResult := mrOK;
    end
  else if (Sender = sbtnCancel) then
    begin
      ModalResult := mrCancel;
    end;
end;
//---------------------------------------------------------------------------


Т.е., просто нечего выносить. Но, что интересно, проявляется эта ошибка всегда, при двойном клике и ни разу не проявлялась, при просто нажатии на кнопку.

Добавлено спустя 51 секунду:
Ну, и принудительного закрытия, как следует, не используется.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Любопытный специфический баг

Сообщение Odyssey » 04.07.2010 15:30:37

Хм, тогда предлагаю попробовать скопипастить код в обработчик грида, и посмотреть проявится ошибка или нет. И тогда, возможно, в багтрекер с примером :(
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Любопытный специфический баг

Сообщение А.Н. » 04.07.2010 15:50:48

Хм, тогда предлагаю попробовать скопипастить код в обработчик грида, и посмотреть проявится ошибка или нет.

В смысле, "в обработчик грида"?
Вся форма выглядит так:
Код: Выделить всё
unit blank_contracts;

{$mode objfpc}{$H+}

//
// Окно выбора пустого бланка.
//

interface

uses
  Classes, SysUtils, variants, FileUtil, LResources, Forms, Controls, Graphics,
  Dialogs, ExtCtrls, Buttons, ComCtrls, Grids, StdCtrls, strings_l10n,
  common_functions, data_unit, orm_infos_inscompany;

type

  { TfrmBlankContracts }

  TfrmBlankContracts = class(TForm)
    gbInsCompanyBlanks: TGroupBox;
    pnBottom: TPanel;
    pnHead: TPanel;
    sbarMain: TStatusBar;
    sbtnCancel: TSpeedButton;
    sbtnOk: TSpeedButton;
    strgridPolises: TStringGrid;
    procedure FormShow(Sender: TObject);
    procedure sbtnPanelClick(Sender: TObject);
    procedure strgridPolisesDblClick(Sender: TObject);
    procedure strgridPolisesHeaderClick(Sender: TObject; IsColumn: Boolean;
      Index: Integer);
  private
    FInsCompany: TInfInsCompany;
    FPolis: TBlankEntity;
  public
    property InsCompany: TInfInsCompany read FInsCompany write FInsCompany;
    property Blank: TBlankEntity read FPolis;
  end;

var
  frmBlankContracts: TfrmBlankContracts;

implementation
//---------------------------------------------------------------------------
procedure TfrmBlankContracts.FormShow(Sender: TObject);
var i: integer;
begin
  if (InsCompany = nil) then
    begin
      ModalResult := mrAbort;
      Visible     := false;
      exit;
    end;
  FPolis                      := nil;
  gbInsCompanyBlanks.Caption  := AnsiToUtf8(blank_sel_inscmp_hdr) + '`' +
    VarToStr(FInsCompany.InsCompanyName) + '`';

  with (strgridPolises) do
    begin
      Clean(0, 1, 1, RowCount - 1, [gzNormal, gzInvalid]);
      // Один ряд фиксирован.
      RowCount := InsCompany.Blanks.Count + 1;
    end;

  for i := 0 to InsCompany.Blanks.Count - 1 do
    begin
      with (strgridPolises) do
        begin
          Rows[i + 1].AddObject((InsCompany.Blanks[i] as TBlankEntity).DogSer,
            InsCompany.Blanks[i]);
          Cells[1, i + 1] :=
            VartoStr((InsCompany.Blanks[i] as TBlankEntity).DogNum);
        end;
    end;
end;
//---------------------------------------------------------------------------
procedure TfrmBlankContracts.sbtnPanelClick(Sender: TObject);
begin
  if (Sender = sbtnOk) then
    begin
      with strgridPolises do
        FPolis := Rows[Row].Objects[0] as TBlankEntity;
      ModalResult := mrOK;
    end
  else if (Sender = sbtnCancel) then
    begin
      ModalResult := mrCancel;
    end;
end;
//---------------------------------------------------------------------------
procedure TfrmBlankContracts.strgridPolisesDblClick(Sender: TObject);
begin
  sbtnOk.OnClick(sbtnOk);
end;
//---------------------------------------------------------------------------
procedure TfrmBlankContracts.strgridPolisesHeaderClick(Sender: TObject;
  IsColumn: Boolean; Index: Integer);
begin
  GridSort(strgridPolises, Index);
end;
//---------------------------------------------------------------------------
initialization
  {$I blank_contracts.lrs}

end.


Это код вызова:
Код: Выделить всё
  else if (Sender = sbtnPolisSelect) then
  // Пустой бланк полиса.
    begin
      with (cbInsCompany) do
        begin
          if (Items.Objects[ItemIndex] = nil) then exit;
          (Target as TContractEntity).IDInsuranceCompany :=
            (Items.Objects[ItemIndex] as TInfInsCompany).IDInsCompany;
          frmBlankContracts.InsCompany :=
            Items.Objects[ItemIndex] as TInfInsCompany;
        end;

      if (frmBlankContracts.ShowModal() = mrOK) then
        begin
          if (frmBlankContracts.Blank = nil) then exit;
          with (frmBlankContracts.Blank) do
            begin
              if (not BlankReserve()) then
                begin
                  MessageDlg(AnsiToUTF8(cls_error),
                    AnsiToUTF8(contract_mgr_msg_blank_err), mtError, [mbOK], '');
                  exit;
                end;
              edPolisSer.Text                     := VarToStr(DogSer);
              edPolisNum.Text                     := VarToStr(DogNum);
              (Target as TContractEntity).DogSer  := edPolisSer.Text;
              (Target as TContractEntity).DogNum  := edPolisNum.Text;
            end;
        end; // if (mrOk)
    end // if (Sender = sbtnPolisSelect)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58

Re: Любопытный специфический баг

Сообщение Odyssey » 04.07.2010 17:54:06

Так:
Код: Выделить всё
procedure TfrmBlankContracts.strgridPolisesDblClick(Sender: TObject);
begin
  with strgridPolises do
    FPolis := Rows[Row].Objects[0] as TBlankEntity;
  ModalResult := mrOK;
end;

Если баг сохранится (что довольно вероятно) было бы здорово воспроизвести его на простейшем примере с формой и гридом и зарепортить всё это.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Любопытный специфический баг

Сообщение А.Н. » 04.07.2010 19:18:20

Не работает.
Кстати:
1. Наведение на кнопки работает. Т.е., они подсвечиваются и всё-такое.
2. Не нажимаются, вообще. Т.е., даже эффекта нажатия нет.
3. Однократная смена вкладок не спасает. Но после многократной смены, кнопки начинают работать.

Попробую чуть позже воспроизвести. Но у меня есть сомнения.
Структура вызывающей (главной) формы достаточно сложная. Может зависеть от этого.
3-4 уровня иерархии контролов. Ещё там неправильно работает компонент TZVDatetimePicker.
Не показывает время. Переместил на уровень выше - стал показывать. Хотя это и неправильно. К тому же, проблемы с taborder, но работает, с грехом пополам.
А.Н.
постоялец
 
Сообщения: 230
Зарегистрирован: 13.03.2010 12:23:58


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 38

Рейтинг@Mail.ru