Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Nicht erkärliche EAccessVoilation

  Alt 27. Feb 2009, 15:52
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;
{...}
  Mit Zitat antworten Zitat