AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm
Thema durchsuchen
Ansicht
Themen-Optionen

MyInsight, das Delphi 2010 IDE-Insight für's eigene Programm

Ein Thema von himitsu · begonnen am 29. Apr 2010 · letzter Beitrag vom 18. Jun 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu
Registriert seit: 11. Okt 2003
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?
> Hilfesystem und Stand der Technik
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 > Film #14.1
> 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:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_F6 then Insight.Show(Self);
Zuvor muß natürlich noch eine Reihe von Ereignissen registriert/eingetragen werden.
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:
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;
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.

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.
Miniaturansicht angehängter Grafiken
unbenannt_103.png   unbenannt_878.png  
Angehängte Dateien
Dateityp: 7z MyInsight v0.6 inkl. Demo-EXE.7z (348,2 KB, 75x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (18. Jun 2010 um 11:47 Uhr)
 
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#11
  Alt 4. Mai 2010, 10:25
Das Problemchen mit den fehlenden Farben in der TreeView konnte ich nun erstmal umgehen,
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:
Insight.AddActionList(CommandActionList, 'Befehle', True);
Insight.AddActionList(OtherActionList, 'Anderes');
und dann müßte nur noch irgendwann der Insight-Dialog aufgerufen werden.
Delphi-Quellcode:
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Key = VK_F6 then
    Insight.Show(Self)
end;
Beim Anzeigen werden die registrierten Aktionlisten neu ausgelesen. (falls in der Zwischenzeit mal was geändert wurde)

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#12
  Alt 4. Mai 2010, 21:27
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.
  Mit Zitat antworten Zitat
christio
 
#13
  Alt 16. Jun 2010, 16:03
Hallo,

Wie wäre es mit einem Insight.AddMainMenu?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#14
  Alt 16. Jun 2010, 18:02
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:
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;
[edit] Anhang gelöscht

Geändert von himitsu (17. Jun 2010 um 17:42 Uhr)
  Mit Zitat antworten Zitat
christio
 
#15
  Alt 17. Jun 2010, 13:24
Schaut gut aus, deine Komponente macht wirklich Sinn.
Danke.
  Mit Zitat antworten Zitat
christio
 
#16
  Alt 17. Jun 2010, 15:03
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;
  Mit Zitat antworten Zitat
Win32.API
 
#17
  Alt 17. Jun 2010, 15:04
Starke Komponente

Weiter so, werde sie bald in einem Projekt einsetzen und hier Bericht erstatten.

//Win32
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#18
  Alt 17. Jun 2010, 16:06
Vielleicht noch eine Funktion fürs UI:
OK, die Tastenspielerei ist auch drin.
Ich hoffe dir gefällt meine etwas andere Behandlung.

[edit] Anhang gelöscht

Geändert von himitsu (17. Jun 2010 um 17:43 Uhr)
  Mit Zitat antworten Zitat
christio
 
#19
  Alt 17. Jun 2010, 16:48
Deine Tastenspielerei macht den Kreis wirklich rund
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#20
  Alt 17. Jun 2010, 17:46
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

Geändert von himitsu (18. Jun 2010 um 09:50 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 05:51 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