![]() |
MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Liste der Anhänge anzeigen (Anzahl: 4)
Vor Kurzem gab es doch eine Diskusion darüber, welches Hilfesystem (HLP, CHM, HTML, Wiki, ...) wohl am Besten sei
und dazu kam mir die Idee, warum eigentlich nicht das Coole IDE Insight vom neuen RAD 2010 ins eigene Programm holen? :angel: > ![]() So muß man dann auch in der Hilfe nicht ständig groß und breit erklären wo sich was versteckt. Für die, welche IDE Insight noch nicht kennen, denen kann ich wärmstens Daniels erstes Delphi 2010-Video empfehlen. > DP-Videos > ![]() > Im Anhang ist jetzt auch nochmal ein Bild davon Bei vielen Programmen ist es ja leider so, daß bei der Masse an Menüeinträgen, Dialogen und Optionen keiner mehr weiß wo sich was versteckt. Hier kommt also dieser Insight-Dialog in Spiel, welcher alles kennt und wo man sehr schnell und leicht etwas suchen kann. Im Programm könnte man es so lösen, daß zu jedem Dialog, Menü oder sonstwas ein kleines zusätzliches Objekt erstellt wird (falls sich z.B. die Dialog-Instanz nicht direkt nutzen läßt), welches als Schnittstelle zum IInsight diehnt. In diesem Objekt werden z.B. alle Optionen eines Dialogs an IInsight übergeben und es stellt dann auch den Zugriff auf den Dialog her. ( Im Fall der Demo-Form würde dieses praktisch dem Inhalt von FormCreate und als Callback die OnInsight-Ereignisse sein. ) Tja, hier sind also die ersten Grundzüge dieses Systems: Vorschläge sind gern gesehn. Es gibt eine Reihe von Interfaces, um eine Ergebnisliste zu erstellen und zu verwalten, sowie um den Dialog anzuzeigen. Für Letzteres bräuchtet ihr nur in eurem Programm z.B. die Taste F6 abfangen und dort den Insight-Dialog einblenden.
Delphi-Quellcode:
Zuvor muß natürlich noch eine Reihe von Ereignissen registriert/eingetragen werden.
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin if Key = VK_F6 then Insight.Show(Self); Hierzu wird ein Eintrag in einer Gruppe eingetragen und dazu noch ein Callback angegeben. Man kann einer Gruppe auch ein OnList-Event zuweisen, womit die untergeordnete Liste bei jedem Anzeigen des Dialogs überarbeitet oder komplett neu erstellt werden könnte. (z.B. gut für sowas die veränderliche "zuletzt bearbeitete Dateien"-Liste). Im OnClick-Callback erfahrt ihr was gewählt wurde, könnt dann z.B. den entsprechenden Optionsdialog eures Programms einblenden und da das zugehörige Eingabeelement selektieren. Dem Angang liegt natürlich eine kleine Demo bei, in welcher man eines der Edits/Memos über MyInsight auswählen/fokusieren kann.
Delphi-Quellcode:
Es gibt auch schon eine globale Instanz und theoretisch könnte man auch noch weitere Instanzen erstellen, falls es mal nötig sein sollte und man verschiedene Ergebnislisten bräuchte.
TInsightEventC = Procedure(Const Sender: IInsightAction) of Object;
TInsightEventA = Procedure(Const Sender: IInsightAction; Var Allow: Boolean) of Object; TInsightEventL = Procedure(Const Sender: IInsightCategory) of Object; TInsightEventS = Procedure(Const Sender: IInsight) of Object; IInsightAction = Interface(IInsightInternalAction) ['{1D521CF5-47DD-4CB7-9124-FD3098694101}'] Property Parent: IInsightCategory Read GetParent; Property Image: TGraphic Read GetImage Write AssignImage; Property Text: String Read GetText Write SetText; Property Source: String Read GetSource Write SetSource; Property Hotkey: TShortCut Read GetHotkey Write SetHotkey; Property Hint: String Read GetHint Write SetHint; Property Data: Integer Read GetData Write SetData; // for programmers use Property OnClick: TInsightEventC Read GetOnClick Write SetOnClick; End; IInsightCategory = Interface(IInsightInternalCategory) ['{3C1E8994-7CF6-4499-948F-A0A2EC4A484C}'] Property Parent: IInsight Read GetParent; Property Active: Boolean Read GetActive Write SetActive; Property Text: String Read GetText Write SetText; Property Data: Integer Read GetData Write SetData; // for programmers use Function AddAction(Const OnClick: TInsightEventC; Image: TGraphic; Const Text, Hint, Source: String; Data: Integer = 0): IInsightAction; Overload; Function AddAction(Const OnClick: TInsightEventC; Image: TGraphic; Const Text, Hint: String; Hotkey: TShortCut; Data: Integer = 0): IInsightAction; Overload; Function AddAction: IInsightAction; Overload; Function Count: Integer; Property Actions[idx: Integer]: IInsightAction Read GetAction; Default; Procedure Delete (Action: IInsightAction); Procedure Clear; Procedure Lock; Procedure Unlock; Property OnList: TInsightEventL Read GetOnList Write SetOnList; Property OnClick: TInsightEventA Read GetOnClick Write SetOnClick; End; IInsightActionList = Interface(IInternalInsightActionList) ['{78D527B7-63F4-42A0-A59C-99F8D3AE73DD}'] Property Parent: IInsight Read GetParent; Property ActionList: TActionList Read GetActList; Property DefaultCategory: String Read GetDefCat Write SetDefCat; Property AllInDefault: Boolean Read GetAllInDef Write SetAllInDef; End; IInsight = Interface(IInternalInsight) ['{15E44350-1A50-43E9-8B96-CE6FB9D6E3AB}'] Function AddCategory(Const Text: String; Const OnList: TInsightEventL; // if exists "Text" then create an exception Data: Integer = 0): IInsightCategory; Overload; Function AddCategory(Const Text: String): IInsightCategory; Overload; // if exists "Text" then retun the existing Category Function Count: Integer; Property Category [ idx: Integer]: IInsightCategory Read GetCategory; Default; Property Category [Const Text: String]: IInsightCategory Read GetNameCategory; Default; Procedure Delete ( Action: IInsightCategory); Overload; Procedure Clear; Procedure Lock; Procedure Unlock; Procedure AddMenu (Menu: TMenu; DefaultCategory: String); Procedure AddMainMenu(Menu: TMainMenu; DefaultCategory: String; AllInDefault: Boolean = False); Procedure AddPopup (Menu: TPopupMenu; DefaultCategory: String); Function CountMenus: Integer; Property Menu [idx: Integer]: IInsightMenu Read GetMenu; Procedure Delete(Menu: IInsightMenu); Overload; Procedure ClearMenus; Procedure AddActionList(ActionList: TActionList; DefaultCategory: String; AllInDefault: Boolean = False); Function CountActionLists: Integer; Property ActionList[idx: Integer]: IInsightActionList Read GetAction; Procedure Delete (ActionList: IInsightActionList); Overload; Procedure ClearActionLists; Property Title: String Read GetTitle Write SetTitle; Property AllText: String Read GetAllText Write SetAllText; Property OKText: String Read GetOKText Write SetOKText; Property CancelText: String Read GetCancelText Write SetCancelText; Procedure Show(Owner: TComponent = nil); Procedure Hide; Function isVisible: Boolean; Property SelText: String Read GetSelText Write SetSelText; Property DisabledCategories: String Read GetDisList Write SetDisList; Procedure DoChanged; Property OnShow: TInsightEventS Read GetOnShow Write SetOnShow; Property OnClick: TInsightEventA Read GetOnClick Write SetOnClick; End; Var Insight: IInsight; Function CreateNewInsight: IInsight; Der Dialog ist noch nicht ganz fertig, aber er sollte dennoch funktionen. > Die Anzeige der Liste (TreeView) ist noch unvollständig und ich überlege, ob ich nicht auf die VirtualTreeView ausweichen oder etwas Anderes verwenden soll, denn die Verwaltung des TTreeView ist "bescheuert", vorallem da man dort keine Einträge ausblenden kann. |
Re: MyInsight
Echt ne coole Idee. Hab auch schon mal versucht, sowas in mein Programm zu integrieren, ist aber leider nichts geworden. Deine Idee, wie du das aufbaust finde ich super.
Mal sehen, vielleicht finde ich ja wieder Lust an der Idee mit Insight und mach mein eigenes Ding - oder verwende deinen Ansatz. @Demo: In deiner Demo zeigt aber TestA auf 'ne Demo-Edit und nicht auf das TestA-Edit mfg Florian |
Re: MyInsight
Zitat:
Ändere mal OnInsight der Demo so ab:
Delphi-Quellcode:
Das ist auch der Grund, warum ich vorhin noch einen Data-Parameter den Gruppen und Items verpaßt hab.
procedure TForm1.OnInsight(Const Sender: IInsightItem);
begin if Sender.Text = 'TestA' then Edit1.SetFocus else if Sender.Text = 'TestB' then (sowas wie das .Tag bei TComponent und dessen Nachfahren) Damit es dann auch anders und so blöde Stringvergleiche gelöst werden kannen. Zitat:
Ist im Delphi ja eigentlich schon eine recht praktische Angelegenheit und für andere Programme bestimmt auch brauchbar. Aktuell versuche ich erstmal die TTreeView ordentlich auszusehn zu lassen und erstell dann noch eine andere Version mit vermutlich TCategoryPanelGroup. Letzeres vorwiegend für mich und TTreeView, da dieses auch in älteren Delphis schon enthalten ist. |
Re: MyInsight
Warum nicht mit einer Actionlist?
Das hätte den Vorteil, dass Du die echten GUI-Actions zu fassen bekommst mit ihren tatsächlichen Icons, Beschriftungen und Active/Inactive-Zuständen. So muss ich doch alles doppelt verwalten? :gruebel: |
Re: MyInsight
Keine Lust?
Ganz im Ernst, hab diese Dinger noch nie genutzt und darum sind sie mir nicht eingefallen, aber für unseren neuen Mod bau ich die gern mit ein. :angel: Reicht es, wenn man pro Group eine ActionList angeben kann, oder doch lieber gleich mehrere ermöglichen? [edit] hmm, da gibt es auch Kategorien in dieser Liste ... also eine ActionList = mehrere Groups :gruebel: Blöd finde ich nur, daß man bei den delphieigenen Controls wie TListView und Co. keine Items auf unsichtbar stellen und somit ausblenden kann. |
Re: MyInsight
Hallo himitsu,
Zitat:
Zitat:
|
Re: MyInsight
Zitat:
aber mir wäre es schon lieber, wenn ich hier ohne Fremdkomponenten auskommen würde. Drum versuche ich es erstmal mit den delphieigenen Mitteln und erstell dann noch eine "hübschere" Version. Es ist ja nicht immer so schön, wenn man noch weitere Dinge voraussetzt, welche beim jeweiligen Nutzer eventuell nicht vorhanden sind. Im Moment baue ich erstmal die Unterstützung für die TActionList ein und bennene in diesem Zuge die Groups in Categories und Items in Actions um, damit hier auch ein logischerer Zusammenhang entsteht. |
Re: MyInsight
Bin grade dabei mich durch diese komischen TActionLists durchzuwurschteln
und hätte diesbezüglich noch ein paar Fragen: - eine registrierte ActionList mit .State <> asNormal würde ich ignorieren richtig so? - wie ist denn das mit TAction mit Visible=False soll ich diese ebenfalls ignorieren oder doch mit auflisten? (gibt ja auch noch Enabled) |
Re: MyInsight
Ich würds so machen:
- TActionList.State <> asNormal ignorieren - TAction.Visible = false darstellen - TAction.Enabled = false ignorieren mfg Florian |
Re: MyInsight
Im Post #1 liegt jetzt eine aktuellere Version
Derzeit wird dieses noch so behandelt:
Delphi-Quellcode:
In der Demo ist nun auch eine kleine noch nichtsmachende ActionList drin.
if (ActionList.State = asNormal) and Action.Visible and Action.Enabled then
Anzeigen Also nicht wundern, wenn beim Auswählen einer der beiden Aktionen eine Zugriffsverletzung auftritt, denn
Delphi-Quellcode:
Procedure TInsight.ActionClick(Const Sender: IInsightAction);
Begin If not TAction(Sender.Data).Execute Then Raise EAccessViolation.CreateRes(@SAccessViolationNoArg); End; Auch wenn ich gerade, als ich dachte "So, jetzt sind auch die Bilder drin und funktionen" auf ein komisches Problem gestoßen bin ![]() |
Re: MyInsight
Das Problemchen mit den
![]() die Icons lassen sich nun stretchen (hab's über ein weiteres Bitmap gelöst und stretche erst dann), nur die leeren Standard-Icons der Fenster ignoriere ich jetzt erstmal (man kann ja auch andere Icons und sonstige Bilder übergeben). Sonst scheint es ja zu funktionieren. Daniel bräuchte theoretisch jetzt nur seine Aktion-Listen angeben
Delphi-Quellcode:
und dann müßte nur noch irgendwann der Insight-Dialog aufgerufen werden. :-D
Insight.AddActionList(CommandActionList, 'Befehle', True);
Insight.AddActionList(OtherActionList, 'Anderes');
Delphi-Quellcode:
Beim Anzeigen werden die registrierten Aktionlisten neu ausgelesen. (falls in der Zwischenzeit mal was geändert wurde)
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin if Key = VK_F6 then Insight.Show(Self) end; Das True bei AddActionList gibt nur an, daß alle Aktionen der Liste in die angegebene Standard-Kategorie einsortiert sollen. Ansonsten werden die Kategorien verwendet, welche bei den jeweiligen Actions angegeben sind. [info] Quellcodes und der Screenshot upgedatet |
Re: MyInsight, das Delphi 2010 IDE-Insight für's eigene Prog
Ups, da hatten sich ein paar Kleinigkeiten eingeschlichen, welche ich beim Testen mit Delphi 2006 ändern mußte und vergaß wieder zurückzubauen.
(vorallem da dieses in der TStringList kein OwnsObjects kennt, was ohne Reaktivierung des Codes in einem Speicherleck endete und der überladene Default-Property wurde auch nicht zurück umbenannt) Außerdem werden jetzt in der Demo noch über 1000 Dummy-Einträge eingefügt, um die Geschwindigkeit zu testen. Selbst über 3500 Einträge reagierten noch in annehmbarer Zeit. Wobei ich schon überrascht war, da der TreeView bei jeder Änderung der angezeigten Liste komplett neu aufgebaut wird. :stupid: |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Hallo,
Wie wäre es mit einem Insight.AddMainMenu? |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Liste der Anhänge anzeigen (Anzahl: 1)
Menüs lassen sich in meiner internen Version schon hinzufügen und verwalten (das war nicht so schwer ... brauchte ja nur die Verwaltung der Action-Listen klonen),
aber die Menüs auch noch in die Insight-Liste einzufügen ... da muß ich erstmal überlegen/probieren wie sich die Menü-Struktur am Besten auf die Kategorien verteilen läßt. Action-Listen und die Insight-Liste sind ja ein Baum, wo alle "Aktionen" nur in der zweiten Ebene liegen, wärend die erste Ebene immer eine Kategorie ist. Ein Menü (MainMenu, PopupMenu und Co.) können eine Mehrdimensionale Baumstruktur sein und die Aktionen (Items mit OnClick-Ereignissen) können sonstwo liegen. [add] noch völlig ungetestet (werd ich versuchen bald nachzuholen), aber es kompiliert zumindestens schonmal. Neue Befehle in IInsight:
Delphi-Quellcode:
[edit] Anhang gelöscht
Procedure AddMenu (Menu: TMenu; DefaultCategory: String);
Procedure AddMainMenu(Menu: TMainMenu; DefaultCategory: String; AllInDefault: Boolean = False); Procedure AddPopup (Menu: TPopupMenu; DefaultCategory: String); Function CountMenus: Integer; Property Menu [idx: Integer]: IInsightMenu Read GetMenu; Procedure Delete(Menu: IInsightMenu); Overload; Procedure ClearMenus; |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Schaut gut aus, deine Komponente macht wirklich Sinn.
Danke. |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Vielleicht noch eine Funktion fürs UI:
Delphi-Quellcode:
procedure TInsightForm.TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState); begin if ((Key = VK_UP) and (not Assigned(TreeView1.Selected) or (TreeView1.Items.GetFirstNode = TreeView1.Selected))) then Edit1.SetFocus; end; procedure TInsightForm.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_DOWN then TreeView1.SetFocus; end; |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Starke Komponente :thumb:
Weiter so, werde sie bald in einem Projekt einsetzen und hier Bericht erstatten. //Win32 |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Zitat:
Ich hoffe dir gefällt meine etwas andere Behandlung. [edit] Anhang gelöscht |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Deine Tastenspielerei macht den Kreis wirklich rund :)
|
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
So, nun noch ein Testmenü in die Demo eingebaut und dann die Hinweistexte im Insight-Menü optimiert (die Klammern und Anderes wurden nicht so schön ausgegeben)
[edit] Anhänge entfernt |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Hallo,
Ich habe 2 kleine Fehler gefunden: Bevel2: Anchor akRight fehlt ProcessActionList: vor GetBitmap wird nicht überprüft, ob AL2.Images zugewiesen ist Img sollte immer neu erzeugt werden, da es sonst zu Überdeckungen kommt |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Das TBitmap wollte ich eigentlich nur einmal erstellen, um so ein bissl was einzusparen, aber nun wird der Inhalt einfach übermalt, damit die alten Bilder weg sind.
Dateien siehe Beitrag #1 |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Danke für die Änderungen.
Wie wird eigentlich das OnList - Event richtig behandelt? Ich probiere die Fensterliste einer MDI - Anwendung (Form.WindowMenu) einzubauen, habe aber mit dem Change und List - Event so meine Probleme. Denkst du auch an die Funktion Insigth.AddApplicatonManager nach? |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Hallo,
das ist echt eine feine Sache, gefällt mir :thumb: Wird es auch die Möglichkeit geben den Inhalt eines TActionManagers abzubilden? |
AW: MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Für das OnList-Ereignis gibt es nun was in der Demo.
Dieses Ereignis wird immer aufgerufen, kurz bevor die Insight-Liste angezeigt wird. Somit kannst du die Kategorie z.B. immer mit aktuellen Anpassungen versehn, also sie bearbeiten oder neu erstellen. (die Menüs und Actionlisten werdn auch immer mit den aktuellen Daten geladen) In der Demo wird einmal die Kategorie etwas bearbeitet. > eine angezeigte Zahl jedesmal erhöht, wenn die Liste neu angezeigt wird Und dann wird eine andere Kategorie neu erstellt. Damit hat man also die Möglichkeit auch dynamische Daten aufzulisten, welche sich öfters mal ändern. Bei den anderen Action-Sachen ... mal sehn was sich machen läßt. Ein Fehler wurde auch noch behoben, wenn man im OnList-Ereignis was änderte, dann konnte es zu einer Endlosschleife und dem damit verbundenen Stacküberlauf kommen. Diese Schleife war zwar bekannt und sollte über das _DoList unterbunden werden, aber das _DoList:=False war unglücklich positioniert und wurde vorzeitig zurückgesetzt.
Delphi-Quellcode:
If not Assigned(_Form) or _DoList Then Exit;
_DoList := True; ... _DoList := False; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:35 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