Newsgroup: it.comp.lang.delphi
Titolo: Case xxx of

Ciao a tutti,
ma perchè nella Case di delphi non c'è verso di farla funzionare con
stringhe????
AIUTOOOOOOO !!!!
E' possibile che ogni volta che devo fare una serie di condizioni devo per
forza farmele con le if e le else if ????
Qui sotto allego il mio codice....se può servire....Sbaglio forse qualche
cosa?
    case Components[I].ClassType.ClassName of
      'TADOQuery': ShowMessage('Query') ;
      'TADODataSet': ShowMessage('DataSet') ;
    end;
// DOVE :
// Components[I].ClassType.ClassName è una ShortString
// che può assumere il valore di  :   'TADOQuery', 'TADODataSet'....e molti
altri...
GRAZIEEEEEEE 1000000000000
Ciaox

 cosa?
Purtroppo e' cosi'.. Il case funziona solo con i tipi ordinali, quindi
niente stringhe.
Ciao !                {MSX}
--
{MSX}  -  
http://msx.rules.it
Mantenitore delle FAQ di it.comp.lang.delphi,
reperibili qui: 
http://gpi.infomedia.it/abc/delphi/FaqDelphi.txt

8...(((      (sigh...sigh...)
Non c'č proprio modo???
Grazie .
Ciaox

 Non c'è proprio modo???
No, non c'e' modo.
Il case funziona solo con i tipi ordinali, quelli
che e' possibile gestire, a basso livello, con 
registri del processore, per intenderci.
Il problema si risolve, adottando una tecnica hash.
-- 
Posted from  [80.105.34.80] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Hash crea solo problemi (hai presente una cosa chiamata colisioni?).
Una bella IF inidata č molto meglio... ci sono meno inpicci da fare...
Il Razziatore,
The Only Good Windows in an uninstalled Windows
-----------------------------------------------
E-MAILs : IlRazziat...@NOSPAMnetscape.net
WEB     : 
http://www.razziatore.dns2go.com/
ICQ     : 67552596

Hash crea solo problemi (hai presente una cosa chiamata colisioni?).
Che intendi per collisioni?
----
Lawrence "Rhymes" Oluyede
rhy...@myself.com

Una bella IF inidata č molto meglio... ci sono meno inpicci da fare...
Una "bella" IF annidata (non "inidata") e' proprio cio' che
si vuol evitare.
p.s.: posso farti una domanda sincera ? sei dislessico ?
Te lo chiedo senza alcuna vena offensiva, cerco solo di
capire perche' i tuoi messaggi sono sempre farciti di parole
incomprensibili e soffrono sempre la mancanza di qualche
doppia ("colisioni" al posto di "collisioni", "inidata" al
posto di "annidata", "inpicci" al posto di "impicci", ecc..)

ehehahhahahhahaaaha! :)


Che intendi per collisioni?
Una collisione avviene quando due stringhe hanno la stessa
"firma" numerica.
Supponi, per esempio, di avere una semplice funzione hash:
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
function HashFunc(S: String): Integer;
var
  I: Integer;
begin
  Result := 0;
  for I := 1 to Length(S) do
  begin
    Result := Result + Ord(S[I]);
  end;
end;
begin
  WriteLn('barca   ---> ', HashFunc('barca'));
  WriteLn('armadio ---> ', HashFunc('armadio'));
  WriteLn('nuvola  ---> ', HashFunc('nuvola'));
  WriteLn('lavagna ---> ', HashFunc('lavagna'));
  WriteLn('valanga ---> ', HashFunc('valanga'));
  ReadLn;
end.
L'output e':
barca   ---> 505
armadio ---> 733
nuvola  ---> 661
lavagna ---> 730
valanga ---> 730
Come vedi, nel caso delle parole "lavagna" e "valanga", c'e'
una collisione, perche' la loro firma numerica e' la stessa.
L'array che, quindi, conterra' le stringhe, sara', in
realta', un array di liste concatenate ed avra' gli
elementi:
 [505] = barca
 ...
 ... 
 ...
 [661] = nuvola
 ...
 ...
 [730] = lavagna ---> valanga
 ... 
 [733] = armadio
(Ovviamente la funzione hash che ho usato e' banale e non
puo' essere usata per cose serie).

Mmm ciò che mi hai spiegato già lo conoscevo, collisione intesa come
produzione di firma numerica identica date due stringhe diverse.
Comunque si presupponeva l'utilizzo di un algoritmo che non producesse
risultati identici, no?


risultati identici, no?
Difficilmente si riesce ad avere una funzione hash che non
produca risultati identici in qualche caso, ma questo non e'
un problema.  E' tutto gestibile.

Una bella IF inidata č molto meglio... ci sono meno inpicci da fare...
Cosě sei costretto ogni volta a confrontare le stringhe. Invece con gli 
hash fai il calcolo una volta sola (anche prima della compilazione - 
peccato non poterlo fare *durante*, il compilatore, ahimč, non arriva ad 
ottimizzare fino a questo punto), e poi si tratta di confrontare solo 
interi: cosa che si puň fare direttamente con poche instruzioni del 
processore (molto piů veloce). Inoltre, cosě, a naso, sospetto che i 
case siano leggermente piů ottimizzati degli if
-- 
Nato nel vizio, morto nel supplizio
Nato nel peccato, ad entrare sia invitato

 sei dislessico ?
Molti non sanno neache cosa significhi...


per esempio 10) è molto + facile ed veloce un IF annidata.
Peccato che sia molto poco efficiente.
Confrontare delle stringhe implica dei meccanismi di
scorrimento della memoria che possono occupare un tempo
variabile (tipicamente O(n) ciascuna).  Confrontare degli
interi, invece, e' molto piu' veloce.  Il calcolo della
chiave viene compiuto una sola volta.

 variabile (tipicamente O(n) ciascuna).
Ahh, arrestate quest' uomo che applica le teorie di algoritmi e strutture
dati! ;-)
Odio quei calcoli ...
--
- Carlo -
c.b...@libero.it

(parere iper personale)
Che faresti bene a rivedere. L'idea per cui l'eleganza del codice sia
solo fine a se stessa non c'e' + neanche alla Microsoft
--
Piero Bonanno
bop...@libero.it
pie...@tiscalinet.it
bpie...@hotmail.com
______________________________________________
"Madame, lei ha tra le gambe uno strumento
che puo' offrire piacere a migliaia di persone,
e tutto quello che sa fare e' grattarlo"
- Sir Thomas Beechan a una violoncellista


ripeto il risparmio di tempo in questo caso e del tutto
trascurabile...
le cose cambiano in un DB ma questo non lo č


trascurabile...
Ripeto: intervieni solo quando hai dati alla mano per
dimostrare che quanto dici e' vero.
Discussione chiusa da parte mia.

Discussione chiusa da parte mia.
Io non la volevo neache aprire...
Tutto quello che dico io puo' essere spagliato al 100% (tranne sul
pascal che lo consoco da moooooooolti anni) percui non prendetelo
molto sul serio :o)
Io sto qui per imparare da quelli + bravi di me e ad aiutare quelli -
bravi. Non mi credo un Guru o qualcosa del genere (e si vede dalle mie
domande tipo quella sulle Classi e sugli Object).


 
potrebbe essere una soluzione?
Ciao, Antò.


Uhm... (A meno che non mi confonda con VB) tempo fa c'era stata una
discussione ed era saltato fuori che il risultato era equivalente...
Ciaotutti,
*

 Non c'è proprio modo???
Se non importa l'efficienza si puo' fare caricando le stringhe 'label'
in una tstringlist; una volta che si ha la stringa da usare come
SelectorExpression si prende l'IndexOf della stringa e si usa quello
invece della stringa. Analogamente, le label caseList_i saranno da
sostituire con i relativi indici della stringlist.
Alternativamente, puoi sempre progettare una classe che prenda in pasto
una stringa e restituisca un puntatore allo statement associato (o
direttamente lo esegua).
Saluti
Paolo Arosio

Grazie a tutti....
risolto tutto con una serie di IF ed ElseIF
tanto erano solo una "sporca manciata" di IF   d'altronde. :)
Ciaox
Luca