Delphi-PRAXiS

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 JvDesignPanel Component Editor (https://www.delphipraxis.net/118225-jvdesignpanel-component-editor.html)

geskill 3. Aug 2008 09:03


JvDesignPanel Component Editor
 
Liste der Anhänge anzeigen (Anzahl: 1)
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!

geskill 3. Aug 2008 15:55

Re: JvDesignPanel Component Editor
 
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.

geskill 3. Aug 2008 17:21

Re: JvDesignPanel Component Editor
 
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...

geskill 3. Aug 2008 20:57

Re: JvDesignPanel Component Editor
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

jbg 3. Aug 2008 21:21

Re: JvDesignPanel Component Editor
 
Wäre es möglich, dein Programm in den Examples Ordner der JVCL zu verfrachten?

geskill 3. Aug 2008 21:40

Re: JvDesignPanel Component Editor
 
Jo klar... :) Ich nehme mal an du wirkst bei JVCL mit :wink:
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 :gruebel:

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

EWeiss 27. Feb 2011 13:35

AW: JvDesignPanel Component Editor
 
@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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 Uhr.

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