Почему бы OnShow не вызываться для TForm? - PullRequest
0 голосов
/ 22 сентября 2011

Я работаю над проектом в Delphi 7, и я не очень близок с языком или средой выполнения. Я пытаюсь отладить проблему, когда форма становится видимой и окрашенной, но по какой-то причине событие OnShow не вызывается. В каком случае это может произойти? Где именно я должен искать?

Ответы [ 5 ]

4 голосов
/ 22 сентября 2011

Единственное объяснение, которое имеет смысл для меня, это то, что событие OnShow неправильно связано с вашим обработчиком.Проверьте в инспекторе объектов или в формате .dfm.Если вы подключаетесь в коде, убедитесь, что вы подключились достаточно рано.

1 голос
/ 22 сентября 2011

Существует еще одна возможность, когда событие OnShow не вызывается, когда форма отображается с

ShowWindow(Form.Handle, SW_SHOW);   

Я видел такое в прошлом, когда заглядывал в какой-то проект, для Delphi это действительно плохая идея.

0 голосов
/ 21 ноября 2011

Возникла похожая проблема, когда не вызывался обработчик OnShow, установленный с помощью инспектора объектов. Я обнаружил, что во время выполнения программы был назначен другой обработчик, перезаписывающий мои настройки, так что вы также можете искать в коде возможное назначение OnShow.*

0 голосов
/ 23 сентября 2011

Если вы хотите сделать что-то, когда форма загружена, и вы хотите быть уверены, что все компоненты инициализированы, вы можете использовать загруженный

protected
   procedure Loaded; override;

Он вызывается при создании формы.

Дополнительным преимуществом является то, что всплывающая форма инициализируется без медленного построения формы, как это может случиться с OnActivate.

0 голосов
/ 23 сентября 2011

вы должны проверить здесь

Fist OnShow () должен быть объявлен.

type
  TForm2 = class(TForm)
    procedure FormShow(Sender: TObject); // <--- IM HERE!
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Во-вторых ...

implementation

{$R *.dfm}

procedure TForm2.FormShow(Sender: TObject); <--- IM HERE!
begin
 //this time will trigger
end;

и последнее, вы должныоткройте Dfm, ищите событие FormShow

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 284
  ClientWidth = 418
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnShow = FormShow      <--- IM HERE! without this it will not trigger the OnFormShow
  PixelsPerInch = 96
  TextHeight = 13
end

, если оно все еще не работает, его можно отнести к имени другой функции OnShow = FormStart или к любому имени функции.

...