Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   problema de linea memo (https://www.clubdelphi.com/foros/showthread.php?t=2605)

migueilichenco 30-07-2003 19:22:06

problema de linea memo
 
hola a todos bueno escribo este problem que tengo en delphi es el siguiente yo quiero poder tener un texto.txt del cual colocar una lista de cadenas para luego poder llamrlas desde mi programa con un memo una por una segun algun orden, no quiero toda la lista sino una que yo elija de la lista no se si es por el numero o como agradeceria su respuesta

German C. C. 30-07-2003 21:39:44

En vez de un TXT, ¿no te iria bien utilizar un INI para cargar una linea determinada del archivo de texto?

marto 30-07-2003 21:53:05

No querría resultar insolente pero..... yo no he entendido nada de la pregunta..... ¿no crees que algún signo de puntuación ayudaría?
Piensa que si los foristas no te entienden, difícilmente te podrán ayudar.

migueilichenco 30-07-2003 22:48:44

bueno disculpen mi faltas de escritura, pero bueno como decia en mi posta anterior, no se si sabran como hacer para utilizar un txt, o un ini para almacenar cadenas y como puedo hacer para llamarlas desde mi programa una por una, a un memo segun un numero o o algo asi agradeceria su ayuda

andres1569 30-07-2003 23:32:42

Hola:

Como te han comentado más arriba, puede almacenarlas en un archivo .INI (da igual la extensión, puedes usar la que quieras, el caso es que uses un objeto TIniFile para leerlo), que permite almacenar los valores de la forma:

[ANIMALES]
1=Perro
2=Gato
3=Elefante
...

Puedes usar el método ReadString del objeto TIniFile:

Código:

function ObtieneNombreAnimal (Numero: Integer) : String;
begin
  with TIniFile.Create ('C:\MiArchivo.ini') do
  try
    result := ReadString ('ANIMALES', IntToStr(Numero), '');
  finally
    Free;
  end;
end;

Con esta opción accedes al archivo en disco cada vez que quieres obtener un valor.

Otra opción es que recuperes todos los valores de una sección (dentro del archivo .INI, la sección viene indicada entre corchetes []), mediante ReadSection del objeto TIniFile, lo cual copia los valores en una lista, del tipo TStrings o descendiente; de esta forma cargas los valores en memoria y su acceso es más rápido; luego puedes consultar esos valores accediendo a la propiedad VALUES de dicha lista:

Código:

ListaAnimales : TStringList;

// este procedimiento lo llamas al principio para cargar la lista
// acuérdate al cerrar el programa de liberarla: ListaAnimales.Free;
procedure CargaListaAnimales;
begin
  if ListaAnimales = nil then
    ListaAnimales := TStringList.Create;
  with TIniFile.Create ('C:\MiArchivo.ini') do
  try
    ReadSection ('ANIMALES', ListaAnimales);
  finally
    Free;
  end;
end;

function ObtieneNombreAnimal (Numero: Integer) : String;
begin
  result := ListaAnimales.Values[IntToStr(Numero)];
end;

En este último ejemplo, hemos declarado una variable ListaAnimales del tipo TStringList. También hubieras podido usar la propiedad Items de un TListBox y cargar en dicho TListBox las cadenas, quizás sea una forma mejor que utilizar un TMemo. Sería así:

Código:

procedure CargaListaAnimales;
begin
  with TIniFile.Create ('C:\MiArchivo.ini') do
  try
    ReadSection ('ANIMALES', ListBox1.Items);
  finally
    Free;
  end;
end;

function ObtieneNombreAnimal (Numero: Integer) : String;
begin
  result := ListBox1.Items.Values[IntToStr(Numero)];
end;


migueilichenco 31-07-2003 00:43:17

bueno tras hacer lo que dise el codigo me sale el siguiente error, que no esta declarado Tinifileni, ni reacsection, ni result que puedo hacer, les agradeceria si me mandan un codigo mas especifico gracias

andres1569 31-07-2003 00:53:55

Hola:

Creo que el código es bastante específico para lo que preguntas, pero faltó decirte que para utilizar el objeto TIniFile debes incluir en el uses la unit IniFiles (esta información la da también la ayuda de Delphi, en la ayuda de cada clase aparece la unit donde se declara). No es reacsection sino ReadSection, ésto venía bien en el código que te puse.

Result: ahí metí la pata porque no pinta nada esa variable dentro de un procedure, y además el método ReadSection no devuelve ningún valor. Lo correcto es:

ReadSection ('ANIMALES', ListaAnimales); // a secas

y

ReadSection ('ANIMALES', ListBox1.Items); // a secas

Mira a ver si ahora te funciona. Voy a corregirlo en el mensaje anterior para que quede más claro.

migueilichenco 31-07-2003 03:30:43

bueno este es el codigo
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IniFiles, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ListaAnimales : TStringList;
implementation


{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
procedure CargaListaAnimales;
begin
with TIniFile.Create ('C:\archivo.ini') do
try
ReadSection ('ANIMALES', ListBox1.Items);
finally
Free;
end;
end;


function ObtieneNombreAnimal (Numero: Integer) : String;
begin
result := ListBox1.Items.Values[IntToStr(1)];
end;

end.
pero que esta mal por que me sale begin expectante de un end y ya trate de ponerle y nada :( agradeceria su comprension

roman 31-07-2003 05:01:41

Tu código:

procedure TForm1.Button1Click(Sender: TObject);
procedure CargaListaAnimales;
begin
with TIniFile.Create ('C:\archivo.ini') do
try
ReadSection ('ANIMALES', ListBox1.Items);
finally
Free;
end;
end;

function ObtieneNombreAnimal (Numero: Integer) : String;


Código indentado:

Código:

procedure TForm1.Button1Click(Sender: TObject);
  procedure CargaListaAnimales;
  begin
    with TIniFile.Create ('C:\archivo.ini') do
    try
      ReadSection ('ANIMALES', ListBox1.Items);
    finally
      Free;
    end;
  end;

function ObtieneNombreAnimal (Numero: Integer) : String;

Y aquí se ve más claro que falta el end del procedimiento Button1Click, suponiendo, claro, que la intención realmente era la de poner un pprocedimiento anidado. Quizá más bien querías poner:

Código:

procedure CargaListaAnimales;
begin
  with TIniFile.Create ('C:\archivo.ini') do
  try
    ReadSection ('ANIMALES', ListBox1.Items);
  finally
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  CargaListaAnimales;
end;

// Saludos

migueilichenco 31-07-2003 18:27:12

bueno tras colocar el codigo sale una exepcion asie sta el codigo

var
Form1: TForm1;
ListaAnimales : TStringList;
implementation
function ObtieneNombreAnimal (Numero: Integer) : String;
begin
result := ListaAnimales.Values[IntToStr(Numero)];
end;
{$R *.dfm}

procedure TForm1.CargaListaAnimales;
begin
if ListaAnimales = nil then
ListaAnimales := TStringList.Create;
with TIniFile.Create ('C:\may.ini') do
try
ReadSection ('ANIMALES', ListaAnimales);
finally
Free;
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.text:=(ObtieneNombreAnimal(1))
end;

En si lo que yo deseo hacer es llamar digamoslo asi con un numero un memo alojada en una cadena digamos si yo digo 1 bine la palabra hola

1 hola
2 como estas

y asi susesivamente, aunque no es nesesario que sean numero pero que ahiga forma de llamar a cada cadena

roman 31-07-2003 22:48:17

Veo algunos problemas:

1. Tu código no está indentado por lo que es difícil leerlo. Por favor utiliza la etiqueta [ code ] para que preserve los espacios:

[ code ]
Código:

Linea
  Linea indentada

[ /code ]

Aquí la etiqueta tiene espacios alrededor para que se vea pero debes ponerla sin espacios.

Usando la etiqueta, los debidos espacios y líneas en blanco tu código queda así:

Código:

var
  Form1: TForm1;
  ListaAnimales : TStringList;

implementation

function ObtieneNombreAnimal (Numero: Integer) : String;
begin
  result := ListaAnimales.Values[IntToStr(Numero)];
end;

{$R *.dfm}

procedure TForm1.CargaListaAnimales;
begin
  if ListaAnimales = nil then
    ListaAnimales := TStringList.Create;

  with TIniFile.Create ('C:\may.ini') do
    try
      ReadSection ('ANIMALES', ListaAnimales);
    finally
      Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  memo1.lines.text:=(ObtieneNombreAnimal(1))
end;

2. No indicas en qué momento sale la excepción ni cuál es ésta. El problema podría ser que llamas a Button1Click antes de CargaListaAnimales lo que implicaría que ListaAnimales aún no ha sido creada.

3. En Button1Click asignas una cadena a la propiedad Text del memo. La propiedad Text reune en conjunto todas las líneas del memo y no estoy seguro de que eso es lo que desees. Quizá prefieras algo como

memo1.lines.add(ObtieneNombreAnimal(1));

4. En general no entiendo muy bien qué es lo que pretendes pero pareciera que deseas asignar una clave (número u otra cosa) a cada cadena para luego poder desplegar la cadena refiriéndote a ella mediante dicha clave. Esto podría hacerse mejor utilizando alguna base de datos. Puedes usar ClientDataSets sin conectarlos a ninguna base "real" y te funciona bien.

// Saludos

pd: Por favor no me tomes a mal lo del código. Es sólo que cuesta trabajo leer código que no está indentado.

migueilichenco 01-08-2003 00:45:05

y para saber cuantas lineas tiene una memo

migueilichenco 01-08-2003 00:49:44

bueno en si lo que estoy haciendo es una especie de Iabot mejor dicho un bot para charlar pero todo lo que les pido es pra que se le pueda enseñar al bot y que este lo almacene en un ini o un txt es decir si tu escribes hola y en su inio txt la cdana hola tiene hola que tal entonces esa cadena se carga al memo entienden?

migueilichenco 01-08-2003 02:03:22

hasta ahora creo que esta bien pero ahora se me presenta la siguiente dificultad

digamos que tengo un memo asi
----------------
1=niño
2=perro
3=casa
9=malo
4=avion
8=amigo
----------------

y quiero que si yo pongo el numero 9 en un edit y de clic a un button entonces aparesca en otro memo la linea "malo" o "9=malo" espero averme dejado entender gracias

andres1569 01-08-2003 12:49:01

Hola:

Supongamos que en el Edit1 alguien escribe el número 9. Para añadir al segundo Memo la línea del Memo original relacionada, bastaría con el siguiente código:

MemoDestino.Lines.Add (MemoOrigen.Lines.Values[Edit1.Text]);

¿Hay algo que no entiendas de este código?. La clave está en la propiedad vectorial VALUES, a la que le pasas el primer miembro de la igualdad y busca en la lista alguna cadena donde aparezca, y te devuelve el segundo miembro de la igualdad. Si tenemos 9=malo, entonces Values['9'] devuelve malo, que es lo que añadimos al segundo Memo.


La franja horaria es GMT +2. Ahora son las 00:46:13.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi