Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mär 28, 2024 20:03

Foren-Übersicht » Sonstiges » Projekte
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: SharpDesk
BeitragVerfasst: Do Mär 25, 2004 17:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Einleitung - Was ist SharpE?
SharpE ist ein Shell Replacement System für WinXP/2k. Genauer gesagt werden der normale Windows Desktop sowie die Taskleiste komplett deaktiviert und durch eigene Komponenten ersetzt. Dabei ist das gesammte SharpE Projekt sehr Modular aufgebaut. Jede einzelne Komponente (Taskleise,Desktop,Trayleiste,Toolleiste,Core Anwendung,Fenster Manager) ist dabei eine extra Anwendung. Toolleiste, Core Anwendung und der Desktop bauen zusätzlich dazu auf einem Plugin System auf was das ganze sehr dynamisch macht.
Ich bin jetzt seit Dezember 2003 mit der Entwicklung der komplett neuen Desktop Komponenten beschäftigt.
Insgesammt sind an SharpE ca. 10 Entwickler in allen Bereichen beteiligt.

Was ist SharpDesk?
SharpDesk ist die Desktop Komponente welche dafür sorgt das der Windows Desktop durch eine brauchebare Anwendung ersetzt wird. Insgesammt sind an der Entwicklung von SharpDesk noch zwei weitere Entwickler beteiligt. Ein Entwickler für das komplette Menü(SharpMenu) und ein weiterer der als Ünterstützung ein paar Grafikfunktionen(Schattenwurf, Blend funktionen, ... ) geschrieben hat.
Bevor ich jetzt zur genauen funktionsweise komme kann sich ja mal jeder selbst die frage stellen wie man am besten einen Desktop programmiert :wink:

Frühere SharpDesk Versionen waren sehr eingeschränkt da alle Desktop Objekte durch Kombination von VCL Komponenten (TLabel,TImage,TPanel,...) erzeugt wurden, was wohl der einfachste weg ist. Damit wurde zwar schon ein recht guter Desktop ersatzt programmiert. Jedoch waren damit nur schwer Verbesserungen und Erweiterungen möglich.
Mit dem neuen SharpDesk habe ich mir zum Ziel gesetzt das ganze komplett dynamisch aufzubauen. Jedes einzelne Desktop Objekt soll also in eine externe .dll Datei ausgelagert werden.
(Einige erinnern sich vielleicht daran das ich vor ein paar Monaten gehäuft fragen zum laden von Formularen aus dll Dateien gestellt hatte :wink: )
Nachdem ich dann insgesammt drei verschiedene Plugin Systeme (TForm in .dll, Delphi Packages und .dll mit TForm und interner Fenster Verwaltung) ausprobiert hatte, mich jedoch keins der Verfahren zufriedenstellen konnte, mußte ich einen komplett anderen weg gehen.
(Anmerkung : Normale Formulare bringen nur Probleme im Bezug auf Transparenz,AlphaBlending und Bedienung der einzelnen Objekte.)

