Einzelnen Beitrag anzeigen

I.A

Registriert seit: 14. Jan 2007
83 Beiträge
 
#10

Re: Nicht erkärliche EAccessVoilation

  Alt 26. Feb 2009, 17:25
Hallo!

Zitat von DeddyH:
Zitat:
Delphi-Quellcode: markieren
tmp := self.Parent;

Es wäre ja nun Quatsch, den eigenen Parent erzeugen zu wollen. Bleibt die Frage: wäre es möglich, dass seine Klasse gar keinen Parent hat (wieso auch immer)?
Nein, die Eignschaft Parent existiert auf jeden Fall. Die Ableitungshirarchie ist laut Delphi Hilfe:

TWinControl
|
TControl (Hier wird die Eigenschaft Parent eingeführt)
|
TComponent

Zitat von Luckie:
Also deine Variable temp ist vom Typ TWinControl. Wo wird denn das Objekt temp erstellt? Du fängts einfach so damit an zu arbeiten ohne es zu erzeugen. Oder habe ich da jetzt was übersehen?
TWinControl stammt auch von TControl ab, wo die Eigenschaft Parent eingeführt wird.

an tmp wird self.parent zugewiesen. Self ist ja das Objekt selber. den Parameter self müsste ma da sogar weglassen können. Die KLasse TCR_DB_Editor, zu der die Methode gehört in der an die Variable tmp der Wert self.parent zugewiesen wird, stmmt von TSchrollBox ab, in der die Eigenschaft Parent auch definiert ist.

Das Objekt temp wird gar nicht erstellt, sondern ist nur ein Platzhalter innerhalb der Methode.

So weit, so gut, doch folgt ja dieser Code:

Delphi-Quellcode:
function TCR_DB_Editor.GetRealParent : TWinControl;
var MYDBCtrlGrid : TMYDBCtrlGrid;
     tmp :TWinControl;
     Flag : boolean;
begin
     Flag := false;
     tmp := self.Parent;
     result := tmp;
     while (tmp <> nil) AND ( tmp.Parent <> nil ) AND (Flag =false) do
     begin
         if Pos('dbctrl', lowercase(tmp.ClassName )) > 0 then
         begin
             MYDBCtrlGrid := TMYDBCtrlGrid(tmp);
             result := MYDBCtrlGrid.Panel;
             Flag := true;
         end;
         tmp := tmp.Parent;
     end;
end;
Und da haben wir unseren tmp.parent

Ich fürchte, ich sollte den Spender des Quellcodes fragen, ob ich die Unit vollständig hier posten darf. Anderenfalls werd ich wohl die Quelle erst mal gründlicher studieren müssen. Ich versteh nämlich auch noch nicht alles, was der hier programmiert hat.

MyDBCtrlGrid stammt von TDBCtrlGrid ab, hat also auch einen Parent. MyDBCtrlGrid führt die Eigenschaft Panel ein. So sollte Parent nach dieser Prozedur auf Parent von MyDBCtrlgrid zeigen.

Die Variable tmp ist somit nur eine Hilfsvariable, um in der Schleife den aktuellen Parent festzuhalten.

In wie weit dieser Parent von Bedeutung ist für die Anzeige der Eingabemaske, konnte ich noch nicht feststellen, da ich nach Hinzufügen der Bedingung (tmp <> nil), die im Original nicht enthalten war, eine EInvalidOperation - Exception erhalte.

Allerdings tritt meine Exception EInvalidOperation hier auf:

Delphi-Quellcode:
procedure TCR_DB_Editor.ReOrderControls;
... Varablendeklaratioen
begin
 //Hier wird die alte Liste mit den Eingabecontrols gelöscht, um die passenden Eingabecontrols
 //entsprechend neuer Feldreihefolge in diese Liste einzufügen

 if Element_EditHeigth > FElement_RowHight then FElement_RowHight := Element_EditHeigth +2;
   // Label und Eingabe eine Höhe: deshalb /2 1 * Elementhöhe / Spalten // // oben und unten //

   ElementBlockHight := FElement_RowHight * Pred( FControlList.Count-FElement_NonVisib ) div (2 * FElement_ListCols);
   VertikalTopMargin := Pred(Height - ElementBlockHight ) div 2;
   if VertikalTopMargin < 1 then VertikalTopMargin := 1;


   ww := Width div (2 * FElement_ListCols) ;
   if ww < FMinWidthHoriz then ww := FMinWidthHoriz;


   VertikalRowCounter := 0;

//Hier bei HorzScrollbar kommt die neue Exception
//HorzScrollBar und VertScrollBar sind ider Vorgängerklasse TScrollBox bereits definiert
//Warum tritt dann die EInvalidOperation auf
   if HorzScrollBar <> nil then HorzScrollBar.Position := 0;
   if VertScrollBar <> nil then VertScrollBar.Position := 0;
Ist es geschickter, einen neuen Thread, mit dem Thema EInvalidOperation zu eröffnen? Ich mach das mal.
----------------------------------------------------------------------------------------------------

Meine EAbstractError Exception in meinem eigenen Entwurf hängt gar nicht mit der Zuweisung der Datenquelle zusammen, sondern mit der Verwendung einer Stringliste vom Typ TStrings anstelle von TStringList. Die Variable darf dabei vom Typ TStrings sein, jedoch muss an diese eine TStringlist zugewiesen werden. Jedenfalls in Turbo Delphi.

Falsch:

Delphi-Quellcode:
var
  List: TStrings;

procedure CreateList;
begin
  List := TStrings.Create;
end;

Richtig:

Delphi-Quellcode:
var
  List: TStrings;

procedure CreateList;
begin
  List := TStringList.Create;
end;
Mit der zweiten Version der Stringliste kann unbedenklich gearbeitet werden. Die erste Variante erzeugt beim Zugriff auf die Liste eine EAbstrctError Exception.
  Mit Zitat antworten Zitat