Das meiste wurde bereits gesagt:
Nur weil der Name der Klasse mit 'dbctrl' beginnt, kann man nicht einfach annehmen das es sich um ein TMYDBCtrlGrid handelt. Nur wenn es tatsächlich ein TMYDBCtrlGrid ist, darf auf das Property Panel zugegriffen werden. Der Parent könnte auch nil sein.
Delphi-Quellcode:
function TCR_DB_Editor.GetRealParent : TWinControl;
begin
Result := Parent;
while Assigned(Result) do
begin
if Result is TMYDBCtrlGrid then
begin
Result := TMYDBCtrlGrid(Result).Panel;
Exit;
end;
Result := Result.Parent;
end;
end;
Die DataSource kann im Prinzip auch nil sein, allerdings muss vor jeder Zuweisung der DataLink zugewiesen sein.
Delphi-Quellcode:
procedure TCR_DB_Editor.SetDataSource(Value: TDataSource);
begin
if Assigned(FDataLink) then
FDataLink.DataSource := Value;
end;
Hier sollte eigentlich ebenfalls die Zuweisung von nil erlaubt sein:
Delphi-Quellcode:
procedure TDBInputMask.SetDataSource(ADataSource: TDataSource);
var
idx: Integer;
obj: TObject;
{...}
begin
if FDataSource <> ADataSource then
begin
{An dieser Stelle sollten erst einmal alle für die bisherige DataSource
erzeugten Steuerelemente freigegeben werden.}
FEdits.Clear;
FDataSource := ADataSource;
if Assigned(FDataSource) then
begin
FDataSource.DataSet.GetFieldNames(FEdits);
for idx := 0 to FEdits.Count - 1 do
begin
SetLabels(idx, TDBText.Create(self));
//SetInputs(idx, TDBEdit.Create(self));
if idx < FInputs.Count then
obj := FInputs[idx]
else
obj := nil;
if obj is TDBInputLine then
begin
TDBInputLine(FInputs[idx]).DataSource := FDataSource;
TDBInputLine(FInputs[idx]).DataField := FEdits[idx];
end;
if obj is TDBCheckBox then
begin
TDBCheckBox(FInputs[idx]).DataSource := FDataSource;
TDBCheckBox(FInputs[idx]).DataField := FEdits[idx];
end;
{...}