Newsgroup: it.comp.lang.delphi
Titolo: programmazione per ogetti ?

scusate per gli eventuali 'orrori' che potrei dire (non mi preoccupo
delle figuracce quando cerco di imparare)
piuttosto che una serie infinita di IF ... THEN ...ELSE vorrei optare
per una gestione separata di un TPanel che rappresenta un determinato
colore in base ad un determinato TEdit e/o un secondo TPanel, mi
spiego meglio
vorrei gestire, in maniera 'ottimale', un piccolo editor che mi
consenta la modifica dei colori di un OSD di una apparecchiatura.
ho messo le varie immagini su di un TPageControl e, ad ogni
TabSheetShow, visualizzo su alcuni Tpanel i colori utilizzati in
quella determinata pagina dell'OSD (On Screen Display)
esempio: TabSheet1 -> usa 4 colori -> 4 TPanel -> 4 TEdit (non
modificabili) con valori RGB in esadecimale
in basso ho 3 TrackBar + 3 TEdit + 1 TPanel + Timage per tutte le
modifiche del colore (le TrackBar per R-G-B, i TEdit per inserire
dirattamente i codici hex, il Tpanel che mi visualizza il colore che
stò creando e il Timage con il classico pannello multicolore dal quale
selezionare un colore con il click del mouse)
ora: sarebbe possibile creare una qualche 'funzione' che
'automaticamente' modificasse il colore di un TPanel in base al colore
di un altro Tpanel in maniera trasparente alla gestione del tutto ?
stò gestendo la cosa in questo modo:
1. click su uno dei TPanel dei colori OSD
2. ricopio il colore nel TPanel della sezione 'modifica' ed aggiusto i
TrackBar e i TEdit
3. faccio le modifiche al colore
4. pulsante 'TButton' per ricopiare il colore 'creato' nel TPanel da
cui ero partito
gestione
1a. IF ... THEN ... ELSE per gestire il TPanel cliccato tramite
cambiamento del BorderStyle del TPanel (cambio quello del componente
selezionato e annullo tutti gli altri)
4a. IF ... THEN ... ELSE per ricopiare il colore (gestendone anche i
codici HEX RGB) nel TPanel da cui ero partito (in pratica vado a
leggere quale TPanel ha il BorderStile modificato e quindi su quello
faccio la modifica)
Pensavo di:
- ridurre le righe di codice con un ciclo FOR gestendo i componenti
tramite la ricerca sul nome (TPanel1 - TPanel2 ecc ... sostituendo in
pratica il numero con una variabile ... un po grezza come cosa ma
meglio che fare 2.000 righe di codice con copia/incolla)
- posizionare il tutto su di una TStringGrid ma avrei comunque una
lunga serie di IF e/o ... magari gestendo delle variabili ... boh ...
ci devo pensare
insomma, ammesso che sia riuscito a spiegarmi, avete qualche idea ?
(magari con qualche piccolo esempio incluso)
ps. i vari colori hanno anche la possibilità di essere settati in
trasparenza (ma non voglio mettere troppa carne sul fuoco) ... diciamo
oltre i byte R - G - B hanno anche il 4° byte T (inteso come
trasparenza), sarebbe carino includerene la modifica
grazie in anticipo per i consigli
ps. uso TurboDelphi2006

 colore in base ad un determinato TEdit e/o un secondo TPanel [...]
Credo che passare ad una gestione più "orientata agli oggetti", in 
questo caso, sia senz'altro un buon proposito.
Secondo me, potresti raggiungere un codice migliore (dal punto di vista 
dell'efficienza, della manutenibilità e anche della velocità, in certi 
casi) sfruttando meglio anche gli eventi stessi, ma una implementazione 
maggiormente OOP senz'altro non nuocerebbe.
Non so se in questo caso sia necessario a tutti i costi ereditare classi 
di controlli e/o package; potresti ad esempio sfruttare l'uso dei 
*Frame* per costruire l'interfaccia che normalmente contiene i controlli 
di definizione dei colori (le trackbar, gli Edit, ecc.) in modo da 
poterne creare tutte le istanze che vuoi (dinamicamente, tramite codice) 
ed eventualmente associare a quest'ultimo, usando una proprietà, il 
riferimento ad un altro Frame in cui visualizzi i risultati, 
sincronizzando le due visuali attraverso la chiamata di metodi.
Purtroppo, non ho molto tempo per analizzare l'interfaccia che hai 
costruito e il suo funzionamento dal punto di vista logico, ad ogni modo 
puoi senz'altro migliorare la tua implementazione considerando alcuni 
strumenti utili quali:
1)
il parametro Sender specificato per gli eventi e che identifica il 
controllo interessato da un'azione;
2)
l'uso dei Frame è senz'altro indicato e preferibile per lo sviluppo di 
interfacce riutilizzabili;
3)
dove spesso hai una struttura gestita da IF...THEN...ELSE, si può 
tranquillamente introdurre una gerarchia di oggetti OOP dove le 
operazioni comuni fanno parte della classe base, che contiene anche un 
metodo virtuale che può essere ridefinito nelle classi discendenti, una 
per ogni caso IF...THEN.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

