Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   consegir el nombre de un archivo abierto con un openpicturedialog (https://www.clubdelphi.com/foros/showthread.php?t=79754)

danyfebrero 07-08-2012 22:43:38

consegir el nombre de un archivo abierto con un openpicturedialog
 
hola
Me hace falta conseguir el nombre de la jpg que abrí con el OpenPictureDialog.
Utilicé este codigo pero no funcionó, no sé si será por el Windows 8 o que no lo hice bien.

procedure TForm1.Button1Click(Sender: TObject);
begin
if not OpenPictureDialog1.Execute then Exit;
Label1.Caption:=OpenPictureDialog1.FileName;
Label2.Caption:=OpenPictureDialog1.Title;
Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);

end;

Antes el OpenPictureDialog1.Title me daba el nombre del archivo pero ahora se me queda en blanco.
Gracias de antemano
Dany

Casimiro Notevi 07-08-2012 22:47:39

Cita:

Empezado por danyfebrero (Mensaje 439036)
Label1.Caption:=OpenPictureDialog1.FileName; // <---------------------- ahí, en FileName ;)


Por cierto, recuerda poner los tags al código fuente, ejemplo:



Gracias :)

danyfebrero 07-08-2012 22:55:46

gracias otra vez

el resultado que me da Filename es la ruta completa con el nombre del archivo y la extención pero lo que me interesa es solo el nombre del archivo.
FileName me devuelve: c:\imágenes\foto001.jpg pero lo que necesito es que me devuelva solo foto001, que era lo que hacias title, pero no me funciona.
saludos y gracias

roman 07-08-2012 22:57:00

Es como dice Casimiro. FileName te da el nombre del archivo. Title no da, y que yo sepa nunca ha dado, el nombre del arcivo. Title es el texto que aparece en la barra de título de la ventana del cuadro de diálogo.

// Saludos

roman 07-08-2012 22:57:30

Cita:

Empezado por danyfebrero (Mensaje 439041)
FileName me devuelve: c:\imágenes\foto001.jpg pero lo que necesito es que me devuelva solo foto001, que era lo que hacias title, pero no me funciona.

Entonces usa la función ExtractFileName:

Código Delphi [-]
Label1.Caption:=ExtractFileName(OpenPictureDialog1.FileName);

// Saludos

danyfebrero 07-08-2012 23:25:49

gracias roman.
si tienes razon en los 2 comentarios.
probe con ExtractFileName y funciono bien me devuelve foto001.jpg, disculpa si sigo preguntando pero como pudiera quitarle la extension, porque lugo cuando convierta el jpg no va tener la misma extension.
gracias nuevamente

ecfisa 07-08-2012 23:58:44

Hola.

ExtractFileName devuelve el nombre y extensión, ExtractFilePath la ruta y ExtractFileExt la extensión.

Conozco dos modos de obtener lo que buscas, este es uno:
Código Delphi [-]
var
  NomSinExt: string;
begin
  NomSinExt:= Copy(ExtractFileName(NomArch), 1, Pos(ExtractFileExt(NomArch),ExtractFileName(NomArch))-1);
  ...

O más simple, aunque confuso por el nombre de la misma, con la función ChangeFileExt:
Código Delphi [-]
var
  NomSinExt: string;
begin
  NomSinExt:= ChangeFileExt(ExtractFileName(NomArch), '');
  ...

Saludos.

Edito: En los ejemplos NomArch equivale a OpenPictureDialog1.FileName.

danyfebrero 08-08-2012 00:06:23

gracias ecfisa eso solucionó mi problema, muchas gracias. saludos dany

aldemar.bohorqu 13-10-2012 03:38:38

¿Cómo guardar la ruta completa de una imagen en un archivo *.txt? (c++ builder)
 
He estado intentando y no he podido. Lo estoy haciendo así:


//---------------------------------------------------------------------------
void __fastcall TForm2::I1Click(TObject *Sender)
{
//Al darle click a la imagen (I1)

if(OpenPictureDialog1->Execute())
{
I1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
LE1->Text=OpenPictureDialog1->FileName; //La ruta es mostrada en un LabelEdit
}
}
//---------------------------------------------------------------------------

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

