"Kann keine Methode für eine unbenannte Komponente erstellen"

8

Der folgende Code (wenn er in einem Paket registriert ist) gibt uns eine Komponente mit dem Namen TParentComponent , die in der Palette Test registriert ist.

Wenn Sie jedoch ein untergeordnetes Objekt mithilfe des Eigenschaften-Editors (im selben Code) erstellen, zeigt die IDE die Fehlermeldung Eine Methode für eine unbenannte Komponente kann nicht erstellt werden.

Was seltsam ist, ist, dass das Child-Objekt tatsächlich einen Namen hat.

Hier ist die Quelle:

%Vor%

Die obige Quelle wurde von einer weiteren Antwort hier auf StackOverflow adaptiert .

Irgendwelche Ideen, warum ich keine Methode für OnTest erstellen kann?

Vielen Dank im Voraus!

    
LaKraven 05.05.2013, 17:54
quelle

2 Antworten

6

Entwurfszeitbedarfszusammenfassung

  • Sie möchten oder benötigen eine benutzerdefinierte Komponente, die mehrere untergeordnete Komponenten enthalten kann.
  • Diese untergeordneten Komponenten müssen von dieser benutzerdefinierten Komponente erstellt werden.
  • Die untergeordneten Komponenten müssen in der Lage sein, im Code mit ihrem Namen als normale Komponente bezeichnet zu werden, für die die Entwurfszeit festgelegt wurde. also nicht Form.CustomComponent.Children[0] , sondern Form.Child1 stattdessen.
  • Daher müssen die untergeordneten Komponenten in der Quelldatei des Moduls (ein Formular, Frame oder DataModule) deklariert und somit hinzugefügt werden.
  • Die untergeordneten Komponenten müssen vom Standard-IDE-Auflistungs-Editor verwaltet werden.
  • Daher muss ein Kind vollständig in ein TCollectionItem eingebunden werden.

Auswertung des aktuellen Codes

Du gehst schon ganz gut voran, aber neben deiner Frage hat der Code ein paar Punkte zur Verbesserung:

  • Die von Ihnen erstellten Sammlungen werden niemals freigegeben.
  • Jedes Mal, wenn Sie den Kollektionseditor anzeigen, wird eine neue Kollektion erstellt.
  • Wenn Sie ein untergeordnetes Objekt aus der TreeView löschen, bleibt das alte entsprechende CollectionItem erhalten, was zu einem AV führt.
  • Die Entwurfszeit und der Laufzeitcode werden nicht geteilt.

Lösung

Hier ist eine neu geschriebene, funktionierende Version Ihres Codes mit den folgenden Änderungen:

  • Die spezielle Komponente heißt Master , weil Parent zu sehr mit Delphis Parent verwechselt wird (es gibt bereits zwei Arten). Daher heißt ein Kind Slave .
  • Slaves werden in TComponentList (Einheit Contnrs ) gehalten, um die Liste im Falle einer individuellen Slave-Zerstörung automatisch zu aktualisieren. Die ComponentList besitzt die Slaves.
  • Für jeden einzelnen Master wird nur eine Collection erstellt. Diese Master-Collection-Kombinationen werden in einer separaten TStockItems ObjectList gehalten. Die Liste besitzt die Lagerartikel und die Liste wird im Abschnitt "Finalisierung" freigegeben.
  • GetNamePath ist implementiert, damit ein Slave im Objektinspektor als Slave1 angezeigt wird und nicht als SlaveWrappers(0) .
  • Ein zusätzlicher Eigenschafteneditor wird für das Ereignis der TSlaveWrapper-Klasse hinzugefügt. Irgendwie führt GetFormMethodName des Standard TMethodProperty zu dem Fehler, den Sie bekommen. Die Ursache wird in Designer.GetObjectName liegen, aber ich weiß nicht genau warum. Jetzt ist GetFormMethodName überschrieben, was das Problem von Ihrer Frage löst.

Bemerkungen

Änderungen, die in der Reihenfolge der Elemente in der Sammlung (mit den Pfeilschaltflächen des Auflistungs-Editors) vorgenommen wurden, sind noch nicht erhalten. Versuchen Sie selbst, das zu implementieren.

In der Baumansicht ist jeder Slave jetzt ein unmittelbar untergeordnetes Objekt des Masters, anstatt der Eigenschaft Slaves untergeordnet zu sein, wie dies normalerweise bei Sammlungen der Fall ist:

Damit dies geschieht, denke ich, dass TSlaves von TPersistent abstammen sollte und die ComponentList darin eingeschlossen wäre. Das ist sicher ein weiteres schönes Tryout.

Komponentencode

%Vor%

Editor-Code

%Vor%

Registrierungscode

%Vor%

Paketcode

%Vor%     
NGLN 10.05.2013, 02:24
quelle
1

Ein ausreichender "Workaround" wurde auf "Erstellen von benutzerdefinierten Delphi-Komponenten, Teil 2, Seite" gefunden 4 von 5 " Artikel.

Die vollständige Beispielquelle befindet sich in ihrem Artikel und funktioniert (scheinbar) mit allen Versionen von Delphi.

Es sollte jedoch beachtet werden, dass diese Lösung nicht perfekt ist, da Sie nicht den Sammlungs-Editor von den Eltern- und Kind-Komponenten trennen können (was bedeutet, dass Sie die Quelle dafür erzeugen müssen) beide Komponenten, damit der Kollektionseditor funktioniert und in das Laufzeitpaket eingefügt wird.)

Für meine Bedürfnisse gerade jetzt, das wird es tun ... aber wenn jemand eine bessere Lösung finden kann, die direkt auf dem Beispielcode in meiner Frage basiert, wäre das großartig (und ich werde diese Antwort als korrekt markieren jemand stellt es).

    
LaKraven 06.05.2013 21:23
quelle

Tags und Links