TColorButton, Farbtabellenauswahl unterdrücken

Rund um die LCL und andere Komponenten
Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von theo »

Hi
Winni hat geschrieben:
Fr 5. Aug 2022, 19:01
Hier ist mal ein Beispiel, wie man eine SpeedButton sich selbst zeichnen lässt:
Das funktioniert, aber als entschiedener "With"-Gegner würde ich es so schreiben (Gleiche Funktion/Logik, nur eindeutiger und weniger verwirrend):

Code: Alles auswählen

procedure TForm1.SpeedButton1Paint(Sender: TObject);
const
  cap = '60° Grad';
var
  dx, dy: integer;
  ASB: TSpeedButton;
begin
  ASB := Sender as TSpeedButton;
  ASB.Glyph.SetSize(ASB.Width - 4, ASB.Height - 4);
  ASB.Glyph.Canvas.Brush.Color := clAqua;
  ASB.Glyph.Canvas.FillRect(0, 0, Width, Height);
  ASB.Glyph.Canvas.Font.Height := 14;
  dx := (ASB.Glyph.Width - ASB.Glyph.Canvas.TextWidth(cap)) div 2;
  dy := (ASB.Glyph.Height - ASB.Glyph.Canvas.TextHeight(cap)) div 2;
  ASB.Glyph.Canvas.TextOut(dx, dy, cap);
end;     
Dies gemeckert :wink: , glaube ich immer noch, dass der TCDButton (customdrawn) für diesen Zweck am geeignetsten und greifbarsten ist:

CDButton.png
CDButton.png (4.8 KiB) 1031 mal betrachtet

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

Hallo zusammen,
Winni hat geschrieben:
Sa 6. Aug 2022, 22:58
Wer Teile der Funktionalität von Komponenten mit abort abwürgt, hat leider das Prinzip nicht kapiert und sich außerdem zu wenig umgesehen.
Ich weis nicht, für wen Du Dich hälst und wie Du auf diesen dünnen Ast kommst.

Ich für meinen Teil habe das Prinzip verstanden und nutze auch Dinge wie Abort um die Funtionalität der Komponenten für meine Zwecke anzupassen, weil ich auch die Funktionalität von Abort verstanden habe.

Allerdings bin ich im Gegensatz zu Dir tolerant genug, andere Vorgehensweisen zu akzeptieren

Und wenn sich der Aufwand wirklich lohnt, bzw zwingend sein muss, dann schreibe ich die Standardkomponenten um, so dass die entsprechende Funktionalität gegeben ist.
Winni hat geschrieben:
Sa 6. Aug 2022, 22:58
PS.: Und der Sänger von Powerwolf in Wacken muss moch fleissig das Ti-Aitsch üben. Tag der Dilettanten. Läuft gerade nebenbei.
Auch das hier ist ein absolutes No-Go.
Nicht Alles was für Dich persönlich nicht perfekt erscheint, ist Diletantismus.
Winni hat geschrieben:
Sa 6. Aug 2022, 22:58
Im Tab "Dialogs" ist der TColorDialog zu finden. Das ist wohl das, was Du für eine saubere Programmierung benötigst.
Du hast einfach Deine festgefahrene Vorstellung und machst Dir viel zu wenig Gedanken über weiter Szenarien.

Da schlägst Du den TColorDialog vor, bei dem mancher Neuling dann verwundert sein könnte, dass der Titel des Dialoges nicht dem entspricht, welcher er in der Property Title angegeben hat.

Du wirfst anderen vor "sich außerdem zu wenig umgesehen" zu haben, sorgst dann aber mit Vorschlägen dafür, dass wieder neue "Probleme" entstehen, auf welche Du nicht aufmerksam gemacht hast, weil Du Dir die Komponenten wahrscheinlich selbst noch gar nicht genau angeschaut hast?

Um Dich noch weiter zu verwirren, sage ich Dir noch, dass ich den TColorButton nicht mit dem normalen internen Dialog, jedoch sogar mit einem separaten TColorDialog aufrufe, welcher in der Property ColorDialog des Buttons hinterlegt ist.

Mein Tipp an Dich:
Bleib einfach sachlich und akzeptiere andere Meinungen!
.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von Winni »

Hi!

Anscheinend weisst Du es nicht besser:

abort löst eine Exception aus, wenn auch eine stille.

Das bedeutet, der normale Programmablauf wird sofort unterbrochen und der Ablauf an den Main-Loop übergeben. Wenn hier noch Sachen aufgeräumt werden müssen, so bleiben diese unbearbeitet z.B. als memory leak zurück. Das gilt sowohl für den eigenen code als auch für das darunter liegende Widget-Set.

Bekannt ist z.B. das unter gtk2 ein abort im UTF8Keypress die ganze Application zum Einfrieren brachte. Ich weiss nicht, ob das heute auch noch so ist.

Jedes bessere Pascal-Buch für Anfänger warnt davor, unnötigerweise abort zu benutzen, da ein sauberer weiterer Ablauf des Programms nicht garantiert ist. Es sollte nur im aüssersten Notfall benutzt werden.

Winni

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von wp_xyz »

TBug hat geschrieben:
So 7. Aug 2022, 14:52
[...] TColorDialog [...], bei dem mancher Neuling dann verwundert sein könnte, dass der Titel des Dialoges nicht dem entspricht, welcher er in der Property Title angegeben hat.
Dieser Fehler ist seit Laz 2.2 behoben, was allerdings nicht ohne eine kleine Inkonsistenz zu lösen war: https://wiki.freepascal.org/Lazarus_2.2 ... alog.Title.

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

Hallo zusammen,
Winni hat geschrieben:
So 7. Aug 2022, 17:04
Anscheinend weisst Du es nicht besser:
abort löst eine Exception aus, wenn auch eine stille.
Das bedeutet, der normale Programmablauf wird sofort unterbrochen und der Ablauf an den Main-Loop übergeben.
Und genau so steht es in der Dokumentation der Prozedur Abort bzw. den Ausführungen zu EAbort.

Daher schrieb ich:
TBug hat geschrieben:
So 7. Aug 2022, 14:52
Ich für meinen Teil habe das Prinzip verstanden und nutze auch Dinge wie Abort um die Funtionalität der Komponenten für meine Zwecke anzupassen, weil ich auch die Funktionalität von Abort verstanden habe.
An Deinem Kommentar "Anscheinend weisst Du es nicht besser:" sieht man dass Du das von anderen Nutzern geschriebe in Deinem "Wahn" gar nicht zur Kenntnis nimmst und einfach auch hier wieder unterstellst, dass man doch dumm sei und nicht Bescheid wüsste.

Wenn ich jetzt noch schreibe, dass ich sogar eine Anwendung habe, in welcher ich ein Label und Goto verwende, dann ist wohl jemand dem Herzinfarkt nahe und wird mich wahrscheinlich noch als den Unfähigsten der Welt beschimpfen. Aber sei Dir auch hierbei sicher, das ich genau weis, was ich da mache und weshalb ich keine andere Option gesehen habe.

Also nochmals als Tipp für Dich: Lesen, verstehen und akzeptieren, dass Andere vorhandene Techniken anderst einstetzen, als Du es wünscht.
wp_xyz hat geschrieben:
So 7. Aug 2022, 17:15
TBug hat geschrieben:
So 7. Aug 2022, 14:52
[...] TColorDialog [...], bei dem mancher Neuling dann verwundert sein könnte, dass der Titel des Dialoges nicht dem entspricht, welcher er in der Property Title angegeben hat.
Dieser Fehler ist seit Laz 2.2 behoben, was allerdings nicht ohne eine kleine Inkonsistenz zu lösen war: https://wiki.freepascal.org/Lazarus_2.2 ... alog.Title.
Funktioniert bei mir mit der 2.2.0 weiterhin nicht. Windows 32bit Anwendung.
Egal was in der Property Title eingegeben ist, es wird "Select Color" in der Titelleiste angezeigt.
Setze ich jedoch die Property zum Erstellzeitpunkt der Anwendung selbst, dann erscheint auch der richtige Titel.
.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von wp_xyz »

