Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
ListView corta el texto

Hola a todos de nuevo, sigo probando cosas con los listview y me surgen algunos problemillas. En principio, puedo agregar correctamente nuevos elementos, pero cuando se cargan desde un archivo, se trunca la longitud del texto por lo que no aparece con la misma cantidad de caracteres que tenían cuando se agregaron los elementos.

Adjunto dos imagenes, en la primera se muestra todo el texto completo (ojo, fijaros en el último elemento del listview). En la segunda imagen, se ve como se cortan las cadenas de texto.

Otra cosa es que en la longitud del listview, uso "-1" para que el ancho de las columnas sea igual que la longitud del texto.

IMAGEN 1


IMAGEN 2


El código que guarda los elementos del listview, lo encontre buscando información por la web y es este (por si sive de ayuda):
Código Delphi [-]
procedure TForm1.SaveListViewToFile(AListView: TListView; sFileName: string);
var
  idxItem, idxSub, IdxImage: Integer;
  F: TFileStream;
  pText: PChar;
  sText: string;
  W, ItemCount, SubCount: Word;
  MySignature: array [0..2] of Char;
begin
  // Inicio
  with Lista do
  begin
    ItemCount := 0;
    SubCount  := 0;
    //****
    MySignature := 'LVF';
    //  ListViewFile
    F := TFileStream.Create(save.FileName, fmCreate or fmOpenWrite);
    F.Write(MySignature, SizeOf(MySignature));

    if Items.Count = 0 then
      // List is empty
      ItemCount := 0
    else
      ItemCount := Items.Count;
    F.Write(ItemCount, SizeOf(ItemCount));

    if Items.Count > 0 then
    begin
      for idxItem := 1 to ItemCount do
      begin
        with Items[idxItem - 1] do
        begin
          // Guardamos los SubItems
          if SubItems.Count = 0 then
            SubCount := 0
          else
            SubCount := Subitems.Count;
          F.Write(SubCount, SizeOf(SubCount));
          // Guardamos el Index
          IdxImage := ImageIndex;
          F.Write(IdxImage, SizeOf(IdxImage));
          // Guardamos la Caption
          sText := Caption;
          w     := Length(sText);
          pText := StrAlloc(Length(sText) + 1);
          StrPLCopy(pText, sText, Length(sText));
          F.Write(w, SizeOf(w));
          F.Write(pText^, w);
          StrDispose(pText);
          if SubCount > 0 then
          begin
            for idxSub := 0 to SubItems.Count - 1 do
            begin
              // Guardamos los Items y SubItems
              sText := SubItems[idxSub];
              w     := Length(sText);
              pText := StrAlloc(Length(sText) + 1);
              StrPLCopy(pText, sText, Length(sText));
              F.Write(w, SizeOf(w));
              F.Write(pText^, w);
              StrDispose(pText);
            end;
          end;
        end;
      end;
    end;
    F.Free;
  end;
end;

Y el código que carga los elementos desde un archivo este:
Código Delphi [-]
procedure TForm1.LoadListViewToFile(AListView: TListView; sFileName: string);
var
  F: TFileStream;
  IdxItem, IdxSubItem, IdxImage: Integer;
  W, ItemCount, SubCount: Word;
  pText: PChar;
  PTemp: PChar;
  MySignature: array [0..2] of Char;
  sExeName: string;