Das TBitmapLayer System
Nach langen Diskusionen und einer sehr langen suche nach einem guten Plugin System bin ich dann irgendwann auf die kostenlose graphics32(http://g32.org/graphics32/index.html) Biblothek gestoßen. Diese Biblothek bietet eine ganze menge von Grafischen funktionen und Komponenten. Aber eigentlich interessant ist dabei die VCL Komponente TImage32. Das besondere hierbei ist das TBitmapLayer System. Für die Komponente TImage32 kann man beliebig viele Bitmap Ebenen erzeugen und diese wie in modernen Grafikprogrammen (Photoshop,Gimp,...) unabhängig voneinander bearbeiten. Vorteil davon ist das mit diesen einzelnen Bitmap Ebenen nahezu perfekte AlphaBlend und Transparenz Effekte erzeugt werden können.

Also wurde das komplette Plugin System dahingehend geändert das jedes Desktop Objekt nun eine Bitmap Ebene exportiert. Das ganze kombiniert mit einem Objekt dll internen "Fenster" Manager der die einzelnen Bitmap Ebenen eines Objekts verwaltet ergibt dann in Grundzügen das Plugin System.

Das Desktop Objekt/Plugin System
Jedem einzelen Objekt welches auf dem Desktop geladen ist wird eine einzigartige Objekt ID zugewiesen. Diese Objekt ID wird beim erzeugen oder laden eines Desktop Objekts an die Objekt.dll Datei weitergeben.
Code:
  1. function CreateLayer(Image: TImage32; ObjectID : integer) : TBitmapLayer;
  2.  
  3. (Es wird mit Image das TImage32 der Hauptanwendung übergeben auf dem die Bitmap Ebene erzeugt werden soll. Zurück gibt die Funktion die erzeuge Bitmap Ebene.)
  4.  

Anhand der Objekt ID werden die einzelnen Bitmap Layer dann Objekt Intern in einer einfachen Pointer Liste Abgelegt. Somit kann dann über die Objekt ID auf den einzelnen Bitmap Layer zugegriffen werden. (Um änderungen durchzuführen).
Ein Problem an diesen Bitmap Ebenen besteht darin das sie nicht selbständig auf Ereignisse wie OnClick,OnMouseMove oder OnMouseEnter reagieren können. Das heißt es gibt keine möglichkeit einfache Notify Events zu benutzen um dem Objekt mitzuteilen das der User eine aktion mit einer bestimmten Bitmap Ebene durchführt. Die Hauptanwendung auf der letztendlich alle Bitmap Ebenen zusammengeführt werden übernimmt deshalb komplett die Kontrolle über alle OnMouseMove,OnClick,OnMouseEnter,... Events. Die Anwendung ermittelt also die zutreffenden Events für die einzelnen Bitmap Ebenen. Die Events werden dann über eine eigene SharpDesk Message funktion an die Objekte übermittelt. Dabei wird wieder die Objekt ID der Bitmap Ebene übermittelt welche den Event empfängt. Das Desktop Objekt sucht die die Entsprechende Bitmap Ebene anhand der Objekt ID aus der internen Pointer Liste herraus und reagiert entsprechend auf die SharpDesk Message. SharpDesk Nachrichten sind z.B. : SDM_REPAINT_LAYER, SDM_MOUSE_ENTER, SDM_MOUSE_LEAVE, SDM_CLOSE_LAYER, SDM_DOUBLE_CLICK,... (insgesammt bis jetzt 10). Das Objekt muß dann nur noch in der SharpDeskMessage funktion entsprechend auf die einzelnen Nachrichten reagieren.
Der Inhalt der Bitmap Ebene, also das was letztendlich dargestellt werden soll, wird über die TBitmap32 Eigenschaft der Bitmap Ebene gesteuert. TBitmap32 ist eine erweiterte TBitmap Klasse die diverse zusätzliche funktionen bietet(mehr dazu kann bei der graphics32 Biblothek nachgelesen werden). Es ist also grob gesagt einfaches Zeichnen auf eine Zeichenfläche. (Das beschränkt sich bei den meisten Objekten auf das Laden eines Icons und das Zeichnen eines Textes) Über die SharpDesk Message funktion kann das Objekt dann auf Aktionen reagieren indem das Bitmap gegebenenfalls neu gezeichnet wird.
Grob zusammgefaßt exportieren die Objekte also ein Bitmap welches dann durch das TBitmap Layer System in der Hauptanwendung geladen wird.

Zur Konfiguration der einzelnen Objekte und der individuellen Objekt Eigenschaften wird ein einzelnes TForm exportiert welches von der Hauptanwendung geladen wird. Diesem Konfigurationsfenster wieder dann über die Objekt ID mitgeteilt welche Einstellungen zu laden sind. Das sieht dann vereinfacht so aus das die Hauptanwendung einfach die funktion : StartSettingsWnd(Objekt ID : integer) aufruft. Darauf möchte ich jetzt aber nicht weiter eingehen da hier halt einfach nur ein TForm erzeugt und das handle des Formulars an die Hauptanwendung übergeben wird ...

Jetzt mal genauer zu den besonderes Features...

Hintergrundwissen - SharpE Schemes
Für SharpE gibts es im vergleich zu anderen Shell Replacements keine Skins sonder nur Schemes. Das bedeutet das das Design der SharpE Komponenten immer gleich ist und sich nur in der Farbgebung unterscheidet. Dazu werden 6 Farben Definiert.(WorkAreaLight,WorkAreaBack,WorkAreaDark,ThrobberLight,ThrobberBack,ThrobberDark). Die WorkArea Farben definieren die Farben der Arbeitsflächen. Die drei Throbber Farben definieren Farben für besondere Buttons und Elemente.
Ein SharpE Scheme sieht z.B. so aus :
Bild

Ich erwähne das ganze hier weil alle SharpE Core Komponenten in diesem Style erscheinen und auch das gesammte SharpDesk Formular Design sowie einzelne Effekte darauf abgestimmt sind.

Themes
SharpDesk bietet eine umfangreiche Unterstützung dafür das jeder User das Erscheinungsbild individuell anpassen kann. Über die SharpDesk Themes können Wallpaper, Wallpaper Effekte, Schrift (Farbe,Größe,...), Farb Schema undText Schatten (Farbe und Transparenz) miteinander Verbunden werden. Als besonderes Feature unterstützt SharpDesk das dynamischen überblenden des Hintergrundbildes in die Throbber oder WorkArea Farbe des aktuellen Schemes. Damit können dann sehr einfach wirklich tolle effekte erziehlt werden ohne das der User das Wallpaper per Hand bearbeiten muß. Die Wallpaper Effekte werden jeweils beim start oder ändern des Themes auf das Wallpaper angewendet.(Das Original bleibt immer unverändert)
Außerdem gibt es die möglichkeit ein einzelnes Desktop Objekt Set, also die aktuelle Konfiguration und Anordnung der Desktop Objekte, mit dem Theme zu verbinden. So kann ein User indem er ein anderes Theme lädt in wenigen Sekunden einen komplett anderen Desktop mit einem anderen Erscheinungsbild laden.

Hier jetzt ein paar Screenshots des Theme Manager :
Bild

BildBildBildBild

Die Screenshots zeigen den Vorgang wie man ein neues Theme erstellt. Dabei können am Vorschau Bild gut die Text Schatten und Wallpaper Blending Effekte verfolgt werden (Im ersten Bild ist beides deaktiviert).

SharpMenu
Für den Rechtsklick wird ein extra Entwickeltes Menu System eingesetzt.
Da SharpMenu aber von einem anderen Entwickler programmiert wird will ich hier nicht viel dazu sagen.
Ich belasse es einfach bei einem Screenshot :
Bild
(Fragen SharpMenu betreffend können trotzdem gestellt werden)

Objekt Popup Menü
Zum bearbeiten und ändern der Objekt Eigenschaften gibt es ein seperates Popup Menü welches angezeigt wird sobald ein Rechtsklick auf einem Desktop Objekt ausgeführt wird. Über dieses Popup Menü können diverse Einstellungen verändert werden.
Der Screenshot ist da denke ich größtenteils selbsterklärend :
Bild

Hierbei sieht man bei genauerem hinsehen das das Icon unter dem Popup Menü etwas hell leuchtet. Dies ist ein OnMouseOver Highlight welches vom Objekt aufgrund der SharpDesk Messages SDM_MOUSE_ENTER und SDM_MOUSE_LEAVE erzeugt wird.

Hinzufügen eines Desktop Objekts
Der Auswahl Dialog :
Bild

Das Design dieser Auswahl Liste wird über eine TScrollBox erzeugt. In der ScrollBox wird für jeden Eintrag ein Panel als Hintergrund erstellt welches dann auf OnClick Ereignisse reagiert. Auf diesem Panel werden dann einfach drei TLabel erzeugt. Das ganze ist finde ich ein gutes Beispiel für alternative ListBoxen.
(Wer mehr Informationen darüber möchte kann einfach fragen)

Nachdem der User nun ein Desktop Objekt ausgewählt hat wird der Konfigurationsdialog geladen :
Bild

Der hier rot eingerahmte Bereich ist das eigentlich Konfigurationsformular welches vom Desktop Objekt exportiert wird. Dieses wird einfach auf ein Panel geladen wodurch es in das von der Hauptanwendung erzeugte "Object Settings" Formular integriert wird. Beim klick auf "Ok" oder "Cancel" wird die vom Objekt Exportierte CloseSettingsWnd funktion aufgerufen. Je nach bedarf wird hier dann als Parameter übergeben ob das Konfigurationsformular die Einstellungen speichern oder verwerfen soll. So bleiben sämtliche Einstellungen für die einzelnen Objekte im Konfigurationsformular des Objekts. Die Hauptanwendung kann aber trotzdem noch bestimmen ob die Einstellungen gespeichert werden sollen. Damit sind die Konfigurationsformulare der Objekte nicht komplett unabhängig und unterliegen immer noch einer gewissen Kontrolle durch die Hauptanwendung.

Speicherung aller Einstellungen
Die Einstellungen der Objekte und Themes werden komplett in XML gespeichert. Dazu benutze ich die TJvSimpleXML Komponente der Jedi VCL Sammlung. Aufgeteilt sind die Einstellungen dabei in drei Dateien (SharpDesk.xml, Themes.xml und Objects.xml). Mehr muß ich dazu eigentlich auch gar nicht sagen.
Außer vielleicht noch das ebenfalls über xml Dateien die Einstellungen für die Drag & Drop Konfiguration geladen werden. Jedes Objekt welches mit einer bestimmten Dateiendung verknüpft werden soll kann im Settings\SharpDesk\Drag And Drop\ Verzeichniss eine .xml mit entsprechenden Informationen ablegen. Die Hauptandwendung wird dann diese Dateiendung mit dem gewünschten Desktop Objekt verknüpfen...


Damit ist zum eigentlichen Hauptprogramm erstmal das wichtigste gesagt.
Hier noch eine kleine Übersicht über bisher fertiggestellte Desktop Objekte :
File Object
Bild
-zum erstellen von Verknüpfungen zu Anwendungen
-Icons können aus der .exe Datei extrahiert werden
-falls kein Icon in der .exe Datei vorhanden ist wird das entsprechende shell Icon benutzt
-das Icon kann ebenfalls zur Throbber Farbe überblendet werden
-individuelle Transparenz Einstellungen sind möglich
-Icons aus .ico Dateien können in allen größen geladen werden
-das Anzeigen des Titels kann deaktiviert werden
-das Objekt zeigt bei bedarf Text Schatten an

Folder Object
Bild
-zum erstellen von Verknüpfungen zu Verzeichnissen(inklusive Shell Verzeichnissen)
-bietet die selben Features wie das File Object nur das hier noch standard Icons für die verschiedenen Shell Folders definiert sind.s

Drive Object
Bild
-zum erstellen von Verknüpfungen zu Laufwerken
-bietet auch die selben Features wie die das File Object. Zusätzlich kann jedoch noch die Anzeige eines Statusbalkens, welcher den freien Festplattenplatz anzeigt, aktiviert werden. Hier sind wieder diverse standard Icons für die einzelnen Laufwerkstypen definiert.

Recycle Bin Object
Bild
-bietet auch wieder die selben Features wie das File Object nur das diesmal der genaue Status des Papierkorbs angezeigt wird. Bei einem Doppelklick wird der Papierkorb im Explorer geöffnet.

Dazu gibt es bis jetzt noch ein Desktop Objekt welches eine einfache Uhr anzeigt sowie ein Objekt mit dem einfach nur Bilder geladen werden können.
Mehr Objekte sind noch in Arbeit :)
Bevor ich zu den kompletten Screenshots komme hier noch ein Screenshots welcher die XP Icon Unterstützung zeigt. Das folgende Icon wurde einfach mehrfach und in unterschiedlichen Größen aus ein und der selben .ico Datei geladen :
Bild
(Zusätzlich wurde das Icon noch zur aktuellen Throbber Farbe überblendet. Die Transparenz sollte außerdem gut zu erkennen sein)

