Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Mimmo - Aprile 29, 2025, 03:05:24 pm

Titolo: Compatibilità delphi - lazarus, metodo GetColorResolvingParent
Inserito da: Mimmo - Aprile 29, 2025, 03:05:24 pm
Ciao,
qualcuno sa se in Delphi esiste una chiamata equivalente al GetColorResolvingParent delle LCL?
Chiedo a tutti anche se credo che di esperti di Delphi nel forum ce ne sia solo uno... @DragoRosso  ;)
Il motivo è che ho trovato un piccolo problema in un set di componenti su github (ATFlatControls) e la soluzione per lazarus passa per il metodo in oggetto ma forse non esiste un equivalente in Delphi per cui l'autore del progetto, volendo giustamente mantenere la compatibilità, sta cercando un workaround.
Titolo: Re:Compatibilità delphi - lazarus, metodo GetColorResolvingParent
Inserito da: DragoRosso - Aprile 29, 2025, 09:31:00 pm
In questo momento non ho Lazarus installato.

Se il problema è quello che hai segnalato su github (ora l'ISSUE è chiusa) la soluzione sarebbe semplicemente quella di usare la proprietà Color del componente.
Tale proprietà devrebbe automaticamente a runtime essere settata sul colore reale del component (sia ereditato che imposto a design time).

Provo a fare una prova, perchè occorre verificare con i temi (che non esistono in Lazarus) che valore questo assume.

In genere un componente deve soddisfare tutte le peculiarità del componente da cui deriva, e quindi anche i temi (ovvero gli STILI in Delphi)

Domani ti sò dire.
Titolo: Re:Compatibilità delphi - lazarus, metodo GetColorResolvingParent
Inserito da: DragoRosso - Aprile 29, 2025, 10:16:10 pm
La proprietà Color del controllo rispecchia il colore attuale del background del componente stesso, sia essa derivata dal Parent (tramite la proprieta ParentColor settata a True) che impostata.

Con eventuali Stili invece tale proprietà non ha significato in quanto lo stile ha un suo "motore" di disegno (il background può essere anche complesso con elementi decorativi).

Il componente che è rappresentato nella ISSUE a cui ti sei riferito in Delphi ha una modalità di riempimento di tipo "gradient" nativa (sia orrizontale che verticale) oltre a quella normale a tinta unita.

In ogni caso, se vuoi conoscere il colore del "Parent", riferisciti alla proprietà Brush dello stesso (ovviamente riferito al contesto desiderato):

Codice: [Seleziona]
Parent.Brush  <-- ritorna il colore ed il modo usato per dipingere il backgruond del controllo "padre". 
Titolo: Re:Compatibilità delphi - lazarus, metodo GetColorResolvingParent
Inserito da: Mimmo - Aprile 30, 2025, 08:56:03 am
Grazie DragoRosso.
Ho aggiunto un commento alla issue chiusa con un suggerimento di modifica.
Vediamo cosa deciderà l'autore della libreria.
Personalmente prediligerei la modifica che preserva il meccanismo di ereditarietà dei colori ma la decisione spetta a lui.
Grazie!
Titolo: Re:Compatibilità delphi - lazarus, metodo GetColorResolvingParent
Inserito da: Mimmo - Aprile 30, 2025, 09:05:58 am
Son passati solo una decina di minuti ma ha già patchato il componente come indicato sulla base del tuo suggerimento  :)
Titolo: Re:Compatibilità delphi - lazarus, metodo GetColorResolvingParent
Inserito da: DragoRosso - Aprile 30, 2025, 09:39:39 am
Son passati solo una decina di minuti ma ha già patchato il componente come indicato sulla base del tuo suggerimento  :)

Bene ... speriamo che funzioni  ;D

Comunque, tenete presente che mantenere la compatibilità con Delphi sarà in futuro sempre più "complessa" (lo è già per certi versi).

Delphi ha due "stili" di programmazione:

1) La VCL - questa sarebbe l'equivalente della LCL, però con diverse peculiarità soprattutto grafiche che seguono esattamente lo stile di Windows, oltre a consentire una pressochè totale personalizzazione dell'aspetto grafiche (forme, colori, funzionalità) mantenendo nel contempo la compatibilità totale con il componente originale di Windows.

2) La FMX (FIreMonkey, non disponibile per Lazarus perchè già multipiattaforma) - questa è la controparte "mobile" usabile anche per Windows per lo sviluppo di applicazioni multipiattaforma (Windows, Linux, Android, Mac, IOS).

In particolare la compatibilità della prima con le LCL è messa a dura prova tenendo conto che le LCL sono sviluppate per multipiattaforma, certamente con le peculiarità dei sistemi "target" per cui vengono sviluppate, ma comunque mantenendo un certo grado di "somiglianza" tra loro.
Non usano quindi tutte le funzionalità integrate di Windows, a differenza delle VCL. Questo si traduce principalmente in una differeneza visiva (diciamo grafica) migliorabile usando librerie di terze parti sviluppate apposta per Lazarus.
Alcune volte invece si perdono alcune funzionalità proprie del componente, specifiche magari per il sistema operativo Windows.

Ciao