//archivo *.txt generado con un botón

cadena=Form1->LE1->Text + "\n"; //AnsiString cadena; (variable public)


ofstream escribir("Datos/imagen.txt",ios::app); //#include <fstream.h> (clase para leer ofstream)
escribir<<cadena.c_str();
escribir.close();

//---------------------------------------------------------------------------




LO hago así pero no me genera el archivo *.txt. No se que será.
Gracias.

Casimiro Notevi 13-10-2012 10:24:42

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)


Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

escafandra 14-10-2012 10:24:53

El error lo tienes en el nombre de tu archivo. Primero debe existir la carpeta Datos, segundo escribir bien la ruta. Tu has puesto "Datos/imagen.txt", no es correcto, la ruta sería "Datos\imagen.txt". El C/C++ el cáracter '\' es un carácter de control, en el código fuente, con lo que si quieres usarlo (ruta de un archivo) debes ponerlo duplicado ("Datos\\imagen.txt"):

Código:

#include <fstream.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //archivo *.txt  generado con un botón

  cadena=Form1->LE1->Text + "\n";  //AnsiString cadena; (variable public)
 
  ofstream escribir("Datos\\imagen.txt", ios::app);
  escribir<<cadena.c_str();
  escribir.close();
}


Saludos.

aldemar.bohorqu 16-10-2012 05:29:00

¿Por qué no genera el archivo *.txt?
 
Igual no lo hace. Lo que quiero realmente es:

En la primera forma: pedirle el nombre al usuario (en un LabelEdit), que escoja una opción del RadioGroup (soltero, casado, divorciado o viudo), y que agregue cualquier foto desde la pc. Todo eso almacenarlo en un archivo *.txt para después ser consultado.

En la segunda forma: consultar cualquier nombre que que el usuario quiera, y cuando sea consultado mostrar todos los datos (nombre, estado civil) con su respectiva foto.

Eso es lo que quiero, pero cuando agrego la foto no me genera el archivo *.txt. Si no cargo la foto si lo genera. No se por que será.

Espero su pronta ayuda. Gracias.

ecfisa 16-10-2012 06:48:46

Hola aldemar.bohorqu.

Creo que debo haber entendido mal... ¿ Estas diciendo que queres guardar el nombre, el estado civil y la foto todo junto en el archivo de texto ?

Saludos.

Delphius 16-10-2012 17:08:35

Pregunto, ¿Y desde cuando es posible incrustar una imagen en un archivo de texto? :rolleyes:
Un .txt no es un .doc que se le puede poner imágenes, tablas, colores, etc.

Saludos,

Casimiro Notevi 16-10-2012 17:18:01

Cita:

Empezado por Delphius (Mensaje 447237)
Pregunto, ¿Y desde cuando es posible incrustar una imagen en un archivo de texto? :rolleyes:
Un .txt no es un .doc que se le puede poner imágenes, tablas, colores, etc.
Saludos,

Sin embargo, sí se puede codificar en base64 (por ejemplo) para "convertirla" a texto.

ecfisa 16-10-2012 19:41:35

Cita:

Empezado por Casimiro Notevi (Mensaje 447240)
Sin embargo, sí se puede codificar en base64 (por ejemplo) para "convertirla" a texto.

Así pienso también, pero implica una complejidad que podría evitarse tomando los datos como campos de una tabla por ejemplo.

De allí mi pregunta, por que dado el tipo de aplicación que comenta aldemar.bohorqu, no parecía necesario que se guardase en ese formato, pero ya nos dirá él...

Saludos. :)

escafandra 16-10-2012 20:47:27

A mi me llama la atención este comentario:
Cita:

Empezado por aldemar.bohorqu (Mensaje 447204)
...pero cuando agrego la foto no me genera el archivo *.txt. Si no cargo la foto si lo genera...

El que se cree el archivo debería ser independiente de lo que escribamos en él, esté bien o mal... No debería depender de que "cargue" o no, una foto.

Habría que ver que código real está usando para todo lo que expone y que errores se muestran.


Saludos.

aldemar.bohorqu 17-10-2012 02:22:07