grazie per la risposta, quella del parametro sender mi sembra la cosa
più indicata al momento (forse più facile da studiare e utilizzare)
se non ho capito male, sapendo quale TPanel ha generato la procedura
(il TPanel su cui ho cliccato) mi risparmio di andarlo a ricercare una
volta che ne ho modificato il colore (un po come la gestione del
TCategoryButton).
risparmiandovi le solite solfe sull'hobbysta con poco tempo e pochi
soldi (tengo famiglia :-D ) ... credo che prima o poi dovrò decidermi
a studiare la benedetta programmazione ad oggetti (quella con cui si
costruiscono tutte le necessità dinamicamente ?!)
l'help del TurboDelphi spesso mi lascia perplesso ...
devo definire ancora bene la logica di funzionamento, dato che ho
anche altre funzioni particolari e specifiche da inserire per ogni
TabSheetShow, e magari la logica migliore potrebbe essere quella che
ho già pensato ... anche se ne dubito
Marco, anche se (ricordi passati) mi sembra che questo non sia una
'lista' in cui si fa 'scuola' potresti farmi qualche esempio del punto
3 e/o indicarmi un link semplice ?
Ciao, Luigi

in pratica, al posto di 12 serie di:
procedure TColorMap.BMP3Click(Sender: TObject);
begin
  inherited;
if BMP3.BorderStyle = bsSingle then
  begin
  BMP3.BorderStyle := bsNone
  end
else
if BMP3.BorderStyle = bsNone then
  begin
  toglibordi;
  BMP3.BorderStyle :=bsSingle;
  ColorChosed.Color := BMP3.Color;
  RValue.text :=  (Edit3.Text[1]+Edit3.Text[2]);
  GValue.text :=  (Edit3.Text[3]+Edit3.Text[4]);
  BValue.text :=  (Edit3.Text[5]+Edit3.Text[6]);
end;
end;
si potrebbe fare (dando a tutti i 'pulsanti' TPanel la medesima
procedura):
procedure TColorMap.BMP3Click(Sender: TObject);
begin
  inherited;
if TComponent(sender).BorderStyle = bsSingle then
  begin
  TComponent(sender).BorderStyle := bsNone
  end
else
if TComponent(sender).BorderStyle = bsNone then
  begin
  toglibordi;
  TComponent(sender).BorderStyle :=bsSingle;
  ColorChosed.Color := TComponent(sender).Color;
  RValue.text :=  (Edit3.Text[1]+Edit3.Text[2]);
  GValue.text :=  (Edit3.Text[3]+Edit3.Text[4]);
  BValue.text :=  (Edit3.Text[5]+Edit3.Text[6]);
end;
end;
ma resta da capire come 'indicare' il TEdit relativo il sender ... in
questo caso l'Edit3

Risolto (almeno questa problematica) così:
procedure TColorMap.BMPClick(Sender: TObject);
begin
  inherited;
if TPanel(Sender).BorderStyle = bsSingle then
  begin
  TPanel(Sender).BorderStyle := bsNone;
  ColorChosed.Color := clBtnFace;
  end
else
if TPanel(Sender).BorderStyle = bsNone then
  begin
  toglibordi;
  TPanel(Sender).BorderStyle :=bsSingle;
  ColorChosed.Color := TPanel(Sender).Color;
//  RValue.text :=  (Edit2.Text[1]+Edit2.Text[2]);
//  GValue.text :=  (Edit2.Text[3]+Edit2.Text[4]);
//  BValue.text :=  (Edit2.Text[5]+Edit2.Text[6]);
  RValue.text :=  inttohex(GetRValue(TPanel(Sender).Color),2);
  GValue.text :=  inttohex(GetGValue(TPanel(Sender).Color),2);
  BValue.text :=  inttohex(GetBValue(TPanel(Sender).Color),2);
end;
end;
Grazie ancora a Marco per l'ottimo spunto di studio e scusate per i
numerosi post (ma, credo, sempre utili per chi ha voglia di 'Cercare' )