Entwickler-Ecke

Open Source Projekte - FastColors v1.2


Christian V. - Do 23.07.09 23:57
Titel: FastColors v1.2
Wer häufig mit CSS Stylesheets arbeitet kennt das sicher. Man will irgendwas ändern doch die alle dazu benötigten Farbcodes sind leider nur als dumme Pixel verschlüsselt auf dem Bildschirm zu finden. Um dem abzuhelfen, ist dieses Tool entstanden. Damit kann man den Farbcode des Pixels, der sich gerade unter dem Mauszeiger befindet, schnell in die Zwischenablage kopieren.

Features:

Hotkeys:


Delete - Fr 24.07.09 03:59

- Nachträglich durch die Entwickler-Ecke gelöscht -


Webo - Fr 24.07.09 09:09

Das ist ja mal ne richtig coole Idee ;-) Gefällt mir richtig gut und kann ich zudem noch dringend gebrauchen. Beim Webseiten erstellen, weiss ich nämlich nie, welche Farbe das jetzt ist, die ich haben möchte, aber das hat ja jetzt ein Ende. Vielen Dank ;-)


Grüße

Webo


Christian V. - Fr 24.07.09 09:33

Freut micht, dass es euch gefällt.
Falls ihr noch Ideen habt: Nur her damit :D


Narses - Fr 24.07.09 10:25

Moin!

Ja, nette Idee. :zustimm: Ich fände es interessant, statt einer einheitlich gefärbten Fläche einen stark vergrößerten Ausschnitt (zusätzlich?) einzublenden - erleichtert die "Navigation". ;)

Noch was technisches:cu
Narses


Jakob_Ullmann - Sa 25.07.09 11:36

Sehr nützlich das Tool! Sowas hatte ich mir schon immer mal gewünscht, allerdings hatte ich keinen wirklichen Ansatz. Eine Anregung: das Format $BBGGRR wäre noch ganz nett. :wink:


jaenicke - Sa 25.07.09 12:04

Ja das funktioniert ja sehr gut. :zustimm:

Eine kleine Änderung fände ich sinnvoll: Wenn das Tool (ggf. per ComboBox einstellbar oder so) StayOnTop bliebe. Denn genau das fehlt mir, wenn ich die Webseiten zusammen baue manchmal. Die reine Farbauswahl ist in den Webdesignern ja vermutlich überall auch drin (zumindest bei dem von MS, den ich nutze). Wenn ich aber zuerst irgendwo hinklicken muss, damit eine Farbe sichtbar ist, dann klappt das da nicht. Bei diesem Tool hier geht es, aber dass das Tool selbst dabei verschwindet, ist nicht so schön.

Die bereits genannte Vergrößerung (die sich idealerweise zusammen mit dem Programmfenster automatisch in die der Maus entgegenliegende Bildschirmseite bewegen könnte bis man die Taste drückt) wäre auch sehr interessant.

Und dann wäre noch eine History oder so gut. Also dass man einfach mehrere Farben hintereinander auswählt und die dann als Liste bekommt.

(Wenn ich Zeit hätte, könnte ich da auch selbst einfach mal etwas ändern und als Vorschlag posten, die habe ich aber im Moment nicht. ;-))


Christian V. - Sa 25.07.09 19:57

Vielen Dank für's Feedback. Habe die Vorschläge mal so gut es ging implementiert.

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Ich fände es interessant, statt einer einheitlich gefärbten Fläche einen stark vergrößerten Ausschnitt (zusätzlich?) einzublenden - erleichtert die "Navigation". ;)

Jetzt sieht man 5*5 Pixel, 35 fach vergrössert. Habe dafür die Vorschau quadratisch gemacht.
Der Pixel in der Mitte dient als Quelle für den Farbwert.


user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Noch was technisches:[list]Du wirst die Unit "Variants" vermutlich nicht brauchen, also raus aus den Uses. ;)

Danke, dass du dir den Source so genau angeschaut hast. Auch über weitere Begutachtungen würde ich mich freuen :D

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Dein Header stimmt wohl nicht ganz: "// HexToBin - converts hex string to binary - (C) 2009 by Christian Vonrüti"