Hier nochmal eine (noch unvollständige) Projekt Übersicht :
Bild

Zum Aschluß noch zwei Screenshots welche den selben Desktop mit zwei verschiedenen Themes zeigen :
(Nur der reine Desktop ist Teil von SharpDesk. Die Task-,Tray- und Toolbar sind die anderen Komponenten des SharpE Shell Replacement Systems)
BildBild

Bis vor kurzem war der komplette Quellcode auf einem SharpE cvs Server verfügbar. Der Server ist zur Zeit leider down. Es wird gerade versucht das SourceForge cvs System zu nutzen. Ich werde hier sofort eine Nachricht posten wenn der cvs Server wieder verfügbar ist.

Links zum Thema :
http://www.lowdimension.net - SharpE Webseite (aktuell leider down und durch ein Notfall Forum ersetzt)

Aktuelle SharpDesk Beta Versionen funktionieren nur in Verbindung mit einem installierten SharpE System. Deshalb bringt es wenig wenn ich hier den Link zur aktuellen Beta poste. Sollte wirklich großes interesse bestehen so werde ich dieses Wochenende versuchen eine von SharpE unabhängige Test Version zu erstellen.

So, ich hoffe doch mal das ihr mich auch ohne eine Beta Version mit Fragen,Anregungen und Verbesserungsvorschlägen überschüttet :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 27, 2004 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Heute habe ich wieder mal Stunden damit zugebracht um diverse Bugs ausfindig zu machen.
Dabei ist es mir u.a. gelungen zwei Schutzverletzungen beim editieren eines Schemes zu verhindern.

Außerdem habe ich diverse Sicherheitsüberprüfungen für den Fall eingefügt das der User sich an den XML Dateien vergreift und diese unbrauchbar werden. Falls die XML Dateien mit den Einstellungen aus irgendeinem Grund gelöscht wurden wird SharpDesk sie mit Standard Einstellungen komplett neu erstellen.

Desweiteren habe ich viel Arbeit in das Formular Design investiert. Die ListBox welche im Theme Manager die verfübaren Themes anzeigt ist nun durch eine TScollBox ersetzt. So habe ich noch mehr Kontrolle darüber wie der Inhalt gezeichnet wird. Damit bin ich nun auch das verdammte FocusRect losgewurden welches bei der TListBox immer mitgezeichnet wurde.

Eine weitere Verbesserung ist die Tatsache das nun auch das Windows Hintergrundbild an den Hintergrund von SharpDesk angepaßt wird. Es werden neben dem eigentlich Hintergrund auch noch Hintergrundfarbe und die Ausrichtung des Hintergrundbildes passend zum SharpDesk Hintergrund angpaßt. Damit werden Anzeigefehler bei anderen Desktop Programmen welche die PaintDesktop() funktion benutzen verhindert.


Mir ist es außerdem gelungen eine von SharpE unabhängige SharpDesk version zu erzeugen.
Die Beta werde ich vorraussichtlich nächste Woche zum Download bereit stellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Mär 28, 2004 00:46 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Fiji-Fighter war so nett eine zwar einen Tag alte aber immer noch recht aktuelle SharpDesk Version zu hosten. :)

http://www.raen.de/files/sharpdesk.zip
Diese Version sollte unabhängig von SharpE funktionieren. Dauerhaft benutzt werden kann sie jedoch nicht da die Taskleiste von der Anwendung verdeckt wird. Zum ausprobieren und rein schauen reicht es aber denke ich aus.
Die vorhin erwähnten Änderungen sind zum großen Teil in dieser Version noch nicht integriert. Deshalb muß bei der benutzung auf folgendes geachtett werden :
-Namen von Themes dürfen keine Leerzeichen oder andere Sonderzeichen enthalten.
-Beim editieren von Schemes kommt es zu einer Schutzverletzung(Anwendung läuft trotzdem weiter und die Änderung wird beim nächsten neu laden der Scheme Liste anzeigt)
-Windows Hintergrund wird noch nicht der Theme Hintergrundfarbe und Hintergrundbild Ausrichung angepaßt.

Änderungen in der SharpMenu.xml sollten außerdem vorerst unterlassen werden da sich das SharpMenu noch in einer relativ frühen Entwicklungsphase befindet. Der Inhalt des Menüs kann jedoch über die test.rc editiert werden(SharpMenü Pfade,...)

Viel Spaß beim ausprobieren :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 04, 2004 09:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Die letzten Tage habe ich intesiv an einem neuen Desktop Objekt gearbeitet. Dabei raus gekommen ist eine art Button Panel. Über die Objekt Einstellungen stellt sich der User einfach eine Liste mit Anwendungen zusammen. Diese werden dann in einem Panel dargestellt. In etwa so wie die Schnellstartleiste der normalen Taskbar.
Für die Darstellung des ganzen kann der User Farben und Bevel State der Panel seinen wüschen anpassen. Das Button Panel unterstützt natürlich Horizontale und Vertikale Ausrichtung.
Da Bilder mehr als 1000 Worte sagen gibts hier einen Demo Screenshot :
Bild
Der rechte Teil sind die gleichen Panel nur mit Horizontaler Anordnung und einem anderen Desktop Theme.

Hier mal noch ein Screenshot welcher die Objekt Einstellungen Zeigt :
Bild
Das besondere an diesem Desktop Objekt ist das es als erstes Objekt auf die SharpDesk Message "SDM_MOUSE_MOVE" reagiert. Damit wird ein sehr schönes Mouse Hover Highlight der einzelnen Elemente erzeugt.

In der Praktischen Anwendung sieht das bei mir dann in etwa so aus :
Bild


Wenn alles gut geht wird auf dem neuen SharpE cvs Server nächste Woche der Anonyme Zugang aktiviert (Wir benötigen nur noch eine Lizenz für den Source Code). Dann werden die ersten Release Candidate Builds der SharpE Public Beta 5 auch nicht mehr lange auf sich warten lassen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 11, 2004 16:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Es ist dann denke ich mal wieder Zeit für ein paar Neuigkeiten.

Ich hab jetzt einen 'Advanced XML properties dialog' eingebaut. In diesem Fenster werden alle Eigenschaften eines Objekts als Liste angezeigt. Diese können dort einfach editiert und wieder gespeichert werden. Also praktisch für die Fortgeschritten User die genau wissen was sie tun. Somit lassen sich dann letztendlich sämtliche Einstellungen direkt aus den XML Dateien laden und verändern. Das ersparrt dem User das durchsuchen der stellenweise schon recht umfangreichen konfigurationsdatei der Objekte.
Hier noch ein Screenshot :
Bild

