Hi torud!
Mein ansatz war folgender.
Ich benötige mehrere unterschiedliche Komponenten, die zur Laufzeit in einer ScrollBox erstellt und bearbeitet werden können. Dazu zählen verschiedenste Komponenten für spezielle Zwecke. Unter anderem sollen diese Elemente in Gruppenboxen angeordnet sein. Im Bild ist zum Bsp. Mein Label mit den entsprechenden Verbindern in einer Gruppenbox zu sehen. Damit ich von "außen" (Hauptprogramm) alle einheitlich suchen oder ansprechen kann, hab ich mir eine Basisklasse geschrieben, in der meine Grundfunktionen enthalten sind.
Delphi-Quellcode:
TBaseCustomControl = class(TCustomControl)
private
FCaption: String;
FMoveable: Boolean; // Control verschiebbar
FOnItemSelected: TNotifyEvent;
FSelected: Boolean; // Control selectiert
FShowMode: TSeyShowMode; // Anzeige für Programm-/Designdarstellung
procedure SetCaption(const Value: String);
procedure SetSelected(const Value: Boolean);
protected
procedure CreateWnd; override;
procedure DoEnter; override;
procedure DoExit; override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure Paint; override;
procedure SetFirstName;
procedure SetName(const Value: TComponentName); override;
procedure SetShowMode(const Value: TSeyShowMode); virtual;
public
Constructor Create(AOwner: TComponent); override;
property Caption : String read FCaption write SetCaption;
property Color;
property Font;
property Moveable : Boolean read FMoveable write FMoveable;
property OnItemSelected : TNotifyEvent read FOnItemSelected write FOnItemSelected;
property Selected : Boolean read FSelected write SetSelected;
property ShowMode : TSeyShowMode read FShowMode write SetShowMode;
published
procedure DoItemSelected(Sender : TObject); virtual;
end;
Von dieser Basisklasse leite ich dann meine weiteren Controls ab. Ein wesentlicher Unterschied zwischen meinen Connectoren und den anderen Elementen (z.B. Label) ist, dass der Connector über die Eckpunkte in seiner Größe verändert wird. Eckpunkt greifen und verschieben. Zwischen zwei Eckpunkten gibt es z.B. horizontale und vertikale Zugpunkte um die entsprechende Teillinie mit ihren Eckpunkten zu verschieben. Da hab ich recht lange dran gesessen.
Bei den Labels ist es einfacher, Dort kann ich durch Ziehen der äußeren Eckpunkte die Größe ändern. Den Code dazu findest du hier im Forum.
Um das zu verdeutlichen hab ich noch mal was in den Anhang gelegt.
Bei den Connectoren entstand zusätzlich das Problem, dass das Control ein Viereck ist, aber nur die Linien sichtbar sein sollen. Geht also ein Verbinder von links oben nach rechts unten, so würde er alle anderen Elemente verdecken (optisch und für Maus-Aktionen). Suche im Forum nach "durchklickbar", dann findest du entsprechende Beispiele für die Verwendung von Ranges.
Ich helfe dir gerne bei deinem Problem, möchte aber nicht den kompletten Code hier posten. erstens habe ich das Projekt nicht als open Source angelegt, zweitens ist auch noch nicht alles fertig.
Funktionen wie:
- Ausrichten am Gitter
- Fixieren an anderen (meinen) Controls
- Verbindung von Eingangs-/Ausgangs-Gates
- Anzeige und Bearbeitung von Eigenschaften
sind nicht oder nur teilweise umgesetzt. Arbeite ich halt dran.
Gruß oki