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.