Desweiteren habe ich jetzt sogenannte 'Object presets' hinzugefügt. Über das Popupmenü lassen sich jetzt bequem presets für die einzelnen Objekte speichern,laden und löschen. Beim speichern eines neuen presets werde die aktuellen Einstellungen eines Objekt direkt aus den XML Daten extrahiert und unter dem neuen preset gespeichert. So ist es dann Möglich schnell und einfach die selben Einstellungen auf mehrere Objekte zuzuweisen. Damit natürlich nicht die Werte überschrieben werden die bei jedem Objekt zwangsweise unterschiedlich sein sollten(z.B. Dateiname, Verzeichniss oder Laufwerk des Objektes. Es wäre ja ziemlich dämlich wenn dann plötzliche alle File Objekte auf die selbe Datei zeigen) werden nicht zwangsweise alle Einstellungen mit in das preset übernommen. Das Objekt selbst legt beim speichern der Einstellungen über einen Kommentar für jeden XML Eintrag fest ob dieser beim erstellen eines presets mit extrahiert werden soll oder nicht. Es werden damit praktisch nur die Einstellungen die wirklich das aussehen des Objekts bestimmen übernommen.
Sehr prakitsch ist das z.B. für das File Panel Objekt. Das Objekt bietet so verdammt viele unterschiedliche Einstellungen was die Darstellunge betrifft das es absolut Zeitaufwändig ist für alle File Panel jedesmal eine Änderung der Darstellung von Hand anzupassen. Mit den Objekt presets ändert der User das Design von einem File Panel. Nachdem er das ganze dann als preset abgespeichert hat kann er es ohne Probleme für alle Objekte des gleichen typs laden. Damit das auch wirklich schnell von der Hand geht habe ich das ganze komplett in das Objekt Popupmenü integriert. Also keine extrakomplexen Konfigurationsdialoge für etwas eigentlich so einfaches.
Hier noch ein Screenshot :
Bild

Wie auf dem Screenshot noch zu sehen ist habe ich außerdem noch die funktion für 'Lock/Unlock all Objects' hinzugefügt.

Aus dem ersten SharpE PB5 preview build ist leider noch nichts geworden. Auch der cvs Server ist noch nicht online da wir uns immer noch nicht auf eine Lizenz für den Source Code einigen konnten :(

Hier nochmal ein aktueller Screenshot wie mein Desktop aktuell aussieht :
(klicken zum vergrößern)
Bild
Vergleicht man das ganze mit den anderen Screenshots die ich vorher gepostet habe wird denke ich deutlich wie unterschiedlich man sich mit seinen Desktop mit SharpDesk gestalten kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 04, 2004 13:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Auch wenn ich aktuell voll im Abi Streß bin gibts jetzt mal etwas neues.

Am Hauptprogramm hat sich in den letzten Wochen recht wenig verändert. Aktuell bin ich gerade dabei ein wenig das ganze Design zu überarbeiten. Geändert hat sich dafür eine Menge bei den ganzen Desktop Objekten. Die meisten Desktop Objekte besitzen jetzt ein komplett neues Einstellungs Fenster. Außerdem hab ich bei den meisten Objekten hier und da noch kleinere Funktionen hinzugefügt.
Die wichtigste Neuerung ist wahrscheinlich das neue VertPanel Desktop Objekt. Dabei handelt es sich um ein komplett Skinbares (wie übersetzt man 'Skinable' am beste? ;) ) Desktop Objekt. Das komplette aussehen wird dabei über 12 png Bilder bestimmt. Jeweils 3 Bilder für die Bereich der Caption, des eigentlich Items, des Items wenn es Mouse Highlight hat und dem Bereich zum Abschluß des Panels. Über XML wird dabei Schriftart und Breite/Höhe der einzelnen Teile/Bilder festgelegt. Die Skin Einstellungen werden dann komplett aus der Skin.xml Datei geladen.
Aussehen tut das ganze dann in etwa so :
Bild

Und das beste kommt zum Schluß...
Der cvs Server auf dem der komplette SharpE Source Code lagert ist jetzt online. Zugriff darauf gibts über die SharpE Seite bei SourceForge.net
http://sourceforge.net/projects/sharpe
Hier nochmal die Original News dazu :
Zitat:
The CVS is now ready for public consumption, please remember all software on the CVS is currently very beta and does no way represent what quality product PB5 will be...

The files are hosted under the LGPL license, and we will start to use SourceForge a lot more from now on. So feel free to post requests, bugs and comments.

PB4 plugins will be added in the next couple of days, and you can find information of how to view the CVS in the "CVS section".

There will be a binary release in the future weeks, for those who are unable to compile the cvs source code. If you have issues compiling source, post a bug report and we will try to fix the issue pronto (Delphi6+7).

Wer fragen bezülich des cvs Servers oder des Quellcodes hat kann einfach in den Meinungs Thread posten. :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 17, 2004 10:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
So, um diesen Thread hier mal wieder auf den neusten Stand zu bringen gibts ein kleines Update.

Am Desktop selbst hat sich mal wieder nicht viel getan. Aktuell bin ich dabei alle Konfigurationsdialoge komplett zu überarbeiten und ins normale win32 Design umzuwandeln.

Letzte Woche habe ich mit den arbeiten an einer SharpDeskApi.dll begonnen. Diese .dll beinhaltet diverse funktion wie das laden von Png,Jpeg,Bitmap,... Bildern. Die SharpDeskApi.dll macht es dann für andere Entwickler wesentlich leichter Desktop Objekte zu programmieren da sämtliche wichtigen funktionen bereits mit der .dll Datei zur Verfügung gestellt werden.
Außerdem ist in die .dll eine Klasse integriert welche die Einstellungen eines SharpE Themes liest.
Die Benutzung dieser Klasse sieht so aus :
Code:
  1. Theme := TSharpETheme.Create;
  2. Theme.LoadThemeSettings(' theme name ');
  3. Theme.Free
Das ganze dient halt dazu um die Handhabung mit den xml Dateien etwas zu erleichtern. Für die anderen XML Dateien werde ich noch ähnliche Klassen schreiben...

Da der SharpMenu (das Desktop Menü von SharpDesk) Entwickler gerade recht viel an der Uni zu tun hat habe ich auch hier angefangen ein paar Verbesserungen zu Programmieren. Das ganze Beschränkt sich zwar nur auf ein paar Design Verbesserungen, dafür kann sich das neue Design wirklich sehen lassen.
Hier ein Screenshot :
Bild


Auf der SharpE SourceForge Seite wurde letzte Woche außerdem das erste binary build des aktuellen Codes vom cvs Server zum Download bereit gestellt. Dabei handelt es sich nicht um die finale Version, aber zum rein schauen reicht es aus. Wer die alte PB4 Version nicht installiert hat muß jedoch auf SharpBar Plugins verzichten(Aber hier geht es ja um SharpDesk ;) ). Außerdem werden dann noch die Delphi6 runtime packages benötigt.
Hier zu den Downloads :
SourceForge Seite : http://sourceforge.net/projects/sharpe
Delphi 6 runtime packages : (einfach ins SharpE/SharpDesk Verzeichniss kopieren)
http://people.freenet.de/BilliBerserker/Upload/rtl60.bpl
http://people.freenet.de/BilliBerserker/Upload/vcl60.bpl

so, jetzt müßte eigentlich jeder in der Lage sein das ganze mal auszuprobieren :)

Hier nochmal ein Screenshot von meinem aktuellen Desktop :
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 11, 2004 10:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Langsam wirds mal wieder Zeit für ein kleines Update.
Die letzten Wochen habe ich ausschließlich an der Überarbeitung des gesammten GUI's gearbeitet. Ich habe das gesammte SharpE Design raus geschmissen und durch normales Win32 Design ersetzt. Was jetzt noch fehlt ist die Überarbeitung der einzelnen Desktop Objekte damit deren Einstellungsfenster auch ans Win32 Design angepaßt werden.

Natürlich habe ich so nebenbei auch noch diverse echt üble Bugs gefixt (man glaubt gar nicht was so alles lustiges passieren kann ;) ). Außerdem gibts wieder mal ein paar neue Features im eigentlichen Hauptprogramm.

