![]() |
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! |
Re: JvDesignPanel Component Editor
Zu A habe ich eine Lösung gefunden:
Delphi-Quellcode:
Eingebunden wird das ganze als oberstes im "OnSelectionChange".
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; Also ich ermittle den Mittlepunkt von jeder Komponente und schaue dann ob dieser Punkt im markierten Rechteck liegt. |
Re: JvDesignPanel Component Editor
Zu B habe ich teils eine Lösung gefunden:
Delphi-Quellcode:
Leider musste ich dabei einen Timer benutzen (Inteval:50)
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; 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... |
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 |
Re: JvDesignPanel Component Editor
Wäre es möglich, dein Programm in den Examples Ordner der JVCL zu verfrachten?
|
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:
Du kannst es gerne so herreinnehmen oder wir nehmen uns mal ne viertel Stunde und maches es vernünftig :)
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; Grüße |
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