Newsgroup: it.comp.lang.delphi
Titolo: Aiuto con IF... ELSE

Ciao Ragazzi ho bisogno del vostro aiuto.
Il problema è questo :
data una variabile X devo verificane il valore e posizionare un '*'  in una
colonna.
Ogni colonna corrisponde ad un range e cioè:
1° colonna : % oltre -15
2° colonna : % compresa tra -15 e -5
3° colonna : % compresa tra -5 e +5
4° colonna % compresa tra +5 e +15
5° colonna % oltre +15%
Io ho scritto il seguente codice
If  X < -15 then
 begin
   label1.caption := '*':
   label2.caption := '';
   label3.caption := '';
   label4.caption := '';
   label5.caption := '';
end;
If (X >= -15) and (X <-5) then
 begin
   label1.caption := '':
   label2.caption := '*';
   label3.caption := '';
   label4.caption := '';
   label5.caption := '';
end;
If (X >= -5) and (X < 5) then
 begin
   label1.caption := '':
   label2.caption := '';
   label3.caption := '*';
   label4.caption := '';
   label5.caption := '';
end;
If (X >= 5) and (X <15) then
 begin
   label1.caption := '':
   label2.caption := '';
   label3.caption := '';
   label4.caption := '*';
   label5.caption := '';
end;
If X > 15  then
 begin
   label1.caption := '':
   label2.caption := '';
   label3.caption := '';
   label4.caption := '';
   label5.caption := '*';
end;
Cacchio non ne vuol sapere di funzionare!!
Mi dareste un'aiutino?
Ciao
GLF

 Mi dareste un'aiutino?
Secondo me funziona, ma ogni volta ti riazzera le colonne, se continui ad
assegnare stringhe vuote.
Ciao
 Max

 assegnare stringhe vuote.
Quindi ?
GLF

 > assegnare stringhe vuote.
Prova a spiegarci *Cosa* vuoi che faccia...
L'ultima condizione è sbagliata. l'ipotesi che X=15 non viene contemplata.
Ciao
Matteo

Quindi ?
Dovresti spiegare meglio il contesto di applicazione del tuo codice, perche'
anche a me risulta funzionante (sulla lettura, non testato).
Quindi, l'unico dubbio che io ci trovo sta nel fatto che se mi parli di
"colonne", io associo le colonne alla struttura struttura di una griglia e,
ovviamente, il tuo codice se deve testare piu' righe invalida di volta in
volta tutti gli asterischi.
--
Morde. 
morde[at]programmer[.]net

Prova con
    label1.caption := '':
    label2.caption := '';
    label3.caption := '';
    label4.caption := '';
    label5.caption := '';
    case X of
      -maxint..-15 :label1.caption := '*':
      -15..-5         :label2.caption := '*':
      -5..5            :label3.caption := '*':
      5..15            :label4.caption := '*':
      15..maxint    :label5.caption := '*':
    end
ho messo maxint come estremi (eventalmente da  modificare).
Ma non riesco a capire cosa intendi per colonne, visto che stai valorizzando
delle label.
Denis

Allora:
vorrei che in fase di stampa mi scriva un '*' nella colonna corrispondente.
Ho provato a cambiare il codice ma sempre senza risultato:
Procedure DetailBeforeprint;
begin
if  X < -15 then
  label15.caption := '*'
else if (X >= -15) and (X<-5) then
   label16.caption := '*'
else if (X >= -5) and (X<5) then
   label17.caption := '*'
else if (X >= 5) and (X<=15) then
   label18.caption := '*'
if  X > 15 then
  label19.caption := '*'
end;
Procedure DetailAfterprint;
begin
   label15.caption := '';
   label16.caption := '';
   label17.caption := '';
   label18.caption := '';
   label19.caption := '';
end;
Risultato :
funzionano il primo e gli utimi 2 IF
Ciao

 in una colonna.
...
cut.
Vuoi mettere un asterisco in una label, cancellando le altre.
a) cancelli le label;
b) metti l'asterisco (v. sotto).
Quanto all'if, considera che se aggiungi un ramo else vi ricadi tutte e
sole le volte che non cadi nel ramo if, quindi evita di mettere
condizioni che duplichino (magari solo apparentemente) quelle gia'
applicate dal compilatore: ovvero, non usare due if quando puoi ottenere
l'effetto con un if - else.
Questo per quel che riguarda l'if/else. Non capisco invece che c'entrino
le colonne.
const
    LoLim1 = -15; LoLim2 = -5; LoLim3 = 5; LoLim4 = 15;
if x < LoLim1 then
  label1.Caption := '*'
else if x < LoLim2 then
  Label2.Caption := '*'
else if x < LoLim3 then
  Label3.Caption := '*'
else if x < LoLim4 then
  Label4.Caption := '*'
else   //  x >= LoLim4
  Label5.Caption := '*';
Saluti
Paolo Arosio

c'e' una soluzione piu' compatta ed elegante della sfilza di if :)
eccola:
const v:array [0..5] of integer=[-maxint,-15,-5,5,15,maxint];
..
for i:=1 to 6 do
 if (x>v[i-1]) and (x<v[i])
  then TLabel(FindComponent('Label'+inttostr(i))).caption:='*'
  else TLabel(FindComponent('Label'+inttostr(i))).caption:='';
Ciao, Sandro

Allora ho risolto convertendo i valori negativi in valori assoluti (deve
essere un baco di Report Builder)
Ciao e grazie
GLF

 essere un baco di Report Builder)
se il problema era quello di associare dei valori alle caption di TppLabel
(che NON SONO label normali!) e non l'hai detto, ti strozzo!
Per assegnare dei valori alle TppLabel in base a delle condizioni devi usare
l'evento OnGetText, non le puoi assegnare in blocco cosi' come hai fatto (o
volevi fare). La questione poi dei valori assoluti snatura il problema che
hai posto, quindi non vedo come tu possa "aver risolto" in questo modo!
mah!!
Ciao, Sandro

  then TLabel(FindComponent('Label'+inttostr(i))).caption:='*'
Precisando che questi shortcut nel codice non mi piacciono per nulla,
quando si esegue una FindComponent è sempre bene testare se il
componente è stato effettivamente trovato.  Altrimenti, castando a
TLabel (o in questo caso, a TppLabel) e accedendo alla memoria si
ottiene, se va bene, un Access Violation.  Questo meccanismo mette al
riparo, anche, da possibili errori di digitazione durante il codice.
-- 
Andrea Laforgia
www.geocities.com/andrealaforgia
"640kb of memory should be enough for anyone." -- Bill Gates.

l'evento OnGetText, non le puoi assegnare in blocco cosi' come hai fatto 
Non č vero.  
Sull'OnBeforePrint dell'intera banda dove le TppLabel risiedono č
possibile eseguire un'assegnazione in blocco.


 possibile eseguire un'assegnazione in blocco.
in teoria funzionerebbe se non ci sono di mezzo dataset, in pratica, con i
dataset di mezzo non mi sono mai fidato a farlo, perche' c'e' di mezzo la
cache, per cui le bande vengono stampate e generate in tempi diversi, e il
puntatore al record dell'eventuale archivio/archivi non e' detto sia lo
stesso durante le due fasi.
Riformuliamo comunque la procedura in modo ancora piu' sintetico (e criptico
;) ):
const v:array [0..5] of integer=[-maxint,-15,-5,5,15,maxint];
..
for i:=1 to 6 do with TppLabel(FindComponent('Label'+inttostr(i))) do
 if (x>v[i-1]) and (x<v[i]) then caption:='*' else caption:='';
la questione di verificare o meno che il componente esista e' una
stupidaggine, almeno se il programma l'hai fatto tu, il ciclo va da un
numero definito ad un altro (da 1 a 6, e non dal valore di una variabile x a
quello di una variabile y), e quindi il componente sei certo che ci sia.
Ciao, Sandro

stupidaggine
No, non lo è.  La vera stupidaggine è quella di dichiarare un array
che va da 0 a 5 e usare delle label indicizzate da 1 a 6 (nel tuo
codice, come vedi, hai sbagliato gravemente: v[i], quando i vale 6 non
esiste), incoerente e molto "error-prone".  Porre dei controlli di
correttezza su ciò che si sta facendo, all'interno di un programma,
non può mai essere considerato una stupidaggine, semmai lo si
considera eccessivo, ma nel caso in questione non è nè l'una nè
l'altra cosa.  Un ciclo come quello che tu hai scritto è il tipico
esempio di codice soggetto a facili errori.  Se per distrazione, il
programmatore non scrive IntToStr(i) ma IntToStr(i-1), ecco che nella
migliore delle ipotesi si ha un AV, come già detto.  Porre invece una
condizione (che tra l'altro migliora la leggibilità del codice che hai
scritto) assicura un controllo migliore e risparmia da tempi di debug
inutili.  Un esempio:
for I := Low(v) to High(v) do 
begin
  MyLabelName := 'Label'+IntToStr(I);
  MyLabel := TppLabel(FindComponent('Label'+IntToStr(i)));
  if not Assigned(MyLabel) then
    MessageDlg('Label ' + MyLabelName + 'non trovata !!!', ...)
  else
  begin
    MyLabel.Caption := 'aaaaaa';
  end;
end;
In ogni caso, ribadisco, è bene mantenere una coerenza di fondo, se
l'indice di un vettore da a 0 a 5, mi aspetto che anche le label siano
indicizzate da 0 a 5.
Nei tuoi programmi, cerca di essere meno "artista" ;-)


  MyLabel := TppLabel(FindComponent('Label'+IntToStr(i)));
MyLabel := TppLabel(FindComponent(MyLabelName));


 Nei tuoi programmi, cerca di essere meno "artista" ;-)
il mio - e' - un lavoro da artista. Il mondo, e' vero, e' anche pieno di
programmatori "operai", che riempiono di if..then..else i loro programmi
anziche' usare cicli, indentano con 2 spazi, scrivendo l'if su una riga,  il
then su un'altra il begin su una terza, hanno le interfacce a pulsantoni,
ecc. che devo dirti, buon per loro, sarebbe degradante per me dovermi
considerare al loro livello ;)
Ciao, Sandro

considerare al loro livello ;)
E se ti dicessi che con il tuo modo di programmare sei già al di sotto
di quel "livello" ? ;-)
Ti consiglio di non dividere il mondo in "programmatori artisti" e
"programmatori operai", il lavoro del programmatore è uno solo, è
preciso, scientifico e rigoroso.  D'altronde, a pensarci bene, l'arte
è arte proprio perché possiede anch'essa tali caratteristiche.


 di quel "livello" ? ;-)
non faresti altro che confermare il giudizio che gia' da tempo ho su di te
:)
Ciao, Sandro

:)
Sentimento reciproco ;-)
