Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

visualizar imagenes

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: visualizar imagenes Responder citando

Hola a todos, tengo un código que sólo funciona con imágenes en .bmp, al tratar de abrir imágenes en .jpg me salta un error en pantalla que no sé que significa:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   String dir = "C:";
   if (SelectDirectory("Elige carpeta:","",dir)) {
      FileListBox1->Directory = dir;
      FileListBox1->ItemIndex = 0;
      for (int i = 0; i <FileListBox1>Count; i++) {
         lis->Add(FileListBox1->FileName);
         FileListBox1->ItemIndex++;
      }
      if (lis->Count>0) {
         Graphics::TBitmap* resBmp;
         TJPEGImage *ImagenJpg = new TJPEGImage();
         TListItem *Item;
         String extension;
         for (int i = 0; i <lis>Count; i++) {
            extension = ExtractFileExt(lis->Strings[i]);
            if ((extension.UpperCase()==".JPG")||(extension.UpperCase()==".JPEG")){
               ImagenJpg->LoadFromFile(lis->Strings[i]);
                    resBmp->Height = ImageList1->Height;
               resBmp->Width = ImageList1->Width;
               ImageList1->Masked = false;
               ImagenJpg->DIBNeeded();
               resBmp->Assign(ImagenJpg);
               ImageList1->Add(resBmp,NULL);
               Item = ListView1->Items->Add();
               Item->Caption = ExtractFileName(lis->Strings[i]);
               Item->ImageIndex = i;

            }
            else {
               if (extension.UpperCase()==".BMP") {
                        resBmp = new Graphics::TBitmap();
                  resBmp->Height = ImageList1->Height;
                  resBmp->Width = ImageList1->Width;
                  ImageList1->Masked = false;
                  resBmp->LoadFromFile(lis->Strings[i]);
                  ImageList1->Add(resBmp,NULL);
                  Item = ListView1->Items->Add();
                  Item->Caption = ExtractFileName(lis->Strings[i]);
                  Item->ImageIndex = i;
               }
            }
         }
      }
      else {
         ShowMessage("No hay archivos válidos en el directorio.");
      }
   }
}

_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Ya lo tengo Responder citando

Paso la solución por si a alguien le interesa:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String dir = "C:";
    if (!SelectDirectory("Elige carpeta:","",dir))
        return;

    dir = IncludeTrailingPathDelimiter(dir);

    TSearchRec sr;
    if (FindFirst(dir + "*.*", faAnyFile & ~faDirectory, sr) == 0) {
        do {
            if ((sr.Attr & faDirectory) == 0)
                lis->Add(dir + sr.Name);
        }
        while (FindNext(sr) == 0);
        FindClose(sr);
    }

    if (lis->Count == 0) {
        ShowMessage("No hay archivos válidos en el directorio.");
        return;
    }

    Graphics::TBitmap *resBmp = NULL;
    Graphics::TBitmap *ImagenBmp = NULL;
    TJPEGImage *ImagenJpg = NULL;
    try {
        TRect r = Rect(0, 0, ImageList1->Width, ImageList1->Height);
        TGraphic *resGraphic;
        TListItem *Item;
        String extension;
        int index;

        for (int i = 0; i <lis>Count; ++i) {
            extension = ExtractFileExt(lis->Strings[i]).UpperCase();
            if ((extension == ".JPG") || (extension == ".JPEG")) {
                if (!ImagenJpg) {
                    ImagenJpg = new TJPEGImage;
                }
                ImagenJpg->LoadFromFile(lis->Strings[i]);
                ImagenJpg->DIBNeeded();
                resGraphic = ImagenJpg;
            }
            else if (extension == ".BMP") {
                if (!ImagenBmp) {
                    ImagenBmp = new Graphics::TBitmap;
                }
                ImagenBmp->LoadFromFile(lis->Strings[i]);
                resGraphic = ImagenBmp;
            }
            else {
                continue;
            }
            if (!resBmp) {
            resBmp = new Graphics::TBitmap();
            resBmp->SetSize(r.Width(), r.Height());
            }
            resBmp->Canvas->StretchDraw(r, resGraphic);
            index = ImageList1->Add(resBmp, NULL);
            Item = ListView1->Items->Add();
            Item->Caption = ExtractFileName(lis->Strings[i]);
            Item->ImageIndex = index;
        }
    }
    __finally {
        delete resBmp;
        delete ImagenBmp;
        delete ImagenJpg;
    }


}

_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ahora no me funciona; Abre las imágenes correctamente dentro del ListView pero al ir a cambiarles el tamaño con el siguiente código desaparece la imagen y se queda sólo el nombre del archivo, el tamaño se ve que va cambiando pero como digo la imagen no está.
En un Spinnbutton tengo el siguiente código para cambiar el tamaño:
Código:

ImageList1->Width++;
ImageList1->Height++;

Alguien tiene alguna idea?
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No es para C ++ Builder, pero creo que sirve como explicación:

https://stackoverflow.com/questions/43301283/how-to-change-existing-imagelist-image-size-of-listview
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Felip, lo único que entiendo es que hay que cambiar el tamaño antes de añadir las imágenes, se que se podría hacer con funciones pero ahora no se me ocurre como Sad .
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Usted necesita mejorar el código. Cambie el evento onclick:

Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{

    String dir = "C:";
    if (!SelectDirectory("Elige carpeta:","",dir))
        return;

lis->Clear();
ListView1->Clear();

    dir = IncludeTrailingPathDelimiter(dir);

    TSearchRec sr;
    if (FindFirst(dir + "*.*", faAnyFile & ~faDirectory, sr) == 0) {
        do {
            if ((sr.Attr & faDirectory) == 0)  {
           
              String extension = ExtractFileExt(dir + sr.Name).UpperCase();
              if ((extension == ".JPG") || (extension == ".JPEG")  || (extension == ".BMP")) {
                lis->Add(dir + sr.Name);
              }
            }
        }
        while (FindNext(sr) == 0);
        FindClose(sr);
    }

    if (lis->Count == 0) {
        ShowMessage("No hay archivos válidos en el directorio.");
        return;
    }

    Graphics::TBitmap *resBmp = NULL;
    Graphics::TBitmap *ImagenBmp = NULL;
    TJPEGImage *ImagenJpg = NULL;
    try {
        TRect r = Rect(0, 0, ImageList1->Width, ImageList1->Height);
        TGraphic *resGraphic;
        TListItem *Item;
        String extension;
        int index;

        for (int i = 0; i <lis>Count; ++i) {
            extension = ExtractFileExt(lis->Strings[i]).UpperCase();
            if ((extension == ".JPG") || (extension == ".JPEG")) {
                if (!ImagenJpg) {
                    ImagenJpg = new TJPEGImage;
                }
                ImagenJpg->LoadFromFile(lis->Strings[i]);
                ImagenJpg->DIBNeeded();
                resGraphic = ImagenJpg;
            }
            else if (extension == ".BMP") {
                if (!ImagenBmp) {
                    ImagenBmp = new Graphics::TBitmap;
                }
                ImagenBmp->LoadFromFile(lis->Strings[i]);
                resGraphic = ImagenBmp;
            }
            else {
                continue;
            }
            if (!resBmp) {
            resBmp = new Graphics::TBitmap();
            //resBmp->SetSize(r.Width(), r.Height());
            resBmp->Width = r.Width();
            resBmp->Height = r.Height();
            }
            resBmp->Canvas->StretchDraw(r, resGraphic);
            index = ImageList1->Add(resBmp, NULL);
            Item = ListView1->Items->Add();
            Item->Caption = ExtractFileName(lis->Strings[i]);
            Item->ImageIndex = index;
        }
    }
    __finally {
        delete resBmp;
        delete ImagenBmp;
        delete ImagenJpg;
    }
}



He utilizado el BCB6 que no tenía SetSize. No es necesario cambiar esa parte de su código.


Unit.h:

Código:

...
        __fastcall TForm1(TComponent* Owner);
...
        void __fastcall newWidthHeight(int IncDec);
