![]() |
Komponente erstellen: Left und Top festlegen?
Hi,
der Titel sagt alles: Wenn ich eine Komponente erstelle und versuche im Constructor Left und Top auf fest Werte zu stellen, so funzt dies zwar, aber wenn ich die Komponente dann auf die Form ziehe, ist sie an der Position, wo ich auf die Form hingeklickt habe. Wie kann ich dies ändern? Danke schonmal, für eure Antworten... |
Re: Komponente erstellen: Left und Top festlegen?
Die persistenten werte werden nach dem Konstruktor geladen, du mußt .Loaded überladen.
|
Re: Komponente erstellen: Left und Top festlegen?
Hm...
Das funktioniert zwar, aber nicht so wie es soll: Left und Top werden dann erst zur Laufzeit auf die gewünschte Position gesetzt, es soll aber schon so sein, wenn die Komponente zur Designzeit auf die Form gezogen wird.... Ist das möglich? |
Re: Komponente erstellen: Left und Top festlegen?
Das geht so nicht. Aus meiner Sicht ist das auch nicht sinnvoll, dan bräuchte man ja kein Designer innerhalb der IDE.
|
Re: Komponente erstellen: Left und Top festlegen?
wenn du nicht willst das die position der Komponente geändert wird überschreibe die Methode SetBounds und korrigiere die neuen Left-Top werte zu den alten.
|
Re: Komponente erstellen: Left und Top festlegen?
Und wenn eine Kompo immer an eine bestimmte Stelle soll (z.B. oben links) ?
//Edit: Nur ganz am Anfang - danach soll die Position verändert werden können Am besten wäre es, wenn die Kompo nur beim Ziehen auf die Form (bzw. wenn die Compo neu erstellt wird) an diese bestimmte Stelle kommt. Dann kann man sie meinetwegen verschieben wie man will und dort bleibt sie dann auch. Also: Die Position soll man schon ändern können nur soll es eben ganz am Anfang eine festgelegte Position sein! |
Re: Komponente erstellen: Left und Top festlegen?
dann gäbe es die Möglichkeit das du im Constructor die aktuelle Zeit nimmst und innerhalb von einer bestimmten zeit kein verschieben zulässt. Was natürlich schief geht wenn man das Projekt dann lädt. Ob das ganze überhaupt sinnvoll ist wage ich für meinen Teil zu bezweifeln.
|
Re: Komponente erstellen: Left und Top festlegen?
Moin Martin,
versuch' es mal mit dem Überschreiben von CreateWnd. Zum einen solltest Du die Änderung nur machen wenn csDesigning in ComponentState enthalten ist, ausserdem solltest Du diese Veränderung nur einmal zulassen (z.B. Flag setzen, dass die Position gesetzt wurde.) |
Re: Komponente erstellen: Left und Top festlegen?
Hallo Martin,
Zitat:
Delphi-Quellcode:
Schönen Gruß,
...
type TMyComponent = class(... ... protected procedure SetParent(AParent: TWinControl); override; ... implementation ... procedure TMyComponent.SetParent(AParent: TWinControl); begin inherited; SetBounds(50, 100, Width, Height); end; ... Rudy |
Re: Komponente erstellen: Left und Top festlegen?
Echt erstaunlich, daß überhaupt ein Antwortversuch kommt. Denn es wurde nicht mal gesagt, von was die Komponente abgeleitet werden soll. 8) Befürchte es ist wieder mal TComponent oder Co. und insofern dann eigentlich für diese Zwecke nicht zu gebrauchen. Falls es aber eine existierende Komponente ist, die erweitert werden soll : nächstes Problem. Man müßte im Zweifelsfall schon den VCL-Code parat haben um beim Vorfahr nachzugucken, was aber wegen D7PE nicht gegeben ist. Ich gehe aber davon aus, daß dieser Code beim "Nachbar" jederzeit nachgeguckt oder kurzfristig "ausgeliehen" werden kann. :angel: Das Prinzip ist recht einfach : im Create der Komponente die property zuweisen. Left, Top usw. ABER ! Der alte Wert muß gelesen und der neue geschrieben werden. Deshalb braucht man Read und Write Methoden an der richtigen Stelle, die die Werte eben lesen oder auch schreiben.
Vor allem bei DB-Komponenten ist manchmal folgendes zu bemerken (falls Rechner sehr beschäftigt ist und die Komponente eine DB-Verbindung braucht) : zieht man die auf die Form, so hängt sie da kurz links oben in der Ecke und bewegt sich dann automatisch an die auf der Form angeklickte Stelle. Warum ? Die ist von Vorfahr abgeleitet. Und diesem ist Left/Top egal. Er initialisiert sie allerdings schon, weil Left und Top schon bekannt sind und zwar auf 1,1. Die neue Komponente hat eben nur "inherited" aufgerufen. Nun werden von der abgeleiteten die Left/Top Werte ausgelesen und eigene Sachen initialisiert (auch Left/Top usw. auch). Und die kann man auch selber setzen ! Die Komponente ist dann an gewünschter Stelle. Im OI passiert übrigens genau dasselbe. |
Re: Komponente erstellen: Left und Top festlegen?
Zitat:
Jetzt weiß ich aber nicht, was du mit dem Rest gemeint hast. Muss ich die Properties Top und Left überschreiben? |
Re: Komponente erstellen: Left und Top festlegen?
Das Problem ist in der Komponente zu unterscheiden ob die Position gerade gesetzt wurde nach dem die Komponente aufs form gezogen wurde oder die Position gesetzt wurde nachdem das Projekt geladen wurde. Denn wenn du über Datei->öffnen das Projekt lädst soll die Komponente dort erscheinen wo sie beim speichern lag und nicht bei 0, 0
Left und Top überschreibt man in dem man "SetBounds" überschreibt. Wenn du Left oder Top änderst wird nämlich SetBounds aufgerufen Anstelle von
Delphi-Quellcode:
sollte man also lieber
img.Left := 0; //intern: img.setbounds(0, img.top, img.width, img.height);
img.Top := 0; //intern: img.setbounds(img.left, 0, img.width, img.height);
Delphi-Quellcode:
aufrufen weil dabei SetBounds nur einmal aufgerufen wird
img.SetBounds(0, 0, img.width, img.height);
|
Re: Komponente erstellen: Left und Top festlegen?
So, hab jetzt mal mit meiner Komponente weiter gemacht.
Hab mal Rudy's Code genommen - und es funzt :thumb: Damit wäre das Problem dann gelöst :-D Danke nochmal, für eure Hilfe! |
Re: Komponente erstellen: Left und Top festlegen?
Hmm...
Hab jetzt mal ein bisschen mit dem Code rumprobiert, und irgendwie gibt es jetzt beim Beenden immer eine Exception:
Delphi-Quellcode:
Dieser Code funktioniert, hier gibt es keine Exception:
procedure TMyCompo.SetParent(AParent: TWinControl);
begin inherited; SetBounds(AParent.ClientWidth - Width, 0, Width, Height); // oben rechts end;
Delphi-Quellcode:
Wie kann ich es aber erreichen, dass meine Komponente oben rechts plaziert wird, ohne dass es beim Beenden zu einer Exception kommt???
procedure TMyCompo.SetParent(AParent: TWinControl);
begin inherited; SetBounds(0, 0, Width, Height); // oben links end; |
Re: Komponente erstellen: Left und Top festlegen?
Prüfe ab, ob AParent Nil ist.
Delphi-Quellcode:
procedure TMyCompo.SetParent(AParent: TWinControl);
begin inherited; If Assigned(AParent) Then SetBounds(AParent.ClientWidth - Width, 0, Width, Height); // oben rechts end; |
Re: Komponente erstellen: Left und Top festlegen?
Danke, jetzt funktioniert's :thumb:
Ich verstehe nur nicht, warum es zur Exception beim Beenden kam: Wann wird denn SetParent aufgerufen? Eigentlich doch nur beim Createn - aber beim Beenden (also Freigeben) :?: |
Re: Komponente erstellen: Left und Top festlegen?
beim beenden wird der eventuell auf ni gesetzt damit sich beim Parent aus der Liste ausgetragen wird.
Und der Parent wird natürlich auch gesetzt wenn man die Komponente auf ein andere Panel verschiebt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz