Delphi - Variable Array

 
Vista:

Variable Array

Publicado por BigLuis (463 intervenciones) el 10/05/2003 17:54:14
¿Como le asigno a una variable -- Nombre: array [0..29] of char-- el contenido de un TEdit por ejemplo sin que de el error incompatible tipo Array y TCaption?.
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Variable Array

Publicado por M@rceloL (213 intervenciones) el 12/05/2003 05:42:25
En realidad, sería conveniente usar una variable de tipo String, en vez de un arreglo de caracteres, pero lo que pedís se puede hacer así:

Asumo que la longitud de la cadena está en la posición 0 del arreglo.

var ind:byte;

Editor.caption:='';

for ind:=1 to ord(arreglo[0]) do
Editor.Caption:=Editor.Caption + arreglo[ind];

Espero te sirva. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Es justo lo contrario

Publicado por BigLuis (463 intervenciones) el 12/05/2003 08:18:25
No quiero asignar al TEdit el contenido de la variable, que se puede hacer directamente, sino asignar el contenido del TEdit a la variable. El problema es que la variable forma parte de un packetRecord ya construido y no puedo cambiar su estructura.
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Es justo lo contrario

Publicado por Diego Romero (636 intervenciones) el 12/05/2003 08:57:01
¿Qué tal así?
var
S: string;
I: integer;
begin
S:='';
for i:=0 to 29 do S:=S+Arreglo[i];
Edit1.Caption:=S;
...
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

QUE ES LO CONTRARIO!!!!!

Publicado por Ernesto De Spirito (706 intervenciones) el 12/05/2003 10:24:49
>>>> asignar el contenido del TEdit a la variable

1) Si se trata de una cadena terminada en nulo, se haría así:

var
Nombre: array [0..29] of char;
begin
StrLCopy(Nombre, PChar(Edit1.Text), sizeof(Nombre)-1);

2) Si se trata de una cadena que se rellena con espacios:

var
Nombre: array [0..29] of char;
n: integer;
begin
FillChar(Nombre, sizeof(Nombre), ' ');
n := Length(Edit1.Text);
if n > sizeof(Nombre) then n := sizeof(Nombre);
Move(PChar(Edit1.Text)^, Nombre, n);
end;

3) Si se trata de una cadena cuya longitud real se pasa o se devuelve de alguna forma (como es el caso con algunas APIs de Windows):

var
Nombre: array [0..29] of char;
n: integer;
begin
n := Length(Edit1.Text);
if n > sizeof(Nombre) then n := sizeof(Nombre);
Move(PChar(Edit1.Text)^, Nombre, n);
// n tiene el tamaño realmente usado del arreglo
end;

4) Si se trata de una de las viejas cadenas del Pascal:

var
Nombre: array[0..29] of char;
Nombre2: string[29];
begin
Nombre2 := Edit1.Text;
Move(Nombre2, Nombre, sizeof(Nombre));
end;

Espero que te sirva.

Ernesto De Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ya que estamos...

Publicado por Ernesto De Spirito (706 intervenciones) el 12/05/2003 10:50:31
Si fuera pasar la variable al TEdit:

A) La propiedad de tipo TCaption a la que se refiere BigLuis seguro que es Text, pues los TEdit no tienen una propiedad llamada Caption.

B) Hay una forma más fácil que ejecutar un ciclo For para cargar el string en base a los datos de un arreglo:

1) Si fuera una cadena terminada en nulo:

var
Nombre: array[0..29] of char;
begin
Edit1.Text := String(Nombre);
end;

2) Si fuera una cadena rellenada con espacios:

var
Nombre: array[0..29] of char;
s: string;
begin
SetString(s, Nombre, sizeof(Nombre));
Edit1.Text := RightTrim(s);
end;

3) Si fuera una cadena tipo Pascal:

var
Nombre: array[0..29] of char;
s: string;
begin
SetString(s, PChar(@Nombre[1]), Ord(Nombre[0]));
Edit1.Text := s;
end;

4) Si fuera una cadena de la que se conoce la longitud:

var
Nombre: array[0..29] of char;
s: string;
begin
SetString(s, Nombre, Longitud);
Edit1.Text := s;
end;

Espero que les sirva.

Ernesto De Spirito
http://www.latiumsoftware.com/es/index.php
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Gracias a todos

Publicado por BigLuis (463 intervenciones) el 12/05/2003 20:58:52
Muchas gracias a todos, pero era exactamente lo que ha contestado Ernesto, asignar una cadena a una variable, no leer en una cadena una variable. El asunto es que estoy practicando con las cabeceras de los ficheros MP3 y sus etiquetas tienen el formato que mencioné y una longitud en bites determinada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

A quien le interese

Publicado por BigLuis (463 intervenciones) el 13/05/2003 16:22:54
Por si le interesa a alguien:
Esta es la cabecera de un fichero MP3 (Varia segun la version, esta es la ID3 tag 1).
type
TID3Rec = packed record
Tag : array[0..2] of Char;
Title,
Artist,
Comment,
Album : array[0..29] of Char;
Year : array[0..3] of Char;
Genre : Byte;
end;
y este es parte del procedimiento para tellenar el registro utilizando un metodo de Ernesto D`spirito (mejor dicho juntando dos)
var
ID3Nueva : TID3Rec;
Titulo,Artista,Album,Comentario:String;
Ano:String;
n:Integer;
Genero:Byte;
const
Etiqueta='TAG';

begin
//para evitar que añada al final caracteres no deseados
//FillChar(ID3Nueva.Tag, sizeof(ID3Nueva.Tag), ' ');
n:=0;
FillChar(ID3Nueva.Tag, sizeof(ID3Nueva.Tag), ' ');
n := Length(Etiqueta);
if n > sizeof(ID3Nueva.Tag) then n := sizeof(ID3Nueva.Tag);
Move(PChar(Etiqueta)^, ID3Nueva.Tag, n);

Titulo:=Trim(edTitle.Text);
n:=0;
FillChar(ID3Nueva.Title, sizeof(ID3Nueva.Title), ' ');
n := Length(Titulo);
if n > sizeof(ID3Nueva.Title) then n := sizeof(ID3Nueva.Title);
Move(PChar(Titulo)^, ID3Nueva.Title, n);
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

A quien le interese (sigue)

Publicado por BigLuis (463 intervenciones) el 13/05/2003 16:24:25
Y este el procedimiento de escritura de la etiqueta (TAG).
y este el procedimiento de escritura. (El fichero no puede estar abierto)
var
fMP3: file of Byte;
OldID3 : TID3Rec;
begin
try
AssignFile(fMP3, mp3FileName);
Reset(fMP3);
try
Seek(fMP3, FileSize(fMP3) - 128);
BlockRead(fMP3, OldID3, SizeOf(OldID3));
if OldID3.Tag = 'TAG' then
{ Replace old tag }
Seek(fMP3, FileSize(fMP3) - 128)
else
{ Append tag to file because it doesn't exist }
Seek(fMP3, FileSize(fMP3));
BlockWrite(fMP3, NewID3, SizeOf(NewID3));
finally
end;
finally
CloseFile(fMP3);
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar