Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi RemoveComponent/InsertComponent Fehler (https://www.delphipraxis.net/89258-removecomponent-insertcomponent-fehler.html)

oki 28. Mär 2007 16:29


RemoveComponent/InsertComponent Fehler
 
Hi Leute,

folgende Situation:
Ich habe eine eigenen Komponente (TCustomPanel) in einer ScrollBox platziert (Designzeit). Nun möchte ich zur Laufzeit diese in eine andere Scrollbox verschieben. Dazu hab ich der ScrollBox in die die Kompo soll ein Popup-Menü verpasst. Meine Kompo besitzt eine Eigenschaft Selected. Ist dies True (klappt), so möchte ich diese in die leere ScrollBox über dessen Popup verschieben. Den Code des Menü-Eintrages hier:
Delphi-Quellcode:
procedure TForm1.ausgewhltesElementhierherverschieben1Click(
  Sender: TObject);
var Compo : TBaseSeyControl;
begin
  // selektierte Kompo suchen
  Compo := GetSelectedSeyControl(Application.MainForm);
  IF Compo = nil then begin
    MessageDlg('Keine selektierte Komponente gefunden!', mtInformation, [mbOK], 0);
    Exit;
  end else begin
    // hier mal guggen
    MessageDlg(Format('Komponente %s gefunden', [Compo.Name]), mtWarning, [mbOK], 0);
    MessageDlg(Format('new Parent: %s', [PopupMenu2.PopupComponent.Name]), mtWarning, [mbOK], 0);
    Compo.Owner.RemoveComponent(Compo);
    PopupMenu2.PopupComponent.InsertComponent(Compo);
    Compo.Parent := TWinControl(PopupMenu2.PopupComponent);
  end;
end;
In der alten ScrollBox verschwindet die Kompo, taucht aber in der neuen nicht auf. Danach geht das Prog mit Exception Lesen von null an einer völlig anderen Stelle ins aus. Über die beiden eingebundenen MsgDlg's prüfe ich hier schon, ob die richtige Kompo gefunden wurde und die Zielkompo stimmt. Alles i.O.
Der abgebildete Code wird auch ohne Fehler durchlaufen (Test mit Debugger).

Was mach ich falsch?

Gruß oki

Gruber_Hans_12345 28. Mär 2007 17:30

Re: RemoveComponent/InsertComponent Fehler
 
also normalerweise sollte ein
Delphi-Quellcode:
    Compo.Parent := TWinControl(PopupMenu2.PopupComponent);
reichen, das Remove und Insert der Componenten sollte durch die VCL automatisch germacht werden, vielleicht ist die VCL böse, wenn man da manuell reinpfuscht?

oki 28. Mär 2007 17:41

Re: RemoveComponent/InsertComponent Fehler
 
Also böse ist sie bei mir sicher, sonnst würde es funzen. Die Idee mit der einfachen Zuweisung des Parents hatte ich zuerst auch. Hat aber nicht geklappt.
Es tut sich rein gar nichts!!

Gruß oki

marabu 28. Mär 2007 17:47

Re: RemoveComponent/InsertComponent Fehler
 
Hallo,

statt RemoveComponent() und InsertComponent() sind RemoveControl() und InsertControl() nötig. Eine kleine Verwechslung mit ungeahnten Folgen. Die einfache Zuweisung eines neuen ParentControl funktioniert nur dann, wenn die Methode SetParent() entsprechend aufgebaut ist.

Grüße vom marabu

Gruber_Hans_12345 28. Mär 2007 18:01

Re: RemoveComponent/InsertComponent Fehler
 
hmmmm, also bei mir ist in der vcl SetParent bereits beim TControl definiert, müsste dann das zuweisen des Parents nicht automatisch bei allen abgeleiteten objekten auch funktionieren?

marabu 28. Mär 2007 18:22

Re: RemoveComponent/InsertComponent Fehler
 
Ja, aber ich hatte nicht in die Quellen geschaut und mich deshalb etwas vorsichtiger ausgedrückt - zumal oki ja auch behauptet, dass es nicht funktionierte.

Freundliche Grüße

oki 29. Mär 2007 16:17

Re: RemoveComponent/InsertComponent Fehler
 
Hi marabu,

ich hab's mit RemoveControl und InsertControl probiert. Gleicher Fehler wie oben beschrieben.
Delphi-Quellcode:
    TWinControl(Compo.Owner).RemoveControl(Compo);
    TWinControl(PopupMenu2.PopupComponent).InsertControl(Compo);
    Compo.Parent := TWinControl(PopupMenu2.PopupComponent);
Gruß oki

SirThornberry 29. Mär 2007 16:41

Re: RemoveComponent/InsertComponent Fehler
 
was willst du mit Removecontrol etc. überhaupt bewirken? Wenn du einfach nur den Parent ändern willst genügt es das Parent-Property einfach neu zu setzen.

oki 29. Mär 2007 16:45

Re: RemoveComponent/InsertComponent Fehler
 
Zitat:

Zitat von SirThornberry
was willst du mit Removecontrol etc. überhaupt bewirken? Wenn du einfach nur den Parent ändern willst genügt es das Parent-Property einfach neu zu setzen.

Genau das hab ich zuerst getan und es passiert nichts. Die Compo bleibt in der alten ScrollBox; und taucht in der neuen nicht auf.

Gruß oki

SirThornberry 29. Mär 2007 16:49

Re: RemoveComponent/InsertComponent Fehler
 
dann machst du irgendwas falsch. Wenn du das machst:
Delphi-Quellcode:
if Control.Parent = ScrollBox1 then
  Control.Parent := ScrollBox2
else
  Control.Parent := ScrollBox1;
wandert das Control von einer Scrollbox zur anderen. Wenn dem nicht so ist geht bei dir etwas gewaltig schief. Kannst du das Projekt eventuell mal posten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:51 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz