sorry_i_noob
@sorry_i_noob

Почему код работает при событии — нажатие на кнопку. Но не работает при событии — создание формы?

Есть такой код.
unit UnitMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids,
  DBConnection, Vcl.StdCtrls;

type
  TFormMain = class(TForm)
    DBGrid1: TDBGrid;
    SelectedId: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure GetIdFromSelectedRow(DataSet: TDataSet);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure TFormMain.Button1Click(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.AfterScroll := GetIdFromSelectedRow;
end;

procedure TFormMain.FormCreate(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.AfterScroll := GetIdFromSelectedRow;
end;

procedure TFormMain.GetIdFromSelectedRow(DataSet: TDataSet);
begin
  SelectedId.Caption := DataSet.FieldByName('id').AsString;
end;

end.

Он выдает вот такую ошибку:
5d0f6ef3022af919991346.png
Если не закомментировать действие при создании формы:
procedure TFormMain.FormCreate(Sender: TObject);
begin
  DBGrid1.DataSource.DataSet.AfterScroll := GetIdFromSelectedRow;
end;

Но при нажатии кнопки этот код работает и не выдает никаких ошибок.
Почему так? Мне нужно выполнять этот код именно при старте приложения. Как обойти эту ошибку? Я пробовал sleep, но это не помогло.
  • Вопрос задан
  • 95 просмотров
Решения вопроса 1
@kalapanga
Ещё не создана форма и, соответственно, компоненты на ней. DBGrid1 ещё не существует, когда Вы пытаетесь к нему обращаться. Попробуйте использовать событие формы OnShow.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
tsklab
@tsklab
Здесь отвечаю на вопросы.
type
  TFormMain = class(TForm)
    DBGrid1: TDBGrid;
    DBText1: TDBText;
    procedure FormCreate(Sender: TObject);
  private    { Private declarations }
  public    { Public declarations }
  end;

var
  FormMain: TFormMain;

implementation

{$R *.dfm}

procedure TFormMain.FormCreate(Sender: TObject);
begin
  DBText1.DataSource := DBGrid1.DataSource;
  DBText1.Field := DBGrid1.DataSource.DataSet.FieldByName('id')
end;

end.
Ответ написан
Комментировать
IgorPI
@IgorPI
При создании объектов обращаем внимание на цикл жизни приложения

Например ваша ошибка говорит о том что объекта ещё не существует Но вы вызывайте его методы / свойства
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы