Newsgroup: it.comp.lang.delphi
Titolo: [esiste già la funzione] 3 caratteri in un range...

Salve gente!
Prima di smazzarmi a riscrivere una funzione che magari esiste già, 
chiedo a voi se esiste (e come si chiama)...
Mettiamo che ho questa lista di "identificativi" (non importa come...la 
carico da file, magari la metto in un'array...bho...poi vedo...)
 
il formato è "da - a" (da=3 caratteri,-, a=3 caratteri)
 
prima colonna   corrispondente
 
AAA-ALZ 	United States of America
AMA-AOZ 	Spain
APA-ASZ 	Pakistan (Islamic Republic of)
ATA-AWZ 	India (Republic of)
AXA-AXZ 	Australia
AYA-AZZ 	Argentine Republic
A2A-A2Z 	Botswana (Republic of)
A3A-A3Z 	Tonga (Kingdom of)
A4A-A4Z 	Oman (Sultanate of)
A5A-A5Z 	Bhutan (Kingdom of)
...-...
...-...		la lista è parecchio lunga...
...-...
9VA-9VZ 	Singapore (Republic of)
9WA-9WZ 	Malaysia
9XA-9XZ 	Rwandese Republic
9YA-9ZZ 	Trinidad and Tobago
 
 
e devo cercare una mia "stringa" (ad esempio) "A5B" e mi deve restituire 
il numero di riga o "Bhutan (Kingdom of)" o -1 se non esiste in lista...
Insomma...spero di esser stato chiaro... :P
 
Qualche idea se esiete una funzione che faccia al caso mio? (devo ancora 
iniziare tutto....ma non sarà qualcosa di complesso...un'utility molto 
semplice alla quale passo il mio "nominativo" di 3 caratteri e mi 
restituisce lo stato corrispondente).
 
Grazie per l'attenzione!

io ipotizzerei una cosa del simile ( è solo un abbozzo ).
Se la struttura è fissa di lunghezza, altrimenti devi cercare i 
delimitatori.
 
 
 
unit Unit1;
 
interface
 
uses
   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
 
type
   TForm1 = class(TForm)
     procedure FormCreate(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
     app : Array[1..10] of string;
   end;
 
var
   Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
 
procedure TForm1.FormCreate(Sender: TObject);
Function Cerca(txt:String;Var Ritorna : String):Integer;
Var Ch1, Ch2 : String;
     c1,
     Numero : Integer;
Begin
   Numero := -1;
   Ritorna := '';
   For c1 := 1 to 10 do
   Begin
     Ch1 := Copy(App[c1],1,3);
     Ch2 := Copy(App[c1],5,3);
     if (txt>=ch1)and(txt<=Ch2) Then
     Begin
       Numero := c1;
       Ritorna := app[c1];
       Delete(Ritorna,1,12);
       break;
     End;
 
   End;
   Cerca := Numero;
End;
 
Var txt : String;
     x : Integer;
begin
   app[1] := 'AAA-ALZ     United States of America';
   app[2] := 'AMA-AOZ     Spain';
   app[3] := 'APA-ASZ     Pakistan (Islamic Republic of)';
   app[4] := 'ATA-AWZ     India (Republic of)';
   app[5] := 'AXA-AXZ     Australia';
   app[6] := 'AYA-AZZ     Argentine Republic';
   app[7] := 'A2A-A2Z     Botswana (Republic of)';
   app[8] := 'A3A-A3Z     Tonga (Kingdom of)';
   app[9] := 'A4A-A4Z     Oman (Sultanate of)';
   app[10] := 'A5A-A5Z     Bhutan (Kingdom of)';
 
   x := Cerca('A5B',txt);
   Caption := IntToStr(x)+ ' ' + txt;
end;
 
end.
 
 
 
ciao.
 
-- 
-------------------------------
per scrivere in privato
togliere "1975nosp"
 
to reply remove "1975nosp"
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 

Trovo raccapricciante che nel 2015 siamo ancora a pensare "procedurale" e non OO, che ancora stiamo a pensare ad array e non a liste etc.
 
Una TStringList è in grado di gestire delle coppie chiave=valore.
Ma tra i metodi di tstringlist non c'è un find che funzione come serve a te
Per maggiori dettagli sai gia dove guardare.
 
Io creerei una classe che eredita da tstringlist (o magari una classe che INCAPSULA tramite information hiding una stringlist.
Questa classe implementa un metodo findsuffix nel quale incapsulare il codice per fare il parse
TStringList ha anche un metodo LoadFromFile, ma se il tuo file non è nella forma chiave=valore ti tocca implementare anche un metodo specifico per fare la load.
Comuqque entrambe le cose sono veramente banali.
 
Tutto ciò si basa ovviamente (ma non per tutti) su un presupposto:
 
che la tua lista abbia un numero di elementi inferiore grosso modo a 25.000...
Se ne hai di più, la tstringlist potrebbe collassare e a quel punto IO penserei ad una soluzione alternativa che preveda il NON uso di persistenza in memoria.
 
A.
 

Prima di tutto vorrei ringraziare entrambi,
poi è bene che fare chiarezza su alcune cose che mi son dimenticato di 
dire...
 
1) I record da gestire non supereranno MAI i 1500
2) Ho trovato una bellissima funzione..."CompareStr"...che anche se 
obsoleta...fa il suo sporco dovere...(mi scorro la lista e faccio le 
comparazioni...al massimo sono 100/200 comparazioni...)
 
Ora chiedo...per un'utility veramente terra terra ( meno di un'ora tra 
studio e realizzazione...con così pochi record da gestire...vale la pena 
o no evitare l'oo ed usare i record/tstringlist,etc...?
 
Lo chiedo proprio perchè per me è stata la prima cosa che mi è saltata 
in mente...magari la prossima volta prendo la via dell'oo e delle classi.
 
Chiedo lumi a voi!
 
Grazie infinite ad entrambi!
 
 

 o no evitare l'oo ed usare i record/tstringlist,etc...?
 
Diciamo che se eviti la OOP pur conoscendola solo per "fare prima" e ne sei consapevole, allora è un conto. :)
 
Il discorso più che altro da fare è quale "respiro" ha l'applicazione che stai facendo.
 
Anche a me è capitato di dover fare un'applicazione "una tantum" dalla vita breve e in quel caso ci sta "tagliare" un pochino, anche se onestamente penso sempre sia più conveniente gestire una lista di oggetti piuttosto che un array dinamico di record, per dirne una.
 
In breve, non c'è una risposta precisa al tuo quesito: accertati di conoscere l'OOP perché senz'altro è uno strumento indispensabile, poi a seconda dei requisiti e dei tuoi tempi di realizzazione, parti per la strada più adatta tenendo però in considerazione tutto e facendo una scelta consapevole.
 
Ciao,
  Marco.
 
-- 
MARCO BREVEGLIERI (Software and Web Developer)
 #Home: 
http://www.marco.breveglieri.name
 
 #Blog: 
http://www.compilaquindiva.com
 
 #DelphiPodcast: 
http://www.delphipodcast.com
 

 Trovo raccapricciante che nel 2015 siamo ancora a pensare "procedurale" e non OO [...]
 
Conosco persone che potrebbero trovare raccapricciante che stiamo a pensare in modalità OOP e non "funzionale". Non c'è mai limite al meglio, o al peggio. :D


 modalità OOP e non "funzionale". 
 
 
Con tutto il rispetto, sono affari LORO.
 
Ovviamente (ma non per tutti) dipende come minimo dal device, dal sistema operativo e dal tipo di applicazione.
 
Ma suggerire un approccio strutturato nel 2015, per un qualcosa di c/s, in delphi, per windows......tanto vale tornare a vb6, no?
 
 
A.

 Ovviamente (ma non per tutti) dipende come minimo dal device, dal sistema operativo e dal tipo di applicazione.
 
Quello che intendevo dire è che l'OOP è un tassello fondamentale ma non è detto che non ci siano scenari (più che device o sistema) dove stili di programmazione adatti alla risoluzione di un particolare problema sorpassino la OOP rendendola "obsoleta".
 
Come sempre, dipende da cosa bisogna fare.


 Conosco persone che potrebbero trovare raccapricciante che stiamo a pensare in modalità OOP e non "funzionale". Non c'è mai limite al meglio, o al peggio. :D
 
Funzionale non e` alternativo all'object-oriented. Quello funzionale e` un paradigma che viene normalmente usato anche in linguaggi OO (vedi Java 8, JavaScript, Python, etc...)
 
 

 o no evitare l'oo ed usare i record/tstringlist,etc...?
 
Dipende. Io tendo a scrivere sempre codice test-driven (l'UNICO modo valido di scrivere codice oggi, a mio parere). E quindi il codice prende automaticamente forma come OO. Scrivere i test ti aiuta sempre a non perdere troppo tempo in debug per utility minuscole. Vale la pena non usare un approccio OO solo per utility veramente minuscole, con una logica veramente semplice (per intenderci, qualcosa che sia appena sopra le potenzialita` di un linguaggio di scripting del SO). Ma per cose minimamente piu` complesse, l'approccio da preferire e` sempre tests + codice OO.
 
 

 Funzionale non e` alternativo all'object-oriented. Quello funzionale e` un paradigma che viene normalmente usato anche in linguaggi OO (vedi Java 8, JavaScript, Python, etc...)
 
Era per dire che ho visto programmi scritti in Haskell di tutto rispetto, ad esempio, che rimangono leggibili e manutenibili ma non fanno uso di una classica architettura OOP, con superclassi, discendenti, metodi virtuali, ecc.
 
Il citato JavaScript è un altro esempio di costrutti che sono diversi da quelli classici OOP: per implementare l'ereditarietà in quel linguaggio ci sono da fare i salti mortali.


 Il citato JavaScript è un altro esempio di costrutti che sono diversi da quelli classici OOP: per implementare l'ereditarietà in quel linguaggio ci sono da fare i salti mortali.
 
Mi riferivo all'aspetto funzionale di JavaScript, che convive benissimo con il paradigma object-based. Il fatto che in un linguaggio non si possa/debba implementare l'ereditarieta` tradizionale della OOP non e` necessariamente un difetto. L'ereditarieta` e` sempre stato un aspetto controverso della programmazione OO.