![]() |
OTA - komplexer Experte
Ich bin dabei, einen OTA-Experten neu (und ordentlich) aufzubauen.
Dabei gibt es ein Problem, das schwer zu beschreiben ist. Ich versuche einmal einige Stichpunkte: * Fertig hatte ich einen OTAWizard - hat als installiertes Package funktioniert (ohne Bitmap im SplashScreen) - und als dll über die Registry (mit Bitmap im SplashScreen) * Fertig hatte ich auch einen DockingFormExperten - nur als installiertes Package getestet - als dll über die Registry nicht extra versucht *nun habe ich die Form-Units aus dem Docking-Experten in der Wizard eingebunden - compilieren ließ sich alles, aber der Docking-Experte war nicht wirksam - offenbar wurde die Register-Prozedur des DockingExperten nicht ausgeführt - ich habe also das Ganze etwas umgebaut und Registerprozedur des Experten umbenannt und vom Wizard aus explizit aufgerufen - hat dann alles funktioniert, sowohl als Packageinstallation als auch über dll Letztes Problem: Wenn das DockingForm offen und eingedockt ist gibt es einen Fehler beim Schließen der IDE. Die Beschreibung ist natürlich sehr vage aber hat jemand vielleicht eine Idee oder würde sich das Projekt mal anschauen? |
AW: OTA - komplexer Experte
Zitat:
Zitat:
|
AW: OTA - komplexer Experte
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist alles schwierig nachzuvollziehen (für mich zumindest).
Das Package reagiert immer etwas unterschiedlich, je nachdem wie man es nutzt (wie es installiert wird). Wenn es Dich selbst interessiert schicke ich Dir meinen Strand mal, aber ich denke, ich habe da grundsätzlich etwas falsch gemacht und werde nochmal einen neuen Versuch starten... |
AW: OTA - komplexer Experte
Gut, das sollte sich finden lassen. Beim Zerstören des Formulars läuft eine TInterfaceList aus dem Scope und dann knallt es bei der Zerstörung eines der Elemente.
Reinschauen kann ich gerne mal, aber für längeres Debuggen, wenn ich es nicht schnell finde, habe ich leider keine Zeit. |
AW: OTA - komplexer Experte
Vielen Dank.
Ich schaue erst nochmal. Da lerne ich ja auch draus. Das Problem zu debuggen wird sicher schwierig. Ich muss halt mal heraus finden, wie man die OTA in dem Bereich korrekt nutzt. Ich schicke es Dir mal, falls ich nicht weiter komme oder auch gern wenn Du ein Eigeninteresse hast. |
AW: OTA - komplexer Experte
Ich habe mal ein Video erstellt:
![]() Zu Einen hilft es vielleicht mal jemandem, um zu sehen, wie man so etwas angehen kann und zum Anderen beschreibt es auch (ab 8:30 min) mein aktuelles Problem, so dass mir vielleicht jemand helfen kann... Meine Frage ist also, warum die Procedure Register in dem IDE-Package ausgeführt wird, aber nicht in dem DLL-Package. Ist das normal und wie kann man das lösen? Sicherlich ist das Beispiel nicht mehr ganz aktuell aber zumindest würde ich erwarten, dass es auf beiden Installationswegen gelich funktioniert. Vielen Dank an der Stelle auf jeden Fall schon mal an @dummzeuch! EDIT: ![]() ![]() |
AW: OTA - komplexer Experte
Moinsen :)
Tip: ![]() Lt. diesem werden müssen DLL's anders initialisiert werden. Direkt mal reinlesen. Das sollte das Problem mit der DLL lösen :) Gruß Uwe |
AW: OTA - komplexer Experte
Vielen Dank Uwe.
Auf dem Weg bin ich leider nicht weiter gekommen. Das Video-Tutorial scheint das schon korrekt zu realisieren. Mein Problem konnte ich jetzt allerdings sehr einfach lösen, indem ich die Initialisierung des DockingExperten auf beiden Wegen in den MainWizard integriert habe:
Delphi-Quellcode:
Ich habe es einfach so ausprobiert und bin nicht ganz sicher, ob es der absolut korrekte Weg ist.
unit OTAUnitOptimizerWizard;
interface ... procedure Register; function InitWizard(const BorlandIDEServices: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var Terminate: TWizardTerminateProc) : Boolean stdcall; exports InitWizard Name WizardEntryPoint; implementation uses DockFormExpert, // <------------------------------------- VCL.Dialogs, OTAUnitOptimizerSplashScreen, OTAUnitOptimizerAboutBox; procedure Register; begin RegisterPackageWizard(TOTAUnitOptimizerWizard.Create); RegisterPackageWizard(TDockFormExpert.Create as IOTAMenuWizard); // <------------------------------------- end; function InitWizard(const BorlandIDEServices: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var Terminate: TWizardTerminateProc) : Boolean stdcall; begin RegisterProc(TOTAUnitOptimizerWizard.Create); RegisterProc(TDockFormExpert.Create); // <------------------------------------- Result := True; end; Aber es funktioniert erst einmal augenscheinlich völlig problemlos. |
AW: OTA - komplexer Experte
Liste der Anhänge anzeigen (Anzahl: 1)
Noch eine Frage:
Ich erzeuge in der IDE ein eigenes Menü und kann über Click auf ein MenuItem auch eine Methode aufrufen. Dem MenuItem ist auch ein Shortcut zugewiesen, der auch dargestellt wird. Beide Stellen sind rot markiert. Ausführen kann ich die Methode jedoch über die Tastenkombination nur, wenn diese nicht schon verwendet ist. Ctr+Shift+O funktioniert nicht, Ctr+Shift+ALt+O funktioniert. Wo der Tastendruck ggf. abgefangen wird weiß ich nicht. Wie kann ich festlegen, dass der neue Eintrag Vorrang haben und ggf. alte Zuweisungen ersetzen soll? Ich könnte natürlich nochmal über ein KeyBinding die Methode einem ShortCut zuweisen (wie gelb markiert). Das wäre aber eine (unnötige?) Dopplung, die ich eigentlich gern vermeiden würde. Wie macht man es richtig? |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
Naja, ich habe da offenbar eine natürliche Priorisierung vorausgesetzt. :stupid:
Außer CodesiteLogging (free) habe ich bisher keine Erweiterungen installiert. Ich wüsste auch nicht, für welche Funktion Ctrl+Shift+O bereits verwendet sein sollte (vielleicht fängt das ja auch eine ganz andere Anwendung (z.B. SnagIt) ab)). Erst dachte ich, die ShortCuts würden für mein Menü gar nicht funktionieren, bis ich dann noch Ctrl+Shift+Alt+O probiert habe. Ich schaue mir das mal heute Abend noch genauer an... (Bin ja schon zufrieden, dass es grundsätzlich geht.) |
AW: OTA - komplexer Experte
Zitat:
![]() GExperts hat diese Funktion etwas anders implementiert auch. Beide sind allerdings dadurch eingeschränkt, dass die IDE keine zentrale Stelle hat, wo man diese Shortcuts abfragen oder gar konfigurieren kann. |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
... aber noch besser eigentlich als Windows-Funktion.
Sonst weiß man ja auch nicht, ob sich ein anderes Programm da vor- oder reindrängelt... |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe jetzt nicht geprüft, wo der ShortCut ggf. priorisiert registriert wird, aber zumindest eine Lösung umgesetzt.
Zum Einen wird das Menü mit ShortCut erstellt und dann nochmal ein analoges KeyBinding für den selben ShortCut eingerichtet. Im Wizard sieht das dann so aus:
Delphi-Quellcode:
Die .pas, in der das dann realisiert wird, habe ich mal angehängt.
procedure Register;
begin RegisterPackageWizard(TOTAUnitOptimizerWizard.Create); TQuickSearchForm.CreateDockForm; TFullSearchForm.CreateDockForm; uoMenues.Initialize; // <---- (BorlandIDEServices as IOTAKeyboardServices).AddKeyboardBinding(uoBindings); // <---- end; function InitWizard(const BorlandIDEServices: IBorlandIDEServices; RegisterProc: TWizardRegisterProc; var Terminate: TWizardTerminateProc): Boolean stdcall; begin RegisterProc(TOTAUnitOptimizerWizard.Create); RegisterProc(TQuickSearchExpert.Create); TQuickSearchForm.CreateDockForm; RegisterProc(TFullSearchExpert.Create); TFullSearchForm.CreateDockForm; uoMenues.Initialize; // <---- (BorlandIDEServices as IOTAKeyboardServices).AddKeyboardBinding(uoBindings); // <---- Result := True; end; Das ist so ganz übersichtlich (finde ich) und funktioniert. Lediglich die Freigabe der Objekte musste ich ausklammern, da dies sonst zu einer Zugriffsverletzung beim Schließen von Delphi führt. Ich denke, damit kann ich leben. Falls jemand eine bessere Lösung kennen sollte, dann immer her damit. :-) Mit meinem Wizard bin ich dann soweit fertig, dass alles funktionelle grundsätzlich drin ist. Fehlen jetzt noch ein Installer, Updater und natürlich die eigentliche logische Funktionalität (die hatte ich ja schon mal relativ fertig umgesetzt). |
AW: OTA - komplexer Experte
Vielleicht kannst du das Erstellen der Menuitems in eine Funktion auslagern, damit der Quellcode besser lesbar ist.
Delphi-Quellcode:
Auch das onclick könnte man noch als Parameter übergeben.
function TuoMethodes.UnitOptimizer_CreateMenuItem(Name: String; Capton: string);
var mi: TMenuItem; begin mi := TMenuItem.Create(nil); mi.Name := Name; mi.Caption := Capton; Result := mi; end; procedure TuoMenues.Initialize; begin if Supports(BorlandIDEServices, INTAServices, NTAServices) then begin StahliSoftMenuItem := UnitOptimizer_CreateMenuItem('StahliSoftMenuItem', 'StahliSoft'); NTAServices.AddActionMenu('ToolsMenu', nil, StahliSoftMenuItem, False, True); StahliSoftMenuItem := UnitOptimizer_CreateMenuItem('StahliSoftUnitOptimizerMenuItem', 'UnitOptimizer'); NTAServices.AddActionMenu('StahliSoftMenuItem', nil, UnitOptimizerMenuItem, True, True); //... usw end; |
AW: OTA - komplexer Experte
Ja, Danke.
Stimmt. Kann ich noch machen. |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
Ohj, ja, klar. :oops:
TuoBindings wird ja als Interface benutzt. Hatte ich offenbar übersehen, weil ich selbst kein Interface und keine Interfacevariable deklariert habe.
Delphi-Quellcode:
Die anderen 2 Objekte werde ich dann entprechend noch freigeben.
TuoMethodes = class
... TuoBindings = class(TNotifierObject, IOTAKeyboardBinding) ... TuoMenues = class ... Das sollte ja dann ok gehen. |
AW: OTA - komplexer Experte
Ich will mich jetzt mal um einen Installer kümmern...
Eine eigene Lösung mit Eintrag in Registry, Lizenzdatei und optional UpdateCheck würde ich mir grundsätzlich zutrauen. Wie steht es denn aber aktuell mit dem GetIt-Manager? Lässt sich der für ein Projekt wie meins nutzen? Muss Emba das genehmigen? Habe ich da überhaupt eine Chance? (Das Package müsste sich ja erst mal bewähren...) Wie würde das mit "Lizenz kaufen" und überhaupt mit unterschiedlichen Lizenzen funktionieren? (Einen älteren Beitrag dazu habe ich hier gefunden: ![]() |
AW: OTA - komplexer Experte
Zitat:
Zitat:
Zitat:
Du könntest das allerdings so gestalten, daß sich die Trial mit einem Lizenzkey freischalten lässt, den der Anwender bei dir über einen anderen Kanal erwerben muss. Dann kannst du GetIt immerhin als Softwareverteiler und -updater einsetzen. Allerdings erst, wenn die Update-Funktionalität auch endlich verfügbar ist. Das kann aber auch noch 10.5 oder später sein und erreicht dann auch nur die Leute mit dieser Version. Die GetIt-Kataloge sind bisher jedenfalls an die Delphi-Version gebunden. Mir persönlich ist das zu starr, zu eingeschränkt und zu umständlich. Mein Release-Prozess beschränkt sich aktuell auf einen Klick im CI-System und das Anlegen der neuen Version auf der jeweiligen Download-Seite. Das erlaubt mir Updates im Viertelstundentakt zu liefern (zumindest theoretisch). Wenn ich genug Zeit und Lust auf PHP hätte, würde ich das ja auf den besagten Klick reduzieren, aber so ist es auch akzeptabel. Solange mir GetIt keine vergleichbaren Turnaround-Zeiten bietet, gibt es den MMX und meine Tools auch weiterhin nur auf meiner Website. Aber die sind ja auch gratis. Man sollte dabei auch bedenken, daß GetIt ausschließlich für den Hobbybereich oder als Teaser gedacht ist. Für den professionellen Einsatz ist das nicht zu gebrauchen (und das weiß Embarcadero auch). Es ist halt ein Marketinginstrument - nicht mehr und nicht weniger. Insofern vermutlich durchaus interessant für dich. |
AW: OTA - komplexer Experte
Vielen Dank!
Ich werde erst mal ein eigenes System versuchen. Später könnte man ja ggf. eine Free-Version noch in GetIt bringen, falls es Interesse gibt. |
AW: OTA - komplexer Experte
Ich habe mal einen Installer gebaut, der den Wizard für unterschiedliche Delphi-Versionen installieren und updaten kann.
Die grundsätzliche Arbeitsweise kann ich schon mal zeigen. In den Wizards selbst könnte optional über verfügbare Updates informiert werden. Das Update selbst müsste dann wieder über den Installer erfolgen (ebenso die Installation bei neuen Delphi-Versionen). Der Installer würde in einfacher Form auf unterschiedliche verfügbare Lizenzen prüfen. Das ist allerdings noch nicht umgesetzt und dann auch nicht Fort Knox. Mich würde natürlich mal interessieren, was Ihr von dem Ansatz haltet: ![]() |
AW: OTA - komplexer Experte
Tatsächlich finde ich das sehr gelungen (vom Formulardesign mal abgesehen).
So eine komfortabel Behandlung/Installation/Update eines Plugins für Delphi finde ich klasse. |
AW: OTA - komplexer Experte
Freut mich. :bounce2:
Wenn Du mit Formulardesign das Styling meinst, ich wollte eigentlich mit unterschiedlichen Styles arbeiten. Das funktioniert allerdings nicht korrekt. Ich habe einen QC-Eintrag erstellt: ![]() |
AW: OTA - komplexer Experte
Ich meinte das Formulargrau und die Linien, das sieht alles etwas "altbacken" aus.
Wobei ich mich da sehr weit aus dem Fenster lehne, meine Applikationen sehen immer so aus, da mein grafisches Talent dem eines Flaschenöffners gleicht... Nebenbei: Auf englisch heißt es : license |
AW: OTA - komplexer Experte
Ja, das sind Panels in einer Scrollbox.
Denen wollte ich gerade einen abweichenden Style zu weisen, damit es mehr nach ordentlicher Tabelle aussieht. Geht halt nur nicht. :-( Mit dem englisch stimmt natürlich. :oops: |
AW: OTA - komplexer Experte
Zitat:
Was das angeht ist es bei TMS z.B. schon ganz gut. Schade (um freundlich zu bleiben) ist dort nur, dass jeweils ein eigener Installer pro Paket verwendet wird und das ganze nicht direkt in den Subscription Manager integriert ist. |
AW: OTA - komplexer Experte
Ich hatte ein Stringgrid versucht, aber kam damit nicht zurecht.
Folgende Anforderungen: - Rechte zwei Spalten fixe Breite - Linke Spalte automatische Breite - Zeilen optional ausblenden (man könnte natürlich auch Zeilen auslassen, also betreffende Datenrecords gar nicht erst als Zeile behandeln) - 1 bis 3 Controls zentriert in einer Zelle platzieren (klickbar und hoverbar) Dann hatte ich es mit einem Gridpanel versucht und es zum Schluss doch lieber dynamisch zusammengebaut. Wenn ich die Zellen noch etwas gesondert stylen könnte (was ja theoretisch gehen sollte) wäre ich schon zufrieden. Ich warte einfach auf ein Fix. |
AW: OTA - komplexer Experte
All das und noch viel mehr kann die
![]() |
AW: OTA - komplexer Experte
Jetzt funktioniert alles schon sehr gut. :-)
Die Exe kann sich selbst updaten (Neustart wird über Batch geregelt) und die einzelnen Delphi-Wizards können auch problemlos installiert/geupdatet werden. Letzte Aufgabe diesbezüglich ist die Verfügbarkeitsprüfung von Updates für die Wizards, wenn Delphi gestartet wird. Ich könnte mir das so vorstellen, dass bei der Initialisierung nach dem Start vom jeweiligen Delphi jeder Wizard prüft, ob für ihn ein Update verfügbar ist. Dazu müsste ich allerdings die Prüfung aus dem Installer (der lädt eine Liste aus dem Netz und vergleicht die Zeitstempel) nochmal in jedem Wizard für einen einzelnen Eintrag nachbauen. Dann könnte eine Info ausgegeben werden: "Bitte Installer starten und updaten!". Oder ich starte einfach den Installer mit einem Parameter "/quiet /10.4" und der prüft auf ein Update für diese Version. Wenn verfügbar bleibt er auf und zeigt das Formular an. Wenn nicht verfügbar beendet er sich wieder. Wie würdet Ihr es lösen? |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
Hier mal ein kurzes Video, wie die Wizards upgedated werden:
![]() Und noch eins, wie der Installer sich selbst updatet: ![]() |
AW: OTA - komplexer Experte
Hallo zusammen,
ich habe mal eine Bitte an die OTA-Profis unter Euch... Ich nutze zwei DockableForms. Bei einer eingebundenen DLL funktioniert alles perfekt. Wenn ich allerdings das Package installiere (um den Wizard debuggen zu können) stürzt Delphi beim Schließen oder beim deinstallieren des Packages ab. Das ist etwas schwer genau zu beschreiben. Ich habe mal ein Video erstellt: ![]() Hat jemand mal Zeit und Lust, sich das anzusehen? Ich komme einfach nicht weiter. Das Problem ist also das Erzeugen der Formulare innerhalb eines installierten Packages. So sehen die Formularmethoden aus:
Delphi-Quellcode:
{ TFullSearchForm }
class procedure TFullSearchForm.CreateDockForm; begin if not Assigned(FormInstance) then CreateDockableForm(FormInstance, TFullSearchForm); end; class procedure TFullSearchForm.ShowHideDockForm; begin CreateDockForm; ShowHideDockableForm(FormInstance); end; class procedure TFullSearchForm.RemoveDockForm; begin Codesite.Send('-> TFullSearchForm.RemoveDockForm'); FreeDockableForm(FormInstance); Codesite.Send('<- TFullSearchForm.RemoveDockForm'); end; |
AW: OTA - komplexer Experte
Ich habe jetzt dem Formular Application als Owner zugewiesen.
Jetzt funktioniert das Öffnen, Schließen und Debuggen des Projektes. Allerdings stürzt Delphi beim deinstallieren oder neuerlichen installieren des Packages manchmal stumpf ab. Daher will ich nochmal nachfragen, ob vielleicht doch noch jemand einen Tipp hat. Notfalls könnte ich zwar erst mal weiter arbeiten und müsste gelegentlich Delphi neu starten, aber schön ist das nicht. Die DLL-Variante ist weiterhin stabil (jedenfalls habe ich keine Probleme festgestellt).
Delphi-Quellcode:
procedure CreateDockableForm(var FormVar: TDockableFormBase; FormClass: TDockableFormBaseClass);
begin Codesite.Send('-> CreateDockableForm'); TCustomForm(FormVar) := FormClass.Create(Application); // <------------ statt nil RegisterDockableForm(FormClass, FormVar, TCustomForm(FormVar).Name); Codesite.Send('<- CreateDockableForm'); end; |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
Das stimmt.
Aber um das Package weiter zu entwickeln und zu debuggen muss man es ja deinstallieren bzw. neu installieren. Sollte das nicht grundsätzlich machbar sein? |
AW: OTA - komplexer Experte
Zitat:
|
AW: OTA - komplexer Experte
Ok vielen Dank.
Dann werde ich erst mal versuchen, so weiter zu arbeiten. Wird halt den einen oder anderen zusätzlichen Neustart notwendig machen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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