:tongue:
Naja, jetzt steht da wenigstens FastColors, die Beschreibung ist aber noch gleich :autsch:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Du erstellst jedes mal im Hotkey-Handler eine eigene Instanz von TClipboard - das ist nicht notwendig, nimm einfach die, die schon in der Unit verwaltet wird (einfach nur Clipboard.AsText := edtHexOut.Text; schreiben, fertig).

Done

user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Du verwendest einen Timer, um die aktuelle Farbe zu lesen. Das ist sicher simpel und tut, was es soll - aber elegant ist was anderes. :| Hier sollte nur dann CPU-Zeit verbraten werden, wenn sich die Maus auch bewegt hat. :idea:

Wie könnte ich es denn sonst machen? onMouseMove bezieht sich ja nur auf das Form.
Und laut msdn muss ich für SetWindowsHookEx den zuständigen Code extra in ne DLL packen, damit das Systemweit funktioniert. Gibt's da noch alternativen?


user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Eine Anregung: das Format $BBGGRR wäre noch ganz nett. :wink:

Gibt's jetzt auch.


user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ja das funktioniert ja sehr gut. :zustimm:

Eine kleine Änderung fände ich sinnvoll: Wenn das Tool (ggf. per ComboBox einstellbar oder so) StayOnTop bliebe. Denn genau das fehlt mir, wenn ich die Webseiten zusammen baue manchmal. Die reine Farbauswahl ist in den Webdesignern ja vermutlich überall auch drin (zumindest bei dem von MS, den ich nutze). Wenn ich aber zuerst irgendwo hinklicken muss, damit eine Farbe sichtbar ist, dann klappt das da nicht. Bei diesem Tool hier geht es, aber dass das Tool selbst dabei verschwindet, ist nicht so schön.

CheckBox vielleicht? Ich habe jedenfalls ganz frech ohne zu fragen so eine genommen :D


user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die bereits genannte Vergrößerung (die sich idealerweise zusammen mit dem Programmfenster automatisch in die der Maus entgegenliegende Bildschirmseite bewegen könnte bis man die Taste drückt) wäre auch sehr interessant.