Aber jetzt erstmal eine kleine Screenshot Parade mit Erklärungen.
(Und wie immer gilt, auf Bild klicken für eine große Ansicht ;) )

Folgende Screens stammen vom komplett neuen Create Theme Dialog.
Also das Fenster mit dem die SharpE Themes Konfiguriert werden.
Bild
Als neues Feature habe ich mal den Scale Modus für die Wallpaper Anordnung hinzugefügt. Alle Linux User werden diesen bereits kennen. Bei WinXP sucht man diesesn eigentlich recht nützlichen Modus vergeblichst. Der Scale Modus vergrößert das Wallpaper auf Bildschirmgröße, behält dabei jedoch die Proportionen des Bildes bei (keine Verzerrung).

Bild
Die ganzen Einstellungen für das SharpMenu wurden jetzt komplett in die Themes integriert...

Bild
Auch der SharpMenu Editor ist jetzt fester Bestandteil. Der User kann jetzt diverse Menüs erstellen und editieren. Am Ende wird dann das Menü ausgewählt was mit dem Theme geladen werden soll.

BildBild
Diese beiden Screens zeigen zwei neue Wallpaper Effekte.
Mit dem Gradient Effekt können schnell und einfach Farbverläufe erstell werden. (Die meisten Linux User kennen das sicherlich schon). Besonders ist hierbei das neben Start- und Endfarbe auch noch die Transparenz individuell eingestellt werden kann.
Bei dem zweiten Effekt handelt es sich um einen Scan Line Effekt. Dieser Effekt zeichnet halt Lininen mit den gegebenen Einstellungen auf den Desktop. Eine erklärung der einzelnen Einstellungen spare ich mir jetzt, das sieht man denke ich recht gut auf den Screenshot...
Auf dem letzten Screenshot ist außerdem das Popupmenü zu erkennen mit dem die Farben ausgewählt werden. Klickt ein User auf ein Farbfeld so wird das Popupmenü angezeigt. Hier stehen dann die 6 SharpE Farben zur Verfügung. Ein Klick auf 'Custom Color ... ' zeigt den üblichen Farb Auswahl Dialog an. Das Farbauswahl Popupmenü ist keine eigene Komponente sondern eigentlich nur ein ein normales TPopupmenu mit Owner Draw. Dabei habe ich das ganze jedoch so Programmiert das ich komplett die Sender und Owner variablen benutze so das alle Farbfelder und Items des Popupmenüs die gleichen Proceduren benutzen. Das erspart lästiges Code copieren welcher dann ja eh eigentlich immer nur das selbe machen würde. Aktuell bin ich halt noch am überlegeb ob ich das ganze in eine eigene Komponente Schmeiße oder nicht...



Bild
So sieht der neue Theme Manager jetzt aus. Mehr außer dem Design hat sich hier jedoch nicht geändert.

Bild
Und hier der Auswahldialog beim Hinzufügen eines Desktop Objektes. Die Edit Box unten links dient hierbei als Filter für die in der TListView angezeigten Elemente.

Allgemein bin ich mit dem neuen Design wirklich Zufrieden. Das ganze zeigt mal wieder das man sich vorher Gedanken machen sollte befor man ein alternatives Design einsetzt. So wirkt das ganze jetzt wesentlich Professioneller...


Zum Abschluß nochmal ein Screenshot welcher die Wallpaper Effekte in Aktion zeigt.
(klicken zum vergrößern)
Bild
Der hier dargestellte Hintergrund wird komplett durch die Kombination der Farbverlauf und Scan Line Effekte erzeugt. Das ganze könnte jetzt natürlich noch beliebig auf ein Hintergrundbild drüber geblendet werden... :)


Die Veröffentlichung des zweiten cvs builds ist für heute Abend oder spätestens im Verlauf des Wochenendes geplant. Sobalds soweit ist werde ich hier nochmal posten. Den Quellcode auf dem cvs Server werde ich heute Abend dann auch mal wieder auf den neusten Stand bringen.


Wie es scheint ist es dann mal wieder etwas mehr geworden als ein kleiens Update :wink:
Wer noch Ideen für weitere nützliche Wallpaper Effekte oder andere Anregungen hat kann diese gernen in den Meinungsthread posten :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jun 12, 2004 00:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Wie bereits angekündigt wurde heute Abend/Nacht das nächste cvs build Veröffentlicht. Da ich im vorherigen Post schon alles zu den wichtigsten Neuerungen gesagt habe spare ich mir jetzt große Erklärungen.

Zum etwa 6 MB großen Download gehts hier : http://sourceforge.net/projects/sharpe/

Diesmal handelt es sich um ein Stand Alone Release. Das ganze sollte jetzt bei jedem ohne große Probleme lauffähig sein. Die benötigten Delphi 6 Biblotheken sind diesmal auch direkt beim Download dabei.

Nach dem entpacken erstmal nicht Wild irgendwelche Programme starten. Erstmal die Readme lesen...
Wer nur SharpDesk (worum es hier eigentlich geht) ausprobieren möchte der startet bitte nur die SharpDesk.exe
Wer sich SharpE mal komplett ansehen möchte der startet einfach SharpCore und beantwortet die Frage mit nein(es sei denn ihr wollte es dauerhaft benutzen, aber zum erstmal anschauen einfach nein drücken. Dann wird am System nix geändert und alles ist spätestens nach einem Neustart so wie früher).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 18, 2004 10:31 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Da ich aktuell durch den ganzen Abi "streß" ja so wahnsinnig "viel" zu tun habe gibts heut schon wieder was neues ;)

Die letzten Tage hatte ich mal wieder ein wenig mit Linux rumgespielt,
dabei ist mir auch glatt wieder etwas praktische aufgefallen...
Es ist nun möglich Icon Sets zu definieren. Am Anfang kommen natürlich ein paar standard icons mit, aber der User kann sich später natürlich weitere aus dem Netz laden. Jedem Theme wird ein Icon set zugewiesen welches dann von allen desktop Objekten benutzt wird (insofern sie die standart icons benutzen). Praktisch wird der spaß dann dadurch das sie die Icons automatisch ändern sobald man dem Theme ein anderes Icon Set zuweißt.
Zur Verwaltung der Icons bekommt jedes Icon Set ein eigens Verzeichniss und eine XML Datei in der die Icons definiert werden. In der XML Datei sind die benötigten Icon Typen/Namen definiert. Also z.B. icon.drive.cdrom, icon.drive.network, icon.folder.mypictures, etc. . Jedem Icon wird dann die .ico Datei zugeordnet und die Anwendung bzw. die Objekte müssen dann einfach nur die XML Datei laden. Die Objekte die die Standard Icons benutzen geben speichern als Icon Pfad dann einfach die Icon Namen ab. Also icon.drive.cdrom, icon.folder.mypictures , etc. .Alle verfügbaren Icons werden in der Form 'IconName=IconPfad' in eine StringListe geladen so das das desktop object nur überprüfen muß ob der gespeicherte Icon Name in der StringListe ist oder nicht.
Um die Handhabung davon zu vereinfachen hab ich das ganze auch gleich in die SharpDeskApi.dll ausgelagert so das sich ein entwickler mit dem XML laden nicht herum plagen muß.
Anfangs wollte ich einfach nur die TStringList als Parameter zurück geben, aber das gibt mit einer dll Datei nur Probleme. Damit jemand der das hier ließt vielleicht auch etwas lernt hier mal der recht einfach Code wie man am besten eine TStringList mit einer dll benutzt.

Code:
  1. function GetIconList : PChar;
  2. var
  3.    SList : TStringList;
  4. begin
  5.      SList := TStringList.create;
  6.      {List mit Inhalt füllen}
  7.      Result := AllocMem(Length(SList.CommaText) + 1);
  8.      StrPCopy(Result, SList.CommaText);
  9.      SList.free
  10. end;