TBug hat geschrieben:
So 7. Aug 2022, 18:31
wp_xyz hat geschrieben:
So 7. Aug 2022, 17:15
TBug hat geschrieben:
So 7. Aug 2022, 14:52
[...] TColorDialog [...], bei dem mancher Neuling dann verwundert sein könnte, dass der Titel des Dialoges nicht dem entspricht, welcher er in der Property Title angegeben hat.
Dieser Fehler ist seit Laz 2.2 behoben, was allerdings nicht ohne eine kleine Inkonsistenz zu lösen war: https://wiki.freepascal.org/Lazarus_2.2 ... alog.Title.
Funktioniert bei mir mit der 2.2.0 weiterhin nicht. Windows 32bit Anwendung.
Egal was in der Property Title eingegeben ist, es wird "Select Color" in der Titelleiste angezeigt.
Setze ich jedoch die Property zum Erstellzeitpunkt der Anwendung selbst, dann erscheint auch der richtige Titel.
Seltsam. Bei mir funktioniert es (Win 11) - siehe Anhang. Button1 zeigt einen ColorDialog an, dessen Titel schon im Objektinspektor gesetzt wurde, Button2 zeigt einen zur Laufzeit erzeugten ColorDialog mit zur Laufzeit veränderten Titel.
Dateianhänge
colordialog_title.zip
(2.1 KiB) 34-mal heruntergeladen

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

@wp_xyz
wp_xyz hat geschrieben:
So 7. Aug 2022, 19:18
Seltsam. Bei mir funktioniert es (Win 11) - siehe Anhang. Button1 zeigt einen ColorDialog an, dessen Titel schon im Objektinspektor gesetzt wurde, Button2 zeigt einen zur Laufzeit erzeugten ColorDialog mit zur Laufzeit veränderten Titel.
Ich habe Dein Beispiel heruntergeladen und angeschaut.
Es war fast der identische Aufbau meines Testes heute mittag.

Als ich allerdings Dein Beispiel ausführte, zeigten beide Dialoge die von Dir vorgegebenen Titel an.

Jetzt stellte ich mir die Frage, was ist an Deinem Beispiel anderst gewesen, als an meinem.
Also nochmals eine Anwendung erzeugt, eine TButton und einen TColorDialog auf die Form gelegt und das OnClick-Event des Buttons gefüllt.

Kompiliert und gestartet und den Button gedrückt == "Select Color" im Titel des Dialogs.

Ok die Property Title vom Standard "Farbe auswählen" auf "Farbe" geändert und neu kompiliert und gestartet.

Dialog zeigt: "Select Color" --->> hääää???
nochmals Titel geändert
Dialog zeigt: "Select Color" --->> hääää???

Nach einer Zigarettenpause dann die Erleuchtung --> man sollte nicht nur dien Text der Property ändern, sondern auch dafür sorgen, dass der Text auch geändert wird, also auch tatsächlich übernommen wird, bevor man auf "Kompilieren" klickt.

Ahh.. , mea Culpa

Es funktioniert also soweit, dass ein angebebener Text in der Property Title des TColorDialogs auch im Dialogfenster angezeigt wird, sofern der Eintrag nicht "Farbe auswählen" lautet. Denn dann wird immernoch "Select Color" im Titel angezeigt. Ausser man gibt ""Farbe auswählen" zur Laufzeit an, denn dann wird auch ""Farbe auswählen" angezeigt.
.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von wp_xyz »

TBug hat geschrieben:
So 7. Aug 2022, 20:39
Es funktioniert also soweit, dass ein angebebener Text in der Property Title des TColorDialogs auch im Dialogfenster angezeigt wird, sofern der Eintrag nicht "Farbe auswählen" lautet. Denn dann wird immernoch "Select Color" im Titel angezeigt. Ausser man gibt ""Farbe auswählen" zur Laufzeit an, denn dann wird auch ""Farbe auswählen" angezeigt.
Also: du änderst den Titel im Objekt-Inspektor auf "Farbe auswählen", und zur Laufzeit wird der Titel als "Select Color" angezeigt? Ist bei mir nicht der Fall - siehe beigefügtes Projekt: beim 3.Button passiert genau das, aber der Titel wird zu "Farbe auswählen".
Dateianhänge
colordialog_title.zip
(2.17 KiB) 37-mal heruntergeladen

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

@wp_xyz,

