AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JvDesignPanel Component Editor

Ein Thema von geskill · begonnen am 3. Aug 2008 · letzter Beitrag vom 27. Feb 2011
Antwort Antwort
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#1

JvDesignPanel Component Editor

  Alt 3. Aug 2008, 09:03
Hi,
Ich habe gestern mal fix einen Komponenten Editor gebastellt.
Nun kenne ich ja die Vorteile von dem Delphi Editor und möchte einige davon umsetzen. Jedoch habe ich per google nach dem Panel gesucht, aber man findet rein gar nichts darüber!

Speziell geht es um:
A: Mit der Maus mehrere markieren. (Bild)
Der Markierungsrahmen wird ja schon gezeichnet jetzt frage ich mich wie greife ich drauf zu?

B: Im Delphi Editor werden die Hilfs-,Entfernungslinien gezeichnet, wenn man die Komponenten bewegt oder die STRG Taste drückt, sowie das bewegen mit den Pfeiltasten bei gehaltener STRG Taste.
Das DesignPanel hat irgendwas gegen Taskendrücke, kein OnKeyPress und wenn ich die STRG Taste klicke kann ich keine Komponenten hinzufügen!
Miniaturansicht angehängter Grafiken
componentd_202.png  
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#2

Re: JvDesignPanel Component Editor

  Alt 3. Aug 2008, 15:55
Zu A habe ich eine Lösung gefunden:

Delphi-Quellcode:
PROCEDURE TMain.SelectRect;
VAR I:Integer; FObjects: Array of TObject;

  procedure AddObjectAtEndOfList (const aObject : TObject);
  begin
    SetLength (FObjects, Succ (Length (FObjects)));
    FObjects [High (FObjects)] := aObject;
  end;

BEGIN
  FOR I := 0 TO DesignPanel.ControlCount -1
    DO BEGIN
      IF NOT (DesignPanel.Controls[I].Name = '') // selector komponenten natürlich nicht!
        THEN
          IF PtInRect(DesignPanel.Surface.Controller.DragRect,
                          (CenterPoint(Rect(DesignPanel.Controls[I].Left,
                                            DesignPanel.Controls[I].Top,
                                            DesignPanel.Controls[I].Left+DesignPanel.Controls[I].Width,
                                            DesignPanel.Controls[I].Top+DesignPanel.Controls[I].Height))))
             THEN BEGIN
               AddObjectAtEndOfList(DesignPanel.Controls[I]);
               DesignPanel.Surface.SetSelected(FObjects);
         END;
    END;
END;
Eingebunden wird das ganze als oberstes im "OnSelectionChange".
Also ich ermittle den Mittlepunkt von jeder Komponente und schaue dann ob dieser Punkt im markierten Rechteck liegt.
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#3

Re: JvDesignPanel Component Editor

  Alt 3. Aug 2008, 17:21
Zu B habe ich teils eine Lösung gefunden:

Delphi-Quellcode:
procedure TMain.TimerTimer(Sender: TObject);

  PROCEDURE SelectedRepaint;
  BEGIN
    Sleep(15);
    IF DesignPanel.Surface.Count > 1
      THEN DesignPanel.Surface.SelectionChange
      ELSE DesignPanel.Surface.Select(DesignPanel.Surface.Selection[0]);
    LoadObjectSettings;
  END;

begin
  IF (GetKeyState(VK_CONTROL) < 0)
    THEN BEGIN
      IF GetasyncKeyState(VK_LEFT)<>0
        THEN DesignPanel.Surface.NudgeComponents(-1,0); // verschieben
      IF GetasyncKeyState(VK_UP)<>0
        THEN DesignPanel.Surface.NudgeComponents(0,-1);
      IF GetasyncKeyState(VK_RIGHT)<>0
        THEN DesignPanel.Surface.NudgeComponents(+1,0);
      IF GetasyncKeyState(VK_DOWN)<>0
        THEN DesignPanel.Surface.NudgeComponents(0,+1);

      IF (GetasyncKeyState(VK_LEFT)<>0) OR (GetasyncKeyState(VK_UP)<>0)
        OR (GetasyncKeyState(VK_RIGHT)<>0) OR (GetasyncKeyState(VK_DOWN)<>0)
          THEN SelectedRepaint;
    END;
  IF (GetKeyState(VK_SHIFT) < 0)
    THEN BEGIN
      IF GetasyncKeyState(VK_LEFT)<>0
        THEN DesignPanel.Surface.GrowComponents(-1,0); // vergrößern/verkleinern
      IF GetasyncKeyState(VK_UP)<>0
        THEN DesignPanel.Surface.GrowComponents(0,-1);
      IF GetasyncKeyState(VK_RIGHT)<>0
        THEN DesignPanel.Surface.GrowComponents(+1,0);
      IF GetasyncKeyState(VK_DOWN)<>0
        THEN DesignPanel.Surface.GrowComponents(0,+1);

      IF (GetasyncKeyState(VK_LEFT)<>0) OR (GetasyncKeyState(VK_UP)<>0)
        OR (GetasyncKeyState(VK_RIGHT)<>0) OR (GetasyncKeyState(VK_DOWN)<>0)
          THEN SelectedRepaint;
    END;
  IF ((GetKeyState(VK_CONTROL) < 0) OR (GetKeyState(VK_SHIFT) < 0)) AND (DesignPanel.Surface.Count = 1)
    THEN BEGIN
      DesignPanel.Repaint;
      IF DesignPanel.Surface.Selection[0].Left = 8 // linke Kante
        THEN BEGIN
          DesignPanel.Canvas.MoveTo(0,DesignPanel.Surface.Selection[0].Top+(DesignPanel.Surface.Selection[0].Height DIV 2));
          DesignPanel.Canvas.LineTo(5,DesignPanel.Surface.Selection[0].Top+(DesignPanel.Surface.Selection[0].Height DIV 2));
        END;
      IF DesignPanel.Surface.Selection[0].Top = 8 // obere Kante
        THEN BEGIN
          DesignPanel.Canvas.MoveTo(DesignPanel.Surface.Selection[0].Left+(DesignPanel.Surface.Selection[0].Width DIV 2),0);
          DesignPanel.Canvas.LineTo(DesignPanel.Surface.Selection[0].Left+(DesignPanel.Surface.Selection[0].Width DIV 2),5);
        END;
    END;
