Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Suche Pfeile zur Visualisierung von Beziehungen

  Alt 15. Aug 2007, 11:08
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
Miniaturansicht angehängter Grafiken
label_676.png   panelprops_114.jpg   connector_114.jpg  
42
  Mit Zitat antworten Zitat