Wie stellst du dir das genau vor? Wenn sich das Fenster automatisch umpositionieren würde, könnte man ja nicht mehr die Buttons anklicken (mal davon abgesehen, dass man die wichtigen auch per HotKeys bedienen kann(History mit <, nicht > (bin doch zu faul für Shift xD))

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Und dann wäre noch eine History oder so gut. Also dass man einfach mehrere Farben hintereinander auswählt und die dann als Liste bekommt.

Ich habe das als Popupmenü mit 10 Einträgen implementiert inklusive Icon als Farbvorschau.
Die Farbwerte werden unabhängig vom Format, welches zur Zeit der Ablage in der History eingestellt ist, gespeichert. Deshalb werden alle Historyeinträge im momentan eingestellten Format angezeigt. (ja, das wollte ich so, auch wenn die Formulierung Anderes vermuten liesse :D)

Dann hab ich noch eine Highlight-Funktion hinzugefügt. Die kann man über [Ctrl]+[Win]+[H] ein- und ausschalten. Sie zeichnet einen Rahmen um den mittleren Farbblock. Der Rahmen ist weiss, wenn die darin eingeschlossene Farbe dunkel ist(Helligkeit <= 128), und sonst weiss.


jaenicke - Sa 25.07.09 21:36

user profile iconChristian V. hat folgendes geschrieben Zum zitierten Posting springen:
CheckBox vielleicht? Ich habe jedenfalls ganz frech ohne zu fragen so eine genommen :D
Oops, ja, da hatte ich mich vertippt. :D

user profile iconChristian V. hat folgendes geschrieben Zum zitierten Posting springen:
Wie stellst du dir das genau vor? Wenn sich das Fenster automatisch umpositionieren würde, könnte man ja nicht mehr die Buttons anklicken (mal davon abgesehen, dass man die wichtigen auch per HotKeys bedienen kann(History mit <, nicht > (bin doch zu faul für Shift xD))
Dann könnte die Vorschau separat angezeigt werden, denn die sollte ja außerhalb der Mausposition liegen. Das ginge auch.

Ja, ich hatte jetzt so an die übliche Umsetzung in Webdesigntools gedacht. Also erst aktivieren und dann bis zur Farbauswahl für einige Sekunden oder so auch dem Mauszeiger ausweichen. Aber das ist schon nicht so einfach, ja. :gruebel:
Es ist wohl wirklich am besten entweder einfach die Vorschau separat anzuzeigen oder alles stationär zu lassen, man kann das Fenster ja manuell sinnvoll positionieren. :D


Christian V. - Mo 27.07.09 15:08

Ich denke, dass ich die Positionierung manuell lasse.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ja, ich hatte jetzt so an die übliche Umsetzung in Webdesigntools gedacht. Also erst aktivieren und dann bis zur Farbauswahl für einige Sekunden oder so auch dem Mauszeiger ausweichen. Aber das ist schon nicht so einfach, ja. :gruebel:
Es ist wohl wirklich am besten entweder einfach die Vorschau separat anzuzeigen oder alles stationär zu lassen, man kann das Fenster ja manuell sinnvoll positionieren. :D


Ah, ich verstehe was du meinst. Ich denke allerdings nicht, dass ich das implementieren werde. Ich hatte mir eher gedacht, dass das Tool immer im Hintergrund bzw Vordergrund läuft und so schnell die Farbcodes in die zwischenablage bringt.

Sonst noch Ideen?


Narses - Mo 27.07.09 16:00

Moin!

user profile iconChristian V. hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Du verwendest einen Timer, um die aktuelle Farbe zu lesen. Das ist sicher simpel und tut, was es soll - aber elegant ist was anderes. :| Hier sollte nur dann CPU-Zeit verbraten werden, wenn sich die Maus auch bewegt hat. :idea:

Wie könnte ich es denn sonst machen? onMouseMove bezieht sich ja nur auf das Form.
Also wenn schon der Timer-Ansatz, dann mit einer deutlich geringeren Frequenz (deine aktuellen 100ms halte ich für zu schnell, ich denke >=250ms wäre angemessen; mach´s halt notfalls einstellbar) und mit einer Prüfung auf veränderte Maus-Koordinaten, nicht jedes mal den kompletten Code redundant ausführen (gab ja ggfs. gar keine Änderung). :idea:

user profile iconChristian V. hat folgendes geschrieben Zum zitierten Posting springen:
Und laut msdn muss ich für SetWindowsHookEx den zuständigen Code extra in ne DLL packen, damit das Systemweit funktioniert. Gibt's da noch alternativen?
Nein, hier gibt es AFAIK keine Alternative zum "vernünftigen" Ansatz. Es gibt allerdings Tricks, um eine DLL aus dem RAM zu laden (user profile iconLuckie hatte da glaub ich mal einen Code-Schnipsel zu), diese DLL dann mit in die Ressource, fertig. 8) Hört sich zugegeben heftig an, wäre aber die optimale Lösung. :zustimm:

cu
Narses


Narses - Di 28.07.09 02:36

Moin!

Schau dir doch mal den Source-Code hier [http://www.delphi-forum.de/viewtopic.php?t=93892] an, insbesondere

Delphi-Quelltext
1:
function Luminance(const AColor: TColor): Byte;                    
(berechnet den Grauwert = Helligkeit einer Farbe, du hast den Durchschnitt der RGB-Werte genommen, das ist für eine Hell/Dunkel-Unterscheidung nicht korrekt (in diesem Fall aber wahrscheinlich egal)) und

Delphi-Quelltext
1:
function FormatColor(const AColor: TColor; const FormatString: String): String;                    
(damit kann man eine Farbe über einen Formatierungs-String umwandeln, so hat man deutlich mehr Freiheiten beim Ausgabeformat; dabei steht %R / %G / %B für den Farbwert als 2-stellige Hex-Zahl und %r / %g / %b für den Farbwert als 1..3-stellige Dez-Zahl). :idea: ;)

cu
Narses