HI,
ich hab ehrlich gesagt keine richtige Idee was deine Frage an einigen Stellen betrifft:
Zitat von
mimi:
Delphi-Quellcode:
TStyle = record
obj1:TObjectList;
.....
end;
und nun habe ich eine weiter tList um das object zu verwalten. das heißt so eine art Object Baum.
Eine weitere TList? Wo ist denn die erste TList?
Um das Objekt zu verwalten? Wo ist denn das Objekt? Ein Record ist kein Objekt!
Zitat von
mimi:
jetzt hat jedes object ein objl Tobjectliste wo alle objecte reinkommen
Sorry, der Teil ist mir völlig unklar. Was ist denn ein objl Tobjectliste?
An sich würde ich dir hier zu etwas ObjektOrientierung (OO) raten. Für eine solche "Hierachie" und soetwas wie den Bau eines Containers eignet die sich sehr gut. Du kannst einfach eine Basisklasse für alle Grafikobjekte und eine für alle "Container" schaffen. Die Klasse der Container sollte dabei von der Klasse der Grafikobjekte erben. Die hat dann einfach nur die Eigenschaft, zusätztlich Elemente zu Speichern.
Delphi-Quellcode:
type
TGrafikBasisKlasse = class(TObject)
private
FXPosition : Integer;
FYPosition : Integer;
...
protected
draw; virtual; abstract;
setXPosition(const x : Integer);
setYPosition(const y : Integer);
...
public
property XPosition : Integer read FXPosition write setXPosition;
property YPosition : Integer read FYPosition write setYPosition;
...
end;
TGrafikContainerBasisKlasse = class(TGrafikBasisKlasse)
private
FContainedObjects : TObjectList;
protected
setXPosition(const x : Integer); override;
setYPosition(const Y : Integer); override;
addGraphicObject(const GraphicObject : TGrafikBasisKlasse);
removeGraphicObject(const GraphicObject : TGrafikBasisKlasse);
public
end;
So ganz grob (entschuldige, merke gerade dass meine Variablenbenennung ganz furchtbar ist, durchmischt deutsch/englisch).
Natürlich soll das jeztt keine vollständige Klasse sein, müsstest du entsprechend erweitern. Wichtig ist es die grobe Struktur zu verstehen. Alle Objekte die du verwendest sollten von TGrafikBasisKlasse erben. Sind sie zu dem auch noch ein Container, erben sie entsprechend von TGrafikContainerBasisKlasse (und damit implizit auch von TGrafikBasisKlasse). Also kannst du immer den in ein TGrafikBasisKlasse Objekt casten und die hier vorgegebenen Funktionen nutzen.
Wenn nun setXPosition aufgerufen wird, musst du die x Position deiner Komponente ändern und neu zeichnen. Hierzu kann jede deiner Komponenten (die du ableitest) einfach die draw Methode überschreiben, wo es sich hinzeichnet geht ja aus den gespeicherten Koordinaten hervor.
Hast du einen Container (etwas dass von TGrafikContainerBasisKlasse erbt), so brauchst du hier nicht mehr zu tun, als die Methode, die diesen Container bewegt zu überschreiben. Deine überschriebene Methode ruft dann einfach ihren Vorgänger auf (schließlich muss auch dein Container an der richtigen Stelle gezeichnet werden) und muss danach nur noch alle ELemente bewegen, die in der eigenen Liste drin stehen.
Delphi-Quellcode:
TGrafikContainerBasisKlasse.setXPosition(const x : Integer);
var diffX : Integer;
i : Integer;
begin
diffX := x - self.XPosition;
inherited setXPosition(x);
if self.FContainedObjects.Count > 0 then
begin
for i := 0 to self.FCountaindedObjects.Count - 1 do
begin
// eine Methode move wäre hier sinnvoller als das
TGrafikBasisKlasse(self.FContainedObjects[i]).setXPosition(TGrafikBasisKlasse(self.FContainedObjects[i].XPosition) + diffX);
end; // for i := 0 to self.FCountaindedObjects.Count - 1
end; // if self.FContainedObjects.Count > 0
end;
Wie gesagt, es sind nur Anregungen, bei der konkreten Umsetzung musst du schauen. Wenn du es so oder ähnlich machst, denke ich solltest du kein Problem bekommen. Werde mir trotzdem gleich noch deinen Code anschauen, vielleicht sehe ich ja dort den Fehler.
Gruß Der Unwissende