zusätzlich muß in der dll Datei noch eine funktion exportiert werden welche dann den PChar buffer wieder frei gibt.
Code:
  1. procedure releasebuffer(p : pChar);
  2. begin
  3.      FreeMem(p);
  4. end;

In der Anwendung wo man die TStringList benötigt wird das ganze dann umgekehrt gemacht
Code:
  1.          
  2. var
  3.    p : PChar;
  4.    IconList : TStringList
  5. begin
  6.      IconList := TStringList.Create;
  7.      p := GetIconList;
  8.      IconList.CommaText := p;
  9.      releasebuffer(p);
  10.      {...}
  11. end;

Ist vielleicht etwas umständlich,
aber TStringList'en sind finde ich verdammt praktisch, und so kann man sie auch mit dll Dateien nutzen :)

Jetzt gibts wie immer noch zwei Screenshots(klicken zum vergrößern)
Bild
Hierzu muß ich eigentlich nicht viel sagen, der Screenshot sollte alles erklären...


Bild
So sieht dann das neue Einstellungsfenster für die Desktop Objekte aus. Hier kann man dann bequem das Icon auswählen. Alternativ kann auch noch ein .png oder .ico bild geladen werden. Ein weiteres neues Feature ist das laden des passenden Shell Icons. Das ist recht nützlich da ich jetzt das FileObject und das Folder Objekt in ein Desktop Objekt zusammengelegt habe. Das neue Desktop Objekt ist in der Lage links zu allen Dateien auf dem Desktop zu erzeugen. Also Verzeichnisse, .exe Dateien aber auch sämtlichen anderen Dateien, wie .txt, .mp3, etc. Beim doppel click wird jetzt der SharpCore exec service benutzt welcher dann Automatisch das zu startende Programm raus sucht. Wieder etwas worum sich der Desktop Objekt Entwickler nicht kümmern braucht :)
Die WinAPI funktion zum laden des Shell Icons ist vielleicht noch recht interessant.
Hier der Code dafür

Code:
  1. var
  2.    ImageListHandle: THandle;
  3.    dicon : TIcon;
  4.    FileInfo : SHFILEINFO;
  5. begin
  6.      ImageListHandle := SHGetFileInfo( pChar(FileName), 0, FileInfo, sizeof( SHFILEINFO ),
  7.                           SHGFI_ICON or SHGFI_SHELLICONSIZE);
  8.      dicon := TIcon.Create;
  9.      dicon.Handle := FileInfo.hIcon;
  10.      {Irgendwas mit dem TIcon machen, z.B. in ein TImage zeichnen, etc.)
  11.      dIcon.ReleaseHandle;
  12.      FreeAndNil(dIcon);
  13.      DestroyIcon(FileInfo.hIcon);
  14.      ImageList_Destroy(ImageListHandle);
  15.      {Die ImageList_Destroy funktion ist in der Unit Commctrl definiert}
  16. end;

Vielleicht ists für den ein oder anderen recht hilfreich...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jul 09, 2004 11:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Es ist denke ich mal wieder Zeit für ein kleines Update.

So richtig viel sichtbares hat sich seit der letzten News noch nicht verändert. Ich habe mal genauer überprüft woran es liegt das SharpDesk stellenweise so verdammt langsam ist. Anfangs habe ich es immer auf die TBitmap32 Layers geschoben. Dies ist jedoch wie ich nun festgestellt habe nicht der einzige Grund. Wenn man sich mit der Zeit ein paar unterschiedliche Themes mit unterschiedlichen Desktop Objekten erstellt hat dann kann es durchaus passieren das die XML Dateien recht groß werden. Die größe liegt zwar meistens immer noch unter 100kb, jedoch muß halt bedacht werden das TJvSimpleXML die Dateien jedesmal laden, parsen und interpretieren muß. Bisher hatte ich den kompletten Zugriff auf die XML Dateien so gestaltet das ich immer bei bedarf ein TJvSimpleXML objekt erstellt und benutzt habe. Logischerweise braucht das bei XML Dateien die größer als 10kb sind dementsprechend lange wenn immer und immer wieder die XML Datei geladen werden muß. Deshalb habe ich die letzten Wochen damit zugebracht den kompletten Code zu überarbeiten und sämtliche Einstellungen in Klassen auszulagern. Somit werden alle 3 XML Dateien (Themes, Objekte, SharpDesk Setting) einmal beim start der Anwendung geladen. Für Themes und SharpDesk settings habe ich die Klasse gleich so angelegt das die ganzen Einstellungen direkt in Variablen geladen werden. Um vielleicht nochmal die Dimension der Themes zu verdeutlichen, die TSharpETheme Klasse hat über 50 variablen/Einstellungen. Da die Einstellungen der Desktop Objekte ja dynamisch sind habe ich es hier dabei belassen eine TJvSimplXML variable zu nutzen welche beim start der Anwendung initialisiert wird. Damit auch alle Desktop Objekte (dll Dateien) auf die Settings Klassen zugreifen können habe ich eine optionale funktion hinzugefügt mit der sich ein Desktop Objekt die 3 Klassen hohlen kann. Optional heißt hier das SharpDesk die Settings sendet falls die entsprechende funktion vom Desktop Objekt exportiert wird. Das ganze umsteigen auf settings Klassen hat wie sich sicherlich jeder denken kann eine ganze Weile gedauert da ich den kompletten Source Code übarbeiten mußte. Im Zuge der kompletten überarbeitung muß ich jetzt noch alle Desktop Objekte auf das neue Klassen system umstellen. Und wenn ich schon einmal dabei bin werde ich auch die Einstellungs Fenster aller Desktop Objekte überarbeiten und auf ein einheitliches Design bringen. Das neue Design aller Desktop Objekte wird dann ungefähr so sein wie bei dem Screenshot aus dem vorherigen Beitrag. Beim letzten Desktop Objekt welches ich übararbeitet habe hatte ich mal ein wenig auf die Uhr geschaut, insgesammt hat das komplette überarbeiten des Einstellungs Fensters und das umstellen auf die Settings Klassen ungefähr 3 Stunden gedauert. 2 Desktop Objekte sind inzwichen fertig und die nächsten muß ich dann am Wochenende machen. Weiterhin habe ich im Zuge der Umstellung auf die Settings Klassen gleich noch ein wenig an der Strucktur der XML Datei für die Themes gearbeitet. Nun sind auch Theme Namen mit Sonderzeichen möglich. Außerdem ist es mir endlich gelungen das Clonen und nach vorne/hinten bewegen von Desktop Objekten wieder zum laufen zu bringen.
Mit der Umstellung auf die Settings Klassen und dem damit verbundenem einmaligen laden der XML Dateien konnte ich einen gigantischen Geschwindigkeitszuwachs erreichen. Wo das Laden eines Themes vorher ab und zu auch mal 10 sekunden dauern konte (zumindest bei mir), so geht das ganze jetzt in 2 sekunden :)
Wann es eine neue Version zum Download gibt kann ich jetzt noch nicht sagen,
jedoch arbeite ich aktuell an einem SharpE Preview für Shell Shocked Issue 9(News und Artikel aus der Shell Scene, erscheint aller paar Monate) welches in den nächsten 2 Wochen veröffentlich wird. Mein Ziel ist es die nächste SharpDesk Version bis dahin fertig zu bekommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Jul 19, 2004 17:27 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Heute ist das Shell Shocked Issue #9 erschienen. Das ist so eine Art zusammenfassung von dem was in den letzten Monaten so in der Shell Scene passiert ist. Für diese Ausgabe habe ich jedoch ein SharpE PB5 Preview geschrieben. Darin gibts neben Infos zu SharpDesk auch ne Zusammenfassung über SharpE.
Shell Shocked Issue #9 : http://shell-shocked.org/9.php
SharpE PB5 Preview : http://shell-shocked.org/article.php?id=292
Leider haben wir das nächste cvs release von PB5 noch nicht ganz fertig.
Mit PB5 0.0.0.3 darf jedoch in den nächsten Tagen gerechnett werden :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 04, 2004 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Wird mal wieder Zeit für ein paar News,
richtig viel geändert hat sich in der letzten Zeit eigentlich nichts. Die überarbeitung der meisten Desktop Objekte ist abgeschlossen und hier und da wurde ne ganze menge Bugs gefixt. Ich hab die letzten Tage auch mehr an ein paar Core services gecoded als an SharpDesk selbst ;)