begin
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;

    sExeName := ExtractFileName('registro.cvs');

    if not FileExists('registro.cvs') then
    begin
      MessageBox(Handle, PChar(Format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F := TFileStream.Create('registro.cvs', fmOpenRead);
    F.Read(MySignature, SizeOf(MySignature));

    if MySignature <> 'LVF' then
    begin
      MessageBox(Handle, PChar(Format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F.Read(ItemCount, SizeOf(ItemCount));
    Items.Clear;

    for idxItem := 1 to ItemCount do
    begin
      with Items.Add do
      begin
        // Leemos el Index
        F.Read(SubCount, SizeOf(SubCount));
        // Re Leemos el Index
        F.Read(IdxImage, SizeOf(IdxImage));
        ImageIndex := IdxImage;
        // Leemos el Caption
        F.Read(w, SizeOf(w));
        pText := StrAlloc(w + 1);
        pTemp := StrAlloc(w + 1);
        F.Read(pTemp^, W);
        StrLCopy(pText, pTemp, W);
        Caption := StrPas(pText);
        StrDispose(pTemp);
        StrDispose(pText);
        if SubCount > 0 then
        begin
          for idxSubItem := 1 to SubCount do
          begin
            F.Read(w, SizeOf(w));
            pText := StrAlloc(w + 1);
            pTemp := StrAlloc(w + 1);
            F.Read(pTemp^, W);
            StrLCopy(pText, pTemp, W);
            Items[idxItem - 1].SubItems.Add(StrPas(pText));
            StrDispose(pTemp);
            StrDispose(pText);
          end;
        end;
      end;
    end;

    F.Free;
  end;
end;

Luego en un botón hace la llamada al procedimiento guardar datos del listview y en el evento oncreate, los carga al iniciar el programa.

¿Alguien puede ayudarme? ¿alguna sugerencia?

Un saludo y gracias.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
  #2  
Antiguo 07-11-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Cita:
En la segunda imagen, se ve como se cortan las cadenas de texto.
Yo veo que las cadenas son iguales.
La diferencias es que la última línea no está.
¿En dónde ves tu la diferencia donde se cortan las cadenas?
Responder Con Cita
  #3  
Antiguo 07-11-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
hola, tienes razón, no me fijé en eso, de todos modos fijate en la columna "claves generadas" de la segunda imagen, las cadenas deberían ser igual de largas que en la imagen 1 (me refiero a la columna que contiene las claves). Con el nombre del archivo de la columan "archivo vinculado" pasa lo mismo, debería ser "claves64.exe" y solo aparece "claves" y con el resto de columnas pasa lo mismo, trunca o corta la cadena de texto.

Por si fuera poco, en la columna "archivo vinculado" en la primera fila, aparece "clavesTahoma", y te juro por dios que no se por que aparece el nombre de la fuente cuando en níngun momento se le pasa por ningun parametro, pero en fin, ahora no pasa eso aunque sigue cortando las cadenas de todas las columnas.

Digamos que la imagen 1 muestra los datos recien se introducen en los campos edit, en la imagen 2, los muestra una vez cargados desde archivo.

Gracias por responder.

Edito: Pongo una nueva imagen por que ahora si que me volví loco del todo.



Encima de cortar las cadenas que ya estaban antes y que carga de un archivo, ahora en la ultima fila, en vez de ser "claves64.exe", pone simbolos chinos!!

Tiene pinta de ser un error de delphi o no sé, no entiendo nada.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.

Última edición por danielmj fecha: 07-11-2014 a las 18:35:51.
Responder Con Cita
  #4  
Antiguo 07-11-2014
Avatar de danielmj
danielmj danielmj is offline
Miembro
 
Registrado: jun 2011
Posts: 383
Poder: 13
danielmj Va por buen camino
Acabo de darme cuenta de otra cosa, cada vez que uso alguna de las pieles que delphi trae preinstaladas para las aplicaciones, ejecuto, luego vuelvo a cambiar la piel de la aplicación y pongo la del sistema y vuelvo a ejecutar, se altera el contenido del listview, no sé si tiene relación con el hecho de que corte las cadenas, pero si que aparezcan simbolos extraños o la palabra "name" en la columna de claves. como acaba de pasarme ahora mismo.

Voy a probar con lazarus a ver.
Un saludo.
__________________
La juventud pasa, la inmadurez se supera, la ignorancia se cura con la educación, y la embriaguez con la sobriedad, pero la estupidez dura para siempre. Aristofanes.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Crear fecha corta rufo Varios 2 16-03-2010 17:42:30
como agregar texto a un listview kurono Varios 4 10-11-2009 04:23:23
Se corta el texto mostrado en la StatusBar Eyewitness Varios 0 22-08-2008 09:29:36
Premio novela corta Investment Humor 2 24-02-2005 14:23:14


La franja horaria es GMT +2. Ahora son las 21:04:11.


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
Copyright 1996-2007 Club Delphi