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 1 von 3  1 23      
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)
 
Florian Hämmerle
 
#2
  Alt 29. Apr 2010, 18:06
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#3
  Alt 29. Apr 2010, 18:39
Zitat von Florian Hämmerle:
@Demo: In deiner Demo zeigt aber TestA auf 'ne Demo-Edit und nicht auf das TestA-Edit
Ups, da wurden ein paar Strings vergessen mit zu ändern.

Ändere mal OnInsight der Demo so ab:
Delphi-Quellcode:
procedure TForm1.OnInsight(Const Sender: IInsightItem);
begin
  if Sender.Text = 'TestAthen
    Edit1.SetFocus
  else
    if Sender.Text = 'TestBthen
Das ist auch der Grund, warum ich vorhin noch einen Data-Parameter den Gruppen und Items verpaßt hab.
(sowas wie das .Tag bei TComponent und dessen Nachfahren)

Damit es dann auch anders und so blöde Stringvergleiche gelöst werden kannen.

Zitat von Florian Hämmerle:
Echt ne coole Idee.
Danke

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.
  Mit Zitat antworten Zitat
Daniel

 
Delphi 10.4 Sydney
 
#4
  Alt 29. Apr 2010, 19:01
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?
Daniel R. Wolf
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#5
  Alt 29. Apr 2010, 19:12
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.

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


Blöd finde ich nur, daß man bei den delphieigenen Controls wie TListView und Co. keine Items auf unsichtbar stellen und somit ausblenden kann.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

 
Delphi XE8 Enterprise
 
#6
  Alt 29. Apr 2010, 19:55
Hallo himitsu,
Zitat von himitsu:
> 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.
Beim VirtualTreeView kannst Du einzelnen Nodes ein oder ausschalten. Als zweite Möglichkeit gäbe es da noch das TAdvStringGrid von TMS Software. Damit kannste auch einzelnen Zeilen ein und ausblenden und das ganze wie einen Tree aufbauen.

Zitat von himitsu:
Blöd finde ich nur, daß man bei den delphieigenen Controls wie TListView und Co. keine Items auf unsichtbar stellen und somit ausblenden kann.
Hier wäre vielleicht die TAdvListView etwas für Dich, ebenfalls von TMS Software. Die hat einige Funktionen mehr als die TListView.
Rolf Warnecke
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#7
  Alt 29. Apr 2010, 20:31
Zitat von RWarnecke:
Beim VirtualTreeView kannst Du einzelnen Nodes ein oder ausschalten.
Das war mir schon bekannt, darum hatte ich diese ja auch im ersten Post als Alternative genannt,
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#8
  Alt 1. Mai 2010, 15:26
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)
  Mit Zitat antworten Zitat
Florian Hämmerle
 
#9
  Alt 1. Mai 2010, 18:44
Ich würds so machen:

- TActionList.State <> asNormal ignorieren
- TAction.Visible = false darstellen
- TAction.Enabled = false ignorieren

mfg Florian
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#10
  Alt 1. Mai 2010, 19:24
Im Post #1 liegt jetzt eine aktuellere Version

Derzeit wird dieses noch so behandelt:
Delphi-Quellcode:
if (ActionList.State = asNormal) and Action.Visible and Action.Enabled then
  Anzeigen
In der Demo ist nun auch eine kleine noch nichtsmachende ActionList drin.
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 Wie TIcon gestretcht in ein TBitmap zeichnen?.

Geändert von himitsu (16. Jun 2010 um 21:42 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 04:55 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