end;
Leider musste ich dabei einen Timer benutzen (Inteval:50)
Es fehlen nun noch die weißen Abstandslinien zwischen den Komponenten und die langen hellgrauen Orientierungslinien.
Da werde ich wohl mit einer Schleife arbeiten müssen...
Sebastian
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#4

Re: JvDesignPanel Component Editor

  Alt 3. Aug 2008, 20:57
So,
letztendlich habe ich dann alles so hinbekommen, wie es ein sollte, anbei habe ich den Sourcecode vom Programm gepackt, jedoch habe ich eine Komponente entfernt... Ich benutze außerdem die Imagelist von DevExpress für die Icons, wenn ihr diese nicht besitzt müsst ihr das vorher ausbauen die Bilder liegen dafür noch im Ordner.
Also wer es sich mal anschauen kann der kann dies gerne tun - weil es gibt für die Komponente sogut wie keinen Eintrag bei Google.
Grüße
Angehängte Dateien
Dateityp: zip componentdesignerdp_597.zip (397,7 KB, 52x aufgerufen)
Sebastian
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5

Re: JvDesignPanel Component Editor

  Alt 3. Aug 2008, 21:21
Wäre es möglich, dein Programm in den Examples Ordner der JVCL zu verfrachten?
  Mit Zitat antworten Zitat
Benutzerbild von geskill
geskill

Registriert seit: 17. Feb 2007
Ort: NRW
420 Beiträge
 
Delphi 2010 Professional
 
#6

Re: JvDesignPanel Component Editor

  Alt 3. Aug 2008, 21:40
Jo klar... Ich nehme mal an du wirkst bei JVCL mit
Aber dann würde ich die DevExpress Komponente rauscoden, weil die
hat ja nicht jeder. Sehe grade unten steht noch was von TDownload das
sollte lieber auch noch raus...
Mir fällt gerade noch ein das ich bei den Komponenten was verändert habe:
Damit ich per gedrückter STRG Taste mehrere Komponenten hinzufügen kann. Ich hatte das "einfach" mal ausgeklammert, man kann
jetzt in meinem Programm die Taste ändern ... aber ich verstehe den Sinn von "Ctrl-drag" nicht

In der JvDesignImp.pas Zeile 860:
Delphi-Quellcode:
  procedure SelectDragMode;
  begin
    HandleId := dhNone;
    //if ssCtrl in Shift then // !!!
      // Ctrl-drag selection has highest priority // !!!
      //FDragMode := dmSelect // !!!
    //else // !!!
    //begin // !!!
      HandleId := Surface.GetHitHandle(X, Y);
      if HandleId <> dhNone then
      begin
        FClicked := Surface.Selection[0];
        FDragMode := dmResize;
      end
      else
      begin
        FClicked := Surface.FindControl(X, Y);
        if (FClicked = Surface.Container) or (FClicked is TJvDesignHandle) then
          FClicked := nil;
        Surface.GetAddClass;
        if Surface.AddClass <> 'then
          // then object creation
          FDragMode := dmCreate
        else
        if FClicked <> nil then
          // moving is last
          FDragMode := dmMove
        else
          // select by default
          FDragMode := dmSelect;
      end;
    //end; // !!!
    if FClicked = nil then
      FClicked := Surface.Container;
    FClicked.Parent.DisableAlign;
  end;
Du kannst es gerne so herreinnehmen oder wir nehmen uns mal ne viertel Stunde und maches es vernünftig
Grüße
Sebastian
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: JvDesignPanel Component Editor

  Alt 27. Feb 2011, 13:35
@geskil

Ja , ja lang ist's her aber trotzdem Danke für das Projekt.
Wird mir gute Dienste leisten (gute Tips enthalten)

Falls du mal wieder Online bist ein Update wäre nicht schlecht.

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz