Newsgroup: it.comp.lang.delphi
Titolo: Convertire una stringa in un intero

Salve,
vorrei convertire una stringa in un intero univoco.
Ho trovato una funzione che potrebbe fare al caso mio, purtroppo il Result 
può essere fuori range
Questa è la funzione
type
  UInt64 = 0..9223372036854775807;
function Unc(s: string): UInt64;
var
  x: Integer;
begin
  Result := 0;
  for x := 1 to Length(s) do Result := Result + ((Ord(s[x])) shl ((x - 1) * 
8));
end;
Come posso fare per avere un integer come conversione?
Grazie
Andrea 

 vorrei convertire una stringa in un intero univoco.
Non è possibile.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Quello che voglio è dare un ID univoco ad ogni programma in esecuzione sul 
PC. L' ID però deve essere sempre lo stesso per lo stesso programma.
Come posso fare?
"Andrea Laforgia" <x...@xx.xx> ha scritto nel messaggio 
news:fi9nkc$8ol$1...@news.newsland.it...


 Come posso fare?
Genera un GUID (lo puoi fare anche nell'IDE di Delphi con CTRL+SHIFT+G, 
se non ricordo male la combinazione) e utilizzalo come "identificatore" 
per la tua esigenza.
Ciao,
   Marco.
-- 
MARCO BREVEGLIERI
  (
http://www.marco.breveglieri.name
)

 Questa è la funzione
dipende come sono le stringhe e quanto sono lunghe....
es. se la stringa comprende solo lettere dalla a alla z puoi creare
una base simile a quella esadecimale ed eseguire i calcoli.
Ovviamente la lunghezza dell'intero deve essere compresa nel tipo di
intero che usi...
Es. alfabeto italiano
a=1
b=2
c=3
....
i=9
l=10
...
z=21
aa=22+1=23
az=22+21=43
etc...
etc. usa algoritmo di conversione dei numeri per cambiare base...

 Come posso fare?
Parti da 1 e prosegui fino a che non esaurisci i numeri naturali.
O c'è qualche vincolo che impone di non avere numeri interi come ID?
Poi bisogna capire che intendi con "ID uguale per lo stesso programma":
sono i processi a girare sul PC e puoi avere più processi per lo stesso
programma...


Il problema è questo:
Ho una unit standard comune a tutti i miei programmi.
In questa unit controllo che il programma installato sia stato attivato in 
base a un codice che rilascio successivamente all'acquisto del programma da 
parte del cliente. Il codice che rilascio all'utente lo calcolo in base a 
diversi parametri tra cui il seriale dell'Hard disk su cui è installato il 
software (per evitare copie su altri PC).
Il sistema funziona. L'unico problema è che con questo sistema due programmi 
diversi sullo stesso hard disk hanno lo stesso codice di attivazione. Vorrei 
risolvere aggiungendo ai parametri di calcolo un ID univoco per ogni 
programma diverso. Non voglio però settare questo ID manualmente all'interno 
dei programmi.
L'idea era quella di leggere all'avvio del programma il nome programma es. 
"programma.exe", convertirlo in un intero univoco e fare i miei calcoli e 
verifiche.
Dico intero perchè la mia funzione di calcolo è già pronta ma richiede però 
un integer e siccome è abbastanza complessa non volevo rimetterci mano.
questa unit che ho trovato sarebbe stata perfetta ma il range è troppo 
elevato e ho verificato che quasi sempre sforo gli integer
type
  UInt64 = 0..9223372036854775807;
function Unc(s: string): UInt64;
var
  x: Integer;
begin
  Result := 0;
  for x := 1 to Length(s) do Result := Result + ((Ord(s[x])) shl ((x - 1) *
8));
end;
Spero di essere stato chiaro.
Se non dovessi trovare soluzione alla fine vedrò di aggiungere un ID 
all'interno di ogni programma anche se non mi piace molto perchè vorrei che 
fosse tutto automatico ed indipendente.
Grazie mille
Andrea
"Andrea Laforgia" <x...@xx.xx> ha scritto nel messaggio 
news:fibk2t$gqi$1...@news.newsland.it...


Mi sembra una soluzione assurda...
In ogni caso risolvi vedendo quanto è grande il programma su disco...
Size del file... Anche perchè se uno rinomina il programma lo usa alla
grande... Magari capisce anche per caso cosa hai fatto o leggendo
questo NG.
Ciao

Oppure ancora meglio calcolando il checksum del programma... Forse
trovi qualcosina in giro...
Okkio al SIZE cerca di non essere troppo preciso per differenze nelle
diverse versioni di windows.


come altra variabile puoi utilizzare la data e l'ora di creazione
dell'eseguibile sicuramente diversa per le due applicazione, ciao
Brunello

 ha scritto nel messaggio 
news:0bd17dfb-e6f4-4d83...@g30g2000hsb.googlegroups.com...


A questa non avevo pensato..
non è affatto male come idea
Ciao Andrea


 Brunello
Il metodo più sicuro è il check sum... Viene utilizzato anche da
programmi di installazione di software molto famosi...
guarda qui:
http://www.explainth.at/en/delphi/chksums.shtml
La data di creazione è una buona idea ma può essere cambiata, mentre
il size del file o il checksum no. Il checksum è un po' più
complicato.