Auch Dein neues Projekt zeigt in allen Fällen den richtigen Titel an.

Ich habe jetzt nochmals ein Projekt selbst angelegt und nichts an den Einstellungen geändert.

Siehe da, im OI steht "Farbe auswählen" und im Title "Select Color".

Ich habe es mal angehängt, damit Du es testen kannst.
.
Dateianhänge
TBug_ColorDialog.zip
(105.69 KiB) 35-mal heruntergeladen

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von wp_xyz »

Kann ich nicht reproduzieren: Die lfm-Datei enthält überhaupt keinen TColorDialog.Title - d.h. es wird der Default-Titel genommen und das ist "Select color".

Schreibe ich dann "Farbe auswählen" in die Title-Property (und drücke ENTER - hast du das gemacht?), dann steht dieser Titel im OI und auch zur Laufzeit im ColorDialog.

kirchfritz
Beiträge: 172
Registriert: Mo 3. Jan 2011, 13:34
OS, Lazarus, FPC: Win10 (L 3.0 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Nürnberg

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von kirchfritz »

Hallo,
ich versuche mal die Frage des Beitragserstellers zu beantworten:

Um die Funktionalität einer Komponente zu unterdrücken, setzt man eigentlich die Property enabled auf false. Dies gilt für alle Komponenten.
Explizit könnte man das auch bei TColorButton so machen.
Property enabled=True : Der Farbauswahldialog öffnet sich.
Property enabled=False : Der Farbauswahldialog öffnet sich nicht.
Das Unschöne daran ist leider, dass der TColorbutton bei enabled=false schwarz schraffiert dargestellt wird. (Zumindest bei mir unter Windows 10)
Optisch weiß man zwar dann, dass der Button disabled ist, hat aber keine Ahnung mehr, welche Farbe der TColorbutton repräsentiert.

Wie vorher schon erwähnt, tuts aber auch ein eingefärbter TSpeedbutton, der einen ColorDialog aufruft, wenn er enabled ist, und ansonsten nichts macht.

Im Quellcode sieht das dann bei mir so aus:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons;

type

  { TForm1 }

  TForm1 = class(TForm)
    CheckBox1: TCheckBox;
    ColorDialog1: TColorDialog;
    SpeedButton1: TSpeedButton;
    procedure Button1Click(Sender: TObject);
    procedure CheckBox1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not (Sender is TSpeedButton) then exit;
  ColorDialog1.Color := TSpeedButton(Sender).Color;
  ColorDialog1.Title := 'Farbe auswählen';
  if ColorDialog1.Execute then
      TSpeedButton(Sender).Color := ColorDialog1.Color;
end;

procedure TForm1.CheckBox1Change(Sender: TObject);
begin
  if not (Sender is TCheckbox) then exit;
  Speedbutton1.Enabled := TCheckbox(Sender).Checked;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SpeedButton1.ShowCaption := False;
  SpeedButton1.Color       := clYellow;
  SpeedButton1.Transparent := False;
  SpeedButton1.Flat        := True;
  Speedbutton1.Enabled     := Checkbox1.Checked;
  SpeedButton1.OnClick     := @Button1Click;
end;
end.
Beispielprogramm im Anhang:
kirchfritz_ColorDialog.zip
(106.51 KiB) 36-mal heruntergeladen

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

@wp_xyz
wp_xyz hat geschrieben:
So 7. Aug 2022, 23:41
Schreibe ich dann "Farbe auswählen" in die Title-Property (und drücke ENTER - hast du das gemacht?), dann steht dieser Titel im OI und auch zur Laufzeit im ColorDialog.
Sobald ich im OI die Property Title auf "Farbe auswählen" ändere (und mit Enter bestätige) ist nach dem kompilieren in der .lfm kein Eintrag "Title" mehr vorhanden und es wird "Select Color" in der Kopfleiste des Dialogs angezeigt.

"Farbe auswählen" ist der Default-Eintrag für diese Property, welchen er dann bei mir nicht in der .lfm hinterlegt. Sieht man auch daran, dass der Eintrag im OI schwarz und nicht farbig angezeigt wird,

Erweitere ich die ,lfm von Hand um

Code: Alles auswählen

Title = 'Farbe auswählen'
, dann wird auch "Farbe auswählen" angezeigt. Bis zur nächsten Anderung irgendeiner Property des TColorDialogs.

.

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

Hallo zusammen,
kirchfritz hat geschrieben:
Mo 8. Aug 2022, 01:10
Wie vorher schon erwähnt, tuts aber auch ein eingefärbter TSpeedbutton, der einen ColorDialog aufruft, wenn er enabled ist, und ansonsten nichts macht.
Naja, so das Gelbe vom Ei ist dies ja auch nicht gerade.

Durch die Eigenschaft Flat = true hat man eben optisch keinen richtigen Button mehr zum Drücken und man müßte die Schaltfläche erst einmal suchen, wenn die gewählte Farbe dem Hintergrund des Parents gleicht.

Läßt man Flat= false, dann ist nur ein schmaler farbiger Rahmen zu sehen.
.

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von wp_xyz »

TBug hat geschrieben:
Mo 8. Aug 2022, 13:54
@wp_xyz
wp_xyz hat geschrieben:
So 7. Aug 2022, 23:41
Schreibe ich dann "Farbe auswählen" in die Title-Property (und drücke ENTER - hast du das gemacht?), dann steht dieser Titel im OI und auch zur Laufzeit im ColorDialog.
Sobald ich im OI die Property Title auf "Farbe auswählen" ändere (und mit Enter bestätige) ist nach dem kompilieren in der .lfm kein Eintrag "Title" mehr vorhanden und es wird "Select Color" in der Kopfleiste des Dialogs angezeigt.

"Farbe auswählen" ist der Default-Eintrag für diese Property, welchen er dann bei mir nicht in der .lfm hinterlegt. Sieht man auch daran, dass der Eintrag im OI schwarz und nicht farbig angezeigt wird,

Erweitere ich die ,lfm von Hand um

Code: Alles auswählen

Title = 'Farbe auswählen'
, dann wird auch "Farbe auswählen" angezeigt. Bis zur nächsten Anderung irgendeiner Property des TColorDialogs.
Jetzt verstehe ich: Du hast die deutsche IDE, ich die englische... Das muss mit der in den Release Notes erwähnten Inkonsistenz zusammenhängen, die ich weiter oben erwähnt hatte. Irgendwie stimmt das Streaming hier nicht: Der DefaultTitle ist

Code: Alles auswählen

function TColorDialog.DefaultTitle: string;
begin
  Result := rsSelectcolorTitle;
end;
wobei rsSelectcolorTitle aber ein von der IDE übersetzter String ist.

Du kannst natürlich ein Leerzeichen anhängen, also "Farbe auswählen " - aber schön ist das nicht...

Könntest du einen Bug-Report schreiben?

TBug
Beiträge: 177
Registriert: Mi 2. Sep 2015, 11:09
OS, Lazarus, FPC: Lazaurus 2.2.4 FPC 3.2.2
CPU-Target: Windows 32/64bit

Re: TColorButton, Farbtabellenauswahl unterdrücken

Beitrag von TBug »

@wp_xyz

herzlichen Dank zuerst einmal, dass Du hier unermüdlich drangeblieben bist, um die Ursache zu erforschen.
wp_xyz hat geschrieben:
Mo 8. Aug 2022, 17:45
Du kannst natürlich ein Leerzeichen anhängen, also "Farbe auswählen " - aber schön ist das nicht...
Wäre natürlich auch eine Alternative.
Es betrifft jedoch auch andere Komponenten, wie zum Beispiel die Hints des DBNavigators.
Diese setze ich auch zum Erstellungszeitpunkt der Anwendungen auf deutsch.
wp_xyz hat geschrieben:
Mo 8. Aug 2022, 17:45
Könntest du einen Bug-Report schreiben?
Momentan eher nicht.
Wohntechnisch aus familiären Gründen habe ich momentan seltenst Zugriff auf mein Hauptrechnersystem, so dass ich mich mit meinem alten Vista-Laptop herumschlagen muss. Leider kann ich hierbei sehr viele Internetseiten kaum oder garnicht aufrufen bzw. bedienen, da sämtliche noch auf Vista lauffähigen Browser nicht mehr unterstützt werden.
.

Antworten