...



unit.cpp:

Código:

...



void __fastcall TForm1::newWidthHeight(int IncDec)
{
   ListView1->Clear();
   ImageList1->Width+=IncDec;
   ImageList1->Height+=IncDec;

    Graphics::TBitmap *resBmp = NULL;
    Graphics::TBitmap *ImagenBmp = NULL;
    TJPEGImage *ImagenJpg = NULL;
    try {
        TRect r = Rect(0, 0, ImageList1->Width, ImageList1->Height);
        TGraphic *resGraphic;
        TListItem *Item;
        String extension;
        int index;

        for (int i = 0; i <lis>Count; ++i) {
            extension = ExtractFileExt(lis->Strings[i]).UpperCase();
            if ((extension == ".JPG") || (extension == ".JPEG")) {
                if (!ImagenJpg) {
                    ImagenJpg = new TJPEGImage;
                }
                ImagenJpg->LoadFromFile(lis->Strings[i]);
                ImagenJpg->DIBNeeded();
                resGraphic = ImagenJpg;
            }
            else if (extension == ".BMP") {
                if (!ImagenBmp) {
                    ImagenBmp = new Graphics::TBitmap;
                }
                ImagenBmp->LoadFromFile(lis->Strings[i]);
                resGraphic = ImagenBmp;
            }
            else {
                continue;
            }
            if (!resBmp) {
            resBmp = new Graphics::TBitmap();
            //resBmp->SetSize(r.Width(), r.Height());
            resBmp->Width = r.Width();
            resBmp->Height = r.Height();
            }
            resBmp->Canvas->StretchDraw(r, resGraphic);
            index = ImageList1->Add(resBmp, NULL);
            Item = ListView1->Items->Add();
            Item->Caption = ExtractFileName(lis->Strings[i]);
            Item->ImageIndex = index;
        }
    }
    __finally {
        delete resBmp;
        delete ImagenBmp;
        delete ImagenJpg;
    }     

}





CSpinButton:
Código:


void __fastcall TForm1::CSpinButton1UpClick(TObject *Sender)
{
   newWidthHeight(+1);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinButton1DownClick(TObject *Sender)
{
  newWidthHeight(-1);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muchas gracias Felip, ha funcionado a la perfección Laughing estoy en deuda.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno siguen los problemas.
He logrado pasar a una variable tipo String la ruta del archivo seleccionado en el ListView y a la hora de ejecutarlo con ShellExecute no lo ejecuta porque a la variable le falta una barra invertida "\", es decir sólo tiene una y debería tener dos. He probado con StringReplace pero no logro capturar dicho carácter. He probado un montón de cosas pero no doy con la solución.
Se trata de crear un FileName a partir del archivo seleccionado.
Agradeceré una ayuda.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:
   AnsiString str = Listview ...;
   ShellExecute(0, "open", str.c_str() , "", "", SW_SHOWMAXIMIZED);
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ya lo había probado pero sigue sin funcionar. Este es el código que tengo ahora mismo y no me funciona:
Código:

void __fastcall TForm1::ListView1DblClick(TObject *Sender)
{
   String item_seleccionado = ListView1->Items->Item[ListView1->Selected->Index]->Caption;
   String arc = ExpandFileName(item_seleccionado);
   ShellExecute(NULL,L"open",arc.w_str(),NULL,NULL,SW_SHOWNORMAL);
}

_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No use "String". Use "AnsiString" ... c_str()

...

Para insertar un nuevo caracter '\' en la ruta:

https://cppbuilder.es/viewtopic.php?t=4470
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Nada sigue sin abrirlo.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Yo estaba usando BCB6.

Ahora probé su código con el C++Builder 10.3 y se ejecutó normal.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ok, muchas gracias de todas maneras seguiré haciendo pruebas.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Tugui prueba asi:

Código:

  String link = "";
  link = "https://www.youtube.com/";
  ShellExecute(NULL, L"open", link.c_str(), NULL, NULL, SW_SHOWNORMAL);


he puesto una direccion web, ya tu ajustalo a tus datos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.