Re-formulación de la pegunta
 
Cita:

Empezado por ecfisa (Mensaje 447210)
Hola aldemar.bohorqu.

Creo que debo haber entendido mal... ¿ Estas diciendo que queres guardar el nombre, el estado civil y la foto todo junto en el archivo de texto ?

Saludos.

ecfisa, disculpa no haber formulado con detalles la pregunta. La foto puede ser guardada en cualquier carpeta donde se encuentre el proyecto con formato .bmp o .jpg, lo importante es que en la segunda forma cuando se vaya a consultar se muestren todos los datos con su respectiva foto.

ecfisa 17-10-2012 10:30:09

Hola aldemar.bohorqu.

Una forma bastante sencilla de hacerlo es:
  • Al form que tiene el TLabeledEdit y el TRadioGroup, agregale un TPanel y dentro de él un TImage.
  • A la propiedad Caption del TPanel ponele un texto como "Click para cargar foto" y ajusta su tamaño a gusto.
  • Pone la propiedad Streetch del TImage = true y la propiedad Align = alClient para que ocupe toda la superficie del panel.
  • Agrega dos TButton uno para añadir datos y otro para mostrarlos.
Código:

#include <fstream>
#include <string>
#define AGENDA "C:\\AGENDA.TXT"

using namespace std;

AnsiString PhotoName = "";

void __fastcall TForm1::LabeledEdit1Enter(TObject *Sender) {
  PhotoName = "";
  LabeledEdit1->Text = "";
  RadioGroup1->ItemIndex = -1;
  Image1->Picture = NULL;
}

void __fastcall TForm1::Image1Click(TObject *Sender) {
  if (OpenPictureDialog1->Execute()) {
    PhotoName = OpenPictureDialog1->FileName;
    Image1->Picture->LoadFromFile(PhotoName);
  }
}

void __fastcall TForm1::btnGuardarClick(TObject *Sender) {
 ofstream agenda;
 AnsiString s;

 s = LabeledEdit1->Text + "," +
  RadioGroup1->Items->Strings[RadioGroup1->ItemIndex] + "," +
  PhotoName;

 agenda.open(AGENDA, ios::out | ios::app);
 agenda << s.c_str() << endl;
 agenda.close();
}


void __fastcall TForm1::btnMostrarClick(TObject *Sender) {
  string str = LabeledEdit1->Text.c_str();
  if (str.size()) {
    ifstream agenda;
    agenda.open(AGENDA, ios::in);
    string line;
    size_t found = string::npos;

    while (agenda.good() && found == string::npos) {
      getline(agenda, line, '\n');
      found = line.find(str);
    }

    if (found != string::npos) {
      TStrings *TS = new TStringList;
      __try {
        TS->Delimiter = ',';
        TS->DelimitedText = line.c_str();
        RadioGroup1->ItemIndex = RadioGroup1->Items->IndexOf(TS->Strings[1]);
        Image1->Picture->LoadFromFile(TS->Strings[2]);
      }
      __finally {
        delete TS;
      }
    }
    agenda.close();
  }
}

Toma en cuenta que es un código orientativo y no realiza comprobación de tipo alguno, por ejemplo te permite guardar varios nombres iguales

Saludos.

Edito: Por algún motivo el mensaje quedó truncado a las primeras líneas y no me dí cuenta hasta ahora, disculpas.

aldemar.bohorqu 18-10-2012 03:31:48

Agradeciendo, y una nueva pregunta.
 
ecfisa, muchas gracias. Lo hice muy parecido y si corre.

Ahora me surge una nueva pregunta. Si yo quiero generar el archivo *.txt en la misma carpeta donde se encuentran todos los archivos del programa (.cpp, .bpr, .dfm, etc) que estoy haciendo, ¿solamente se puede hacer colocando todo el enlace o hay otra forma?

En mi caso lo hice así: "C:\\Documents and Settings\\nubia\\Escritorio\\prueba2\\datos\\AGENDA.TXT". Pero me imagino que cuando el programa lo corra en otra computadora no va a servir el enlace.

Gracias.


La franja horaria es GMT +2. Ahora son las 00:16:32.

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