Aber eine News wäre ja ziemlich sinnlos wenns nicht wenigstens etwas brauchbares zu berichten gäbe.
Gestern Nacht wurde die nächste SharpE 0.0.0.3 preview Version released.
Zu finde wie immer auf unserer Source Forge Projekt Seite.
http://sourceforge.net/projects/sharpe/
Der Thread dazu im Lowdimension.net Forum : http://www.lowdimension.net/phpBB2/viewtopic.php?t=177

Der Source Code auf dem cvs server sollte nun auch wieder ganz ganz aktuell sein ;)

Damit hier aber auch ein wenig zum Release im Forum steht hier mal das Changelog mit den wichtigsten Änderungen :
Zitat:
SharpDesk
Multiple selection of objects, including cloning and deleting
Redesign of all interfaces using old SharpE style
Desktop layering fully implemented
Many bugs fixed
Speed improvement by over 300%
Icon sets + default icons useable with all objects
Many improvements and optimizations for the whole theme engine
The settings windows of all desktop objects are completely rewritten

SharpCore
Dynamic Actions (Bang functionality)
Interface redesign
Hotkeys service with implemented Action functionality
Prism service, 1st release, and very beta
Ability to set shell back to Explorer, and change config options
E-Mail monitoring service

SharpVWM
Converted to XML Settings
Minor visual changes
Source now available

SharpTask
Converted to XML Settings
Minor visual changes

SharpConsole
First release of the new SharpConsole, which displays all debugging information for SharpE components!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Aug 25, 2004 17:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Nach ner ganzen Weile gibts von mir auch mal wieder ein kleines Update.
Sehr viel sichtbares hat sich bis jetzt noch nicht geändert.
Aktuell bastel ich an Icon Shatten und themebare standard Einstellungen für alle Objekte. Das soll heißen das Einstellungen wie Color und Alpha Blending direkt im Theme definiert werden und der User dann die Wahl hat ob ein desktop Objekt diese Standard Einstellungen benutzen soll. Wenn die Objekte diese Theme Einstellungen benutzen dann können ziemlich leicht die ganzen Einstellungen(Alpha und Color Blending) auf alle Objekte angewendet werden indem einfach die Einstellungen im Theme editiert werden.
Die Icon Schatten stellen sich als ein ziemlich harter Brocken da. Es ist nicht gerade einfach einen neuen Schatten mit dem festen Schatten vieler XP Icons zu komibinieren. Inzwischen hab ich es soweit gelöst das zuerst sämtlicher Schatten aus den Icons extrahiert wird. Dann wird der neue Schatten gezeichnett und mit dem Original Schatten kominiert.
Das resultat sollte bei 99% aller Icons ein gutes Ergebniss erziehlen.
Hier ein Screenshot wie es im Theme Editor aussieht :
Bild


Da das Projekt inzwischen ziemlich umfangreich geworden ist will ich jetzt einfach einen Überblick über den Code Umfang geben.
Die eigentliche Hauptanwendung (SharpDesk.exe - ohne SharpMenu) besteht aus 11 Formularen und 5 weiteren Units für diverse Klassen und Funktionen.
Insgesammt macht das nur für die Hauptanwendung rund 8000 Zeilen Quellcode.
Wobei hier wieder wirklich klassisch ist das das Design des User Iterfaces mit auf aufwändigsten ist.
Allein das Formular zum erstellen und editieren der Themes umfaßt 3000 Zeilen Quellcode.
Dazu kommen dann nochmal durchschnittliche 250 Zeilen Basiscode für jedes desktop objekt (interne verwaltung und Kommunikation mit SharpDesk) sowie rund 800 Zeilen Code für das erstellen und anpassen des Desktop Layers(zeichnen, etc.). Und auch die Einstellungsfenster von jedem Desktop Objekt schlucken im Durchschnitt 1000 Zeilen Quellcode. Das macht dann grob gerundet 2000 Zeilen Quellcode pro Desktop Objekt (Und dabei gibt es schon eine zentrale Api dll Datei mit Grafik funktionen welche von allen desktop objekten genutzt werden). Bei 5 Desktop Objekten sind das dann 10000 Zeilen Quellcode.
Also insgesammt grob rerundet 18000 bis 20000 Zeilen Quellcode.
Die Programmierdauer liegt jetzt bei 8 Monaten (hab Ende Dezember 2003 angefangen)

Um vielleicht noch die Dimension allein der Themes zu verdeutlichen,
hier einfach die Klasse welche die Theme Informationen speichert :
Code:
  1.     TSharpETheme = class
  2.                    private
  3.                    public
  4.                      DeskDisplayCaption      : Boolean;
  5.                      DeskTextShadow          : Boolean;
  6.                      DeskUseIconShadow       : Boolean;
  7.                      MenuGradientBanner      : Boolean;
  8.                      MenuShowGradientCaption : Boolean;
  9.                      MenuDropShadow          : Boolean;
  10.                      MenuTitles              : Boolean;
  11.                      MenuIcons               : Boolean;
  12.                      DeskIconShadow          : integer;
  13.                      DeskAlphaBlend          : integer;
  14.                      DeskColorBlend          : integer;
  15.                      ThemeID                 : integer;
  16.                      ObjectSetID             : Integer;
  17.                      ColorBlend              : integer;
  18.                      ColorBlendValue         : integer;
  19.                      BrightnessBalance       : Integer;
  20.                      ShadowAlpha             : Integer;
  21.                      GradientStart           : integer;
  22.                      GradientEnd             : integer;
  23.                      GradientStartAlpha      : integer;
  24.                      GradientEndAlpha        : integer;
  25.                      GradientType            : integer;
  26.                      ScanLineStart           : integer;
  27.                      ScanLineEnd             : integer;
  28.                      ScanLineStartAlpha      : integer;
  29.                      ScanLineEndAlpha        : integer;
  30.                      ScanLineThickness       : integer;
  31.                      ScanLineSpacing         : integer;
  32.                      ScanLineType            : integer;
  33.                      MenuOpacity             : integer;
  34.                      MenuGradientStart       : integer;
  35.                      MenuGradientEnd         : integer;
  36.                      MenuSelectedColor       : integer;
  37.                      MenuSelectedBorderColor : integer;
  38.                      TextFont                : TFont;
  39.                      MenuTitleFont           : TFont;
  40.                      MenuFont                : TFont;
  41.                      Description             : String;
  42.                      Name                    : String;
  43.                      Wallpaper               : String;
  44.                      IconSet                 : String;
  45.                      MenuFile                : String;
  46.                      MenuGradientCaption     : String;
  47.                      ShadowColor             : TColor;
  48.                      BackgroundColor         : TColor;
  49.                      Scheme                  : TColorScheme;
  50.                      DeskColorBlendColor     : TColor;
  51.                      DeskIconShadowColor     : TColor;                                
  52.                      WallpaperAlign          : TWallpaperAlign;
  53.                      constructor Create;
  54.                      destructor Destroy;
  55.                      procedure Assing(pTheme : TSharpETheme);
  56.                    published
  57.                    end;

Das ganze muß jeweils irgendwie im User Interface vorhanden sein so das alles vom User bequem eingestellt werden kann. Da versteht dann sicherlich jeder wie die 3000 Zeilen Quellcode für den Theme Manager zu stande kommen.

So, das sollte jetzt einfach mal ein kleiner Einblick in die Dimension des Projekts sein :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Sep 10, 2004 20:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jun 24, 2003 19:09
Beiträge: 732
Und mal wieder was neues von mir :)
In den letzten Tagen war ich damit beschäftigt das Menü und die Theme Verwaltung in externe Anwendungen auszulagern.
Ab jetzt gibt es eine SharpTheme und SharpMenu Anwendung. Kommunizieren tuen die Anwendungen komplett über Window Messages. Die Konvertierung des kompletten Theme systems in eine eigene Anwendung war kein Problem.
An SharpMenu bin ich jedoch fast verzweifelt.
Das Menü sollte also nun eine externe Anwendunge sein. Sendet man eine bestimmte WM an die Anwendung so wird das Menü bei den über lparam und wparam angegebenen Parametern angezeigt. Das war auch soweit kein Problem. Nun wollte ich es natürlich so machen das das Menü zugeklappt wird sobald die SharpMenu Anwendung den Focus verliert. Also "einfach" in OnDeactivate. Dazu muß gesagt werden das die SharpMenu Anwendung permanent im Hintergrund mitläuft (auch wenn nichts angezeigt wird) damit nicht bei jedem Menü aufruf das ganze Menü neu aufgebaut werden muß. Mit normalen Methoden war es jedoch nicht möglich das Menü dazu zu bringen das OnDeactivate wirklich gut funktioniert hat. Problem war das die Anwendung deaktiviert bliebt sobald sie einmal deaktiviert wurde. Sollte das Menü ein weiteres mal angezeigt werden so wurde zwar das Formular angezeigt, aber die Anwendung erhielt nicht den Focus bzw. wurde nicht aktiviert. Das hatte zur Folge das OnDeactivate nicht mehr aufgerufen wurde. Nachdem ich mich mehrere Stunden mit diversen WinAPI funktionen probiert hatte um die Anwendung beim aufpoppen des Menüs in den Vordergrund zu bringen (siehe SetForegroudWindow(), ShowWindow(), etc. ) war ich schon fast am Verzweifeln. Mit keiner Delphi oder WinAPI funktion ist es möglich einer anderen Anwendung den Focus zu geben. Hierbei rede ich noch von einem Fenster, sondern von der Anwendung selbst. Ich mußte also irgendwie den Status herstellen wie es wäre wenn der User in ein Formular rein klickt. Dies ist jedoch ein Windows internes Problem, es wird nämlich verhindert das man den Focus einfach so auf eine andere Anwendung übertragen kann wenn eine andere Anwendung bereits den Eingabe Focus besitzt. Vom Prinzip eine Sperre in windows selbst.
Und nun komme ich mit diesem Post gleich mal zu einer funktion die vielleicht für den ein oder anderen sehr interessant sein könnte. Nachdem ich eine ganze Weile im Netz gesucht habe bin ich auf eine funktion gefunden welche diese blockade von windows umgeht. Das wirklich krasse daran ist das die Anwendung den absoluten Focus erhählt und ganze nach vorne gebracht wird. Das hat sogar zur Folge das die Anwendung über dem Task Manager postiert wird. Eine solche funktion ist sicherlich für die ein oder anderen Programm ziemlich sinnvoll.
Hier der Code (habe ich auf www.delphi-forum.de gefunden)
Code:
  1. function ForceForegroundWindow(hwnd: THandle): Boolean;
  2. const  
  3.   SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;  
  4.   SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;  
  5. var  
  6.   ForegroundThreadID: DWORD;  
  7.   ThisThreadID: DWORD;  
  8.   timeout: DWORD;  
  9. begin  
  10.   if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);  
  11.  
  12.  
  13.   if GetForegroundWindow = hwnd then Result := True  
  14.   else  
  15.   begin  
  16.     // Windows 98/2000 doesn't want to foreground a window when some other  
  17.     // window has keyboard focus  
  18.  
  19.     if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or  
  20.       ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and  
  21.       ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and  
  22.       (Win32MinorVersion > 0)))) then  
  23.     begin  
  24.       // Code from Karl E. Peterson, www.mvps.org/vb/sample.htm  
  25.       // Converted to Delphi by Ray Lischner  
  26.       // Published in The Delphi Magazine 55, page 16  
  27.  
  28.       Result := False;  
  29.       ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);  
  30.       ThisThreadID := GetWindowThreadPRocessId(hwnd, nil);  
  31.       if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then  
  32.       begin  
  33.         BringWindowToTop(hwnd); // IE 5.5 related hack  
  34.         SetForegroundWindow(hwnd);  
  35.         AttachThreadInput(ThisThreadID, ForegroundThreadID, False);  
  36.         Result := (GetForegroundWindow = hwnd);  
  37.       end;  
  38.       if not Result then  
  39.       begin  
  40.         // Code by Daniel P. Stasinski  
  41.         SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);  
  42.         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),  
  43.           SPIF_SENDCHANGE);  
  44.         BringWindowToTop(hwnd); // IE 5.5 related hack  
  45.         SetForegroundWindow(hWnd);  
  46.         SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);  
  47.       end;  
  48.     end  
  49.     else  
  50.     begin  
  51.       BringWindowToTop(hwnd); // IE 5.5 related hack  
  52.       SetForegroundWindow(hwnd);  
  53.     end;  
  54.  
  55.  
  56.     Result := (GetForegroundWindow = hwnd);  
  57.   end;  
  58. end; { ForceForegroundWindow }
  59.  

Wie jeder sicherlich sieht ist das etwas komplexer als ein einfacher API aufruf ;)


Außerdem habe ich mich mit dem alseitz bekannten Problem der Speicher Verwaltung von Delphi befaßt.
Wie allgemein bekannt ist gibt Delphi Formulare erst wirklich frei wenn die Anwendung beendet wird. Ansonsten bleiben selbst nach dem aufruf von TForm.Free noch reste im Speicher(die bei bedarf wieder verwendet werden). Mein Problem war nun das bei SharpMenu im dynamischen Startmenü ständig neue Formulare erzeugt wurden und beim neu laden des Menüs sogar nochmal alle Formulare neu geladen wurde. Die alten wurden zwar schön freigegeben, reste blieben aber lustig im Speicher und wurden nicht wiederverwendet da die neuen Menüs alle komplett neu erzeugt wurde (MenuForm := TForm.Create...);
So entstand ein richtig häßliches memory leak ...
Zuerst hatte ich nach möglichkeiten gesucht um den Speicher eines Formulars komplett freizugeben. Diese möglichkeit besteht jedoch nur wenn man einen anderen Speichermanager verwendet oder wenn man den VCL Code editiert. Da mir dies jedoch zu umständlich ist habe ich einen einfacheren weg gewählt. Jetzt werden alle Menü Formulare in ein dynamisches array geladen. Werden mehr menüs gebraucht als geladen sind wird das array einfach erweitert. Vorteil ist nun das die ganzen Menüs im array als benutzt und unbenutzt markiert sind. Wird ein neues menü benötigt wird erstmal das array durchgegangen und das nächstbeste unbenutzt Menü wird benutzt. So wird zwar eine recht hohe Anzahl an Formularen erstellt, jedoch werden diese immer wieder verwendet. Damit ist das mem leak größtenteils eingeschränkt :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Sonstiges » Projekte


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 22 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.118s | 17 Queries | GZIP : On ]