Ciao Narciso.
Dal codice non capisco molto.
Puoi allegate tutto il file?
Ad intuito il problema sta o.materie[combobox1.itemindex];
Stilgar
Sto provando ad implementare una lista di oggetti per non avere le limitazioni degli array, ma mi sono infognato.
Ho letto il suggerimento nel sito, ma usa record e puntatori, io avrei usato una classe.
...
Premetto che non ho usato mai le liste e anche con le classi faccio a cazzotti.... se qualcuno di buon cuore volesse aiutrami... mi servirebbe il modo per assegnare i dati di un form ad un oggetto tlezione...e magari acapire poi come accedervi e salvare i dati su file....
nei tipi che hai dichiarato non vedo metodi, i record li vedrei più adatti
per leggere/scrivere da file puoi prendere spunto da quì
http://stackoverflow.com/questions/5763247/simple-read-write-record-dat-file-in-delphi (http://stackoverflow.com/questions/5763247/simple-read-write-record-dat-file-in-delphi)
se invece preferisci le classi, tramite RTTI puoi salvare su file quasi automaticamente, devi dichiarare le proprietà sotto *published*
esempio:
type
tlezione=class
private
Fmateria: tmateria; // <- questa riga è gestita automaticamente con: Ctrl+Alt+C
published
...
property materia:tmateria read Fmateria write FMateria;
...
end;
Ciao Narciso,
tempo fa mi sono scontrato anch'io con le limitazioni degli array e alla fine ho trovato un modo estremanete semplice ed utile per implementare le SstringList.
Innanzitutto bisogna definire il type dell'oggetto base che associeremo alle StringList:
(in questo esempio creo una stringlist con associato un integer di nome indice e del testo)
type
Tindice = class
private
fIndice: integer;
fTesto : string;
public
property indice : integer read fIndice;
property testo : string read fTesto;
constructor Create(const _indice : integer; const _testo:string);
end;
quindi creo la lista ed aggiungo alcuni elementi
lista=TStringList.Create;
lista.AddObject('prima riga della lista',TIndice.Create(12,'PRIMO ELEMENTO'));
lista.AddObject('seconda riga della lista',TIndice.Create(53,'SECONDO ELEMENTO'));
lista.AddObject('terza riga della lista',TIndice.Create(22,'TERZO ELEMENTO'));
se ora voglio accedere al contenuto di un elemento della lista, conoscendone l'index:
writeln(inttostr(TIndice(lista.Objects[1]).indice));
writeln(TIndice(lista.Objects[1]).testo);
ed otterrò:
53
SECONDO ELEMENTO
se invece voglio cercare l'indice nella lista cui corrisponde un determinato testo uso questa funzione
function cerca_indice(Items:TStrings; testo_da_cercare:string):integer;
var n:integer;
i:TIndice;
begin
for n:=0 to Items.Count-1 do begin
i := Items.Objects[n] as TIndice;
if i.testo=testo_da_cercare then begin
Result:=n;
exit;
end;
end;
Result:=-1;
end;
ad esempio:
writeln(inttostr(cerca_indice(lista,'TERZO ELEMENTO')));
darà come risultato 2
e alla fine, per pulire tutto
for i:=0 to lista.Count -1 do lista.Objects[i].Free;
lista.Clear;
Spero possa aiutarti!