Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Delphi - da Tmemo a una matrice
Forum - Delphi - da Tmemo a una matrice

Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Segnala al moderatore
Postato alle 23:06
Venerdė, 17/09/2010
salve,

supponiamo che abbia creato un comune file TXT dal contenuto di una matrice numerica, distanziando i valori con "#9".

la mia domanda ora  č questa:
ricaricando questo file in un oggetto TMemo, come posso reinserirlo nella matrice?

es. file
10.3 1.08 22.0 36.6
10.2 32.1 25.3 25.0
10.3 1.08 22.0 36.6
10.2 32.1 25.3 25.0

PM
Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 14:27
Domenica, 19/09/2010
la tua soluzione non va, mi da errore nel tipo di variabile "Text", ma siccome a me serviva qualcosa non da console ma attraverso un TMemo ho optato per:

Codice sorgente - presumibilmente Delphi

  1. var matrice : array of array of real; numero:string;
  2.     i,j,jj:integer;
  3. begin
  4.   //dimensioni matrice
  5.   SetLength(matrice,3,3);
  6.   //lettura dati
  7.   for I := 0 to memo1.Lines.Capacity - 1 do
  8.   begin
  9.     //azzera le variabili
  10.     j:=0;
  11.     numero:='';
  12.     //gira la riga contenente i numeri
  13.     for jj := 1 to Length(memo1.Lines[i]) do
  14.     begin
  15.       //se trova un distanziatore TAB
  16.       if (memo1.Lines[i][jj]=#9)  then
  17.       begin
  18.         //prende il numero
  19.         Matrice[i,j]:=StrToCurr(numero);
  20.         //incrementa la posizione
  21.         j:=j+1;
  22.         //pulisce il numero
  23.         numero:='';
  24.       end  //aggiunge una cifra al numero
  25.       else numero:=numero+memo1.Lines[i][jj];
  26.       //per l'ultimo valore
  27.       if (jj=Length(memo1.Lines[i])) then Matrice[i,j]:=StrToCurr(numero);
  28.     end;
  29.   end;
  30. end;


PM
Avatar
systemgvp (Normal User)
Expert


Messaggi: 296
Iscritto: 14/04/2008

Up
1
Down
V
Segnala al moderatore
Postato alle 15:48
Sabato, 18/09/2010
e cosa dovrei usare?

per me sono i pių comodi visto che sono una delle poche cose "universali" che leggono tutti i pc e i sistemi operativi.

Il mio problema č che finora ero costretto a mettere i valori in singole riche per ciascun valore.

mi potresti postare un pezzo di codice per il problema a cui mi hai risposto?

PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 23:53
Venerdė, 17/09/2010
Per riconoscere un numero, basta fare la conversione da stringa a tipo numerico.
Per suddividere i valori, basta considerare il carattere divisore (#9).

Il mio consiglio č quello di non utilizzare i file di testo per questo genere di lavoro.

Ultima modifica effettuata da Poggi Marco il 17/09/2010 alle 23:54
PM
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 20:54
Sabato, 18/09/2010
Una valida alternativa ai file di testo sono i file binari.
Con essi č possibile "formattare" i dati come si vuole, accedere direttamente ad una determinata posizione del file e modificare i campi nel file.

Posto due funzioni per i file testueli; una in grado di scrivere e l' altra di leggere numeri su file di testo.

In scrittura:
Codice sorgente - presumibilmente Delphi

  1. procedure scrivi(var g:text); // in g ho un riferimento ad un file aperto
  2.   var n:double;
  3.   begin
  4.     writeln('Scrttura di valori su file di testo');
  5.     writeln('Inserire in valore negativo per terminare');
  6.     repeat
  7.       write('Numero -> ');
  8.       readln(n);
  9.       if n>0 then  writeln(g, n); // utilizzo il carattere invio come divisore
  10.     until n<0;
  11.   end;



in lettura:
Codice sorgente - presumibilmente Delphi

  1. procedure leggi(var g:text); // in g ho un riferimento ad un file aperto
  2.   var n:double;
  3.   num:string;
  4. begin
  5.    writeln;
  6.    writeln('Lettura del file di testo:');
  7.    writeln;
  8.    reset(g); // mi posiziono all' inizio del file
  9.    while not eof(g) do
  10.    begin
  11.     readln(g, num);
  12.     delete(num, 1, 1); // elimino il primo carattere
  13.     n:=StrToFloat(num);
  14.     writeln(n:8:3);
  15.    end;
  16. end;


Ultima modifica effettuata da Poggi Marco il 18/09/2010 alle 20:55
PM