2015-02-05 6 views
2

Я довольно новичок в delphi, и я продолжаю получать нарушения доступа, когда пытаюсь получить доступ к массиву «nieuwButtons». Кто-нибудь знает, что я делаю неправильно?Продолжайте получать нарушение доступа при попытке доступа к массиву

unit UGeneral; 

    interface 

    uses 
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 
    System.Classes, Vcl.Graphics, 
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.DBGrids, SMDBGrid, 
    KJSMDBGrid, Vcl.ExtCtrls, KJPanel, Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, 
    Data.DB; 

    type 
    TGeneral = class(TObject) 

    private 
     { Private declarations } 

    public 
     nieuwButtons: array of TButton; 
     nieuwButtonsDataSource: array of TDataSource; 

     procedure listEdits(x, y: Integer; owner: TComponent; parent: TWinControl; 
     source: TDataSource); 
     procedure nieuwClick(Sender: TObject); 
     { Public declarations } 
    end; 

    var 
    General: TGeneral; 

    implementation 

    procedure TGeneral.nieuwClick(Sender: TObject); 
    var 
    i: Integer; 

    begin 
    for i := 0 to Length(nieuwButtons) - 1 do 
    begin 
     if (nieuwButtons[i] = Sender) then 
     begin 
     nieuwButtonsDataSource[i].DataSet.Insert; 
     end; 
    end; 
    end; 

    procedure TGeneral.listEdits(x, y: Integer; owner: TComponent; 
    parent: TWinControl; source: TDataSource); 
    var 
    i: Integer; 
    edit: TDBEdit; 
    _label: TLabel; 
    biggestWidth: Integer; 
    button: TButton; 
    edits: array of TDBEdit; 
    index: Integer; 
    begin 
    if nieuwButtons <> nil then //I get an access violation here 
    begin 
     SetLength(General.nieuwButtons, 0); 
     SetLength(nieuwButtonsDataSource, 0); 
    end; 
    index := Length(nieuwButtons); 
    SetLength(nieuwButtons, index + 1); 
    SetLength(nieuwButtonsDataSource, index + 1); 
    button := TButton.Create(owner); 
    button.parent := parent; 
    button.Top := y; 
    button.Left := x; 
    button.Caption := 'Nieuw'; 
    button.OnClick := nieuwClick; 

    nieuwButtons[index] := button; 
    nieuwButtonsDataSource[index] := source; 

    biggestWidth := 0; 
    SetLength(edits, source.DataSet.Fields.Count); 
    edit := TDBEdit.Create(owner); 
    for i := 0 to source.DataSet.Fields.Count - 1 do 
    begin 
     _label := TLabel.Create(owner); 
     _label.parent := parent; 
     _label.Caption := source.DataSet.Fields[i].FieldName; 
     _label.Top := ((i * 22) + 30 + y); // 22 = standaard(?) hoogte van edittext 
     _label.Left := x; 

     _label.Show; 

     if _label.Width > biggestWidth then 
     begin 
     biggestWidth := _label.Width; 
     end; 
    end; 
    i := 0; 
    for i := 0 to source.DataSet.Fields.Count - 1 do 
    begin 
     edit := TDBEdit.Create(owner); 
     edit.parent := parent; 
     edit.DataField := source.DataSet.Fields[i].FieldName; 
     edit.DataSource := source; 
     edit.Top := ((i * edit.Height) + 30 + y); 
     edit.Left := biggestWidth + 30; 
     edits[i] := edit; 
     edit.Show; 
    end; 

    end; 

end. 
+0

Assigned бросает нарушение доступа также:/ – user2073973

+0

Расположение предполагает что 'Self' является' nil'. Покажите, как вы вызываете 'listEdits'. –

+0

General.listEdits (0, 0, Self, KJPanel4, DataModule2.bestemmingSource); – user2073973

ответ

5

Единственный путь для этой строки кода, чтобы поднять исключение, если экземпляр TGeneral не является действительным.

Ошибка будет найдена в коде, который создает экземпляр класса. Общими формами этой ошибки являются:

  1. Забыть о создании объекта вообще.
  2. Неправильно создавая объект, вызывая конструктор вместо неинициализированного экземпляра.

Для иллюстрации последней неисправности, это выглядит следующим образом:

var 
    General: TGeneral; 
.... 
General.Create; // sometimes this way 
General := General.Create; // or sometimes this way 

Но правильный путь, как это:

General := TGeneral.Create; 
+0

Спасибо! Это разрешило это. Мне кажется странным, что я даже могу назвать функции внутри общего, когда объект еще не был создан. – user2073973

+1

Здесь 'General' на самом деле не что иное, как указатель. Когда вы пишете «General.DoSomething (42)», на самом деле происходит то, что объект метода вызывает «General», передается как дополнительный неявный параметр. Так что это действительно «TGeneral.DoSomething (General, 42)». Теперь, если 'General' не был инициализирован, чтобы указывать на действительный экземпляр, вызов прекрасен, но внутри объекта, когда вы пытаетесь обратиться к' Self', вы обычно сталкиваетесь с ошибками во время выполнения. –

+0

А это имеет смысл! Не знал, что это сработало, только программирование в дельфи в течение 2 дней. Через минуту вы пометите свой ответ как решение. – user2073973

Смежные вопросы