PREGUNTAS CONTESTADAS - Delphi≤nguaje=

 Hay un total de 680 Preguntas.<<  >> 

    Pregunta:  39265 - PROBLEMA CON EL INSTALL SHIELD DE DELPHI 6
Autor:  Jesús Morones
Hola a todos, tengo una aplicación de base de datos creada con delphi 5 (tablas de paradox). Cambié mi aplicación a Delphi 6, pero al momento de crear el instalador me encontré con que había sufrido algunas modificaciones. Y no he logrado entender como configurar el BDE utilizando este nuevo install Shield. Intenté crear una conexión ODBC, pero no logro conectarme. Alguno sabe como se configura el BDE en el Install Shield incluido en Delphi 6? o alguna otra solución que me puedan ofrecer?

Muchas gracias >=)
  Respuesta:  Ana Gabriela Covarrubias
Hola Jesus, en el paso 2, la tercera seccion (Objects/Merge Modules) encuentras el modulo "BDE_ENT" el cual es el bde. Cuando seleccionas este modulo te permite configurarlo, es decir, crear aliases, seleccionar los drivers que requerieres, etc.

Suerte!

Ana Gabriela Covarrubias Sanchez
Smartware

    Pregunta:  39327 - COMO USAR UNA AYUDA CON FORMATO CHM CON DELPHI 5
Autor:  Reynaldo de Jesus Tellez Menocal
Tengo la incognita de no saber como se usa un fichero de ayuda con extension Chm en delphi, normalmente uso Hlp, pero me gusto el ambiente de Html integrado en la ayuda, pero no se implementarlo
  Respuesta:  Miguel Lucero
Reynaldo

Fijate en este truco sacado de trucomanía (http://www.q3.nu/trucomania)

Por ejemplo, abrir un *.chm con el explorador web instalado por defecto
Podemos hacerlo muy fácilmente mediante la funcion ShellExecute del Api.

Por ejemplo, si queremos ver un fichero chm Añade 'ShellApi' en el uses de tu form, y ejecuta esto:

ShellExecute(Handle,nil,PChar('nombre.chm'),'','',SW_SHOWNORMAL);

donde nombre.chm es el nombre del archivo de ayuda a abrir.

La función reconoce las extensiones definidas en el Explorer de Windows, y llama al programa correspondiente según la extensión del fichero.

    Pregunta:  39431 - VALIDACION DE UNA LLAVE PRIMARIA
Autor:  Jesus Mendez
¿como puedo validar un campo con llave primaria para que no acepte una clave repetida?
  Respuesta:  Luis Felipe García Gutiérrez
Es cierto, es el motor de BD quien debe validar que el dato ingresado (la llave) no se repita, eso se hace definiendo las llaves; pero desde delphi se tendría que ejecutar una consulta adicional (puede ser al salir del campo que quieres validar), la cual verifique sobre esa tabla y ese campo que no exista el dato que quieres insertar, de existir se generaría el mensaje de error correspondiente (mostrándole al usuario a que información está asociada); ésto te evitaría la definición de llaves en la BD, pero siempre será preferible realizar las adecuaciones sobre ésta por integridad y agilidad en la consulta y procesamiento de los datos.
  Respuesta:  Roberto Ortiz
para k t sistema no acepte llaves repetidas, eso no es tarea de delphi, depende de tu Servidor de Datos, k es el kien tiene k hacer esa tarea, claro esta k tu BD debe estar bien integrada.

tu sistema solamente mandara el nuevo registro y es tu Servidor de Datos kien decide aceptar o rechazar la solicitud.

    Pregunta:  39916 - COMO SABER SI UNA APLICACION YA ESTA ABIERTA CON DELPHI
Autor:  David Silva
Hola.

Mi pregunta se refiere para saber si una aplicación ya se encuentra abierta, esto es para que no puedan abrir dos veces una aplicación que esta desarrollada con Delphi 6.
  Respuesta:  Reynaldo Tellez Menocal
Este truco lo saque del trucomania para Delphi, en la grupo aplicacion pruebalo a ver si te sirve, a mi me dio resultado.

Esto sirve para que no ejecuten tu programa más de una vez simultaneamente. Puede que quieras simplemente denegar la creación de la segunda instancia de tu aplicación, o puede que lo que quieras es que no sólo no se abra la segunda instancia, sino que se restaure la primera (que igual
está minimizada, por ejemplo).
Hay muchas maneras de hacer esto. En este truco he querido poner una que me ha llamado la atención por su sencillez. En Delphi 1 el detectar una instancia anterior era tan fácil como chequear la variable hPrevinst, pero en Delphi 32 bits esta variable ya no existe, así que tenemos que
buscar otra manera de detectar otra copia de nuestra aplicación.
Aqui la buscaremos con ayuda de FindWindow y un pequeño truco para simplificar la búsqueda:

Meteremos este código en el código del proyecto, para lo cual has de habilitar la pestaña de ver código del projecto, que está en: View-Project Source

program Project1;

uses
Forms, Windows, Messages,
Unit1 in 'Unit1.pas' {Form1};

const
CM_RESTORE = WM_USER + $1000;

var
RvHandle : hWnd;

{$R *.RES}

begin
{Si existe otra instancia ya ejecutandose, la activamos}
{If there's another instance already running, activate that one}
RvHandle := FindWindow('Mi programa Delphi', NIL);
if RvHandle > 0 then
begin
PostMessage(RvHandle, CM_RESTORE, 0, 0);
Exit;
end;

{Sino, haz lo normal}
{Else, do the normal stuff}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

En la declaración de la form, añadiremos este código, (la constante y las dos procedures que hay en la parte public)

const
CM_RESTORE = WM_USER + $1000;

type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure CreateParams(var Params: TCreateParams); override;
procedure RestoreRequest(var message: TMessage); message CM_RESTORE;
end;

Y en la implementation de la form, pondremos el código de las dos procedures que hemos definido:

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.WinClassName := 'Mi programa Delphi';
end;

procedure TForm1.RestoreRequest(var message: TMessage);
begin
if IsIconic(Application.Handle) = TRUE then
Application.Restore
else
Application.BringToFront;
end;

El funcionamiento de todo esto es el siguiente:
-Definimos un nuevo CreateParams para nuestra form, que lo que hace es asignar 'Mi programa Delphi' al WinClassName para luego poder buscar nuestra aplicación con mayor facilidad mediante FindWindow
-Creamos una procedure de tratamiento de nuestro mensaje: CM_RESTORE, que servirá para decirle a la primera instancia de nuestra aplicación que queremos que 'resucite'
-Y por ultimo, en el fuente del proyecto, buscamos una instancia previa de nuestra aplicación mediante FindWindow, y, si la encontramos, la enviamos nuestro propio mensaje CM_RESTORE para que resucite.

Otro ejemplo, mediante un semáforo

Pon esto en el OnCreate de tu form:

procedure TMainForm.FormCreate(Sender: TObject);
var Sem : THandle;
begin
Sem := CreateSemaphore(nil,0,1,'PROGRAM_NAME');
if ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
begin
CloseHandle( Sem );
ShowMessage('This program is already running.'+
'Este programa ya se está ejecutando...');
Halt;
end;
end;

Otro ejemplo, mediante la unit TLHelp32 y el nombre del ejecutable

(Enviado por Javier Pareja ([email protected]))

Simplemente detectaremos si hay otro ejecutable ejecutándose que se llame igual que el nuestro.

-Añade 'TLHelp32' en el uses de tu form
-Añade esta función en el implementation de la form:

function ProgramaAbiertoDosVeces:Boolean;
var
Datos :TProcessEntry32; {Estructura interna de datos de un proceso}
hID :DWord; {identificador del proceso}
Snap :Integer;
NombreArchivo :String; {path del archivo original}
Repetido :Boolean; {true si el programa se ha abierto dos veces}
Handle1 :Hwnd; {thandle}
Contador :Integer; {Contador de aperturas}

begin
Contador:=0;
NombreArchivo:=Application.Exename;
Repetido:=False;
GetWindowThreadProcessId(Handle1,@hID);
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
try
Datos.dwSize:=SizeOf(Datos);
if(Process32First(Snap,Datos))then
begin
repeat
if NombreArchivo=StrPas(Datos.szExeFile) then
begin
Inc(contador);
if Contador>=2 then Repetido:=true;
end;
until (not(Process32Next(Snap,Datos))) or (Repetido);
end;
finally
Windows.CloseHandle(Snap);
end;
Result:=Repetido;
end;

-Ahora, pon este código en el evento OnCreate de la form principal:

procedure TForm1.FormCreate(Sender: TObject);
begin
if ProgramaAbiertoDosVeces then
begin
showmessage('El programa ha sido abierto mas de una vez');
Application.terminate;
end;
end;

Otro ejemplo, mediante Mutex

Enviado por: Juan Manuel Ospina C. ([email protected])

procedure Tform1.FormCreate(Sender: TObject);
begin
CreateMutex(nil, false, 'miprog1');
if GetLastError = ERROR_ALREADY_EXISTS then
halt(0);
........
........

Se trata de crear un mutex, y si a la hora de crearlo ya existe... pues sale de la aplicacion con Halt

Lo del Mutex, mejor explicado..

Enviado por: Xavier Martínez ([email protected])

mutex.dpr
program YoQueSe;
uses Forms,
Windows,
Dialogs,
form1 in 'form1.pas';
{$R *.RES}
const NombreMutex='Programa 1.2';
var MiMutex:Thandle;
begin
mimutex:= CreateMutex(nil,true,NombreMutex);
if MiMutex=0 then
begin
Showmessage('Error creando mutex');
halt;
end;
if GetLastError=ERROR_ALREADY_EXISTS then
begin
Showmessage('Programa ya está funcionando');
halt;
end;
Application.initialize;
......createform (bueno, ya sabes)
......run
CloseHandle(MiMutex);
end.

    Pregunta:  40020 - ¿COMO CREAR BASES DE DATOS EN DELPHI CON SQL?
Autor:  luis antonio hernandez espinosa
poder crear bases de datos en sql y poder jalar archivos sin necesidad de abrir los alias
  Respuesta:  Julio César Plascencia Hernández
Buenas tardes:

Quiero suponer que antes del procedimiento de creación y manipulación de bases de datos y sus respectivos objetos tienes los privilegios necesarios para ello. Partiendo de esta premisa, primero genera en tu aplicación la conexión al sistema administrador de la base de datos. Una vez lograda la conexión, utiliza componentes de la clase TQuery (o su equivalente según el método de acceso a la base de datos que hayas escogido) y en la propiedad SQL escribe el código de la creación de los objetos (Create database..., Alter database, create table..., etc.) y busca el lugar más adecuado en tu aplicación para ejecutar estas sentencias. En el componente TQuery o equivalente te recomiendo que utilices el método ExecSQL o Execute (el método Open sólo se recomienda para sentencias de manipulación de datos para extraer información, esto es, del tipo SELECT). Esto debería funcionarte sin problema alguno para la creación de cualquier objeto de tu base de datos. Acerca de "jalar archivos sin necesidad de abrir los alias", no sé si te haya servido esto pero si no es así me gustaría que me explicaras un poco más al respecto.

Saludos.

Julio César Plascencia Hernández,
Ingeniero de Software.

    Pregunta:  40247 - CREAR BD INTERBASE EN TIEMPO DE EJECUCION DESDE DELPHI
Autor:  alexandra mejia
Hola, necesito informacion sobre como crear una bd interbase desde una aplicacion delphi.
  Respuesta:  Julio César Plascencia
Buenas tardes:

Te convendría utilizar la sentencia SQL Create Database dentro de tu aplicación para que pudieses crear estos objetos de forma rápida, ya sería cuestión de que tú misma revisaras tu interfaz gráfica y la forma en que ligarías objetos para poder completar la sentencia al gusto del usuario final. Suena demasiado simple, pero funciona.

Saludos.

    Pregunta:  40374 - MIGRAR DE DELPHI 2.0 A DEPHI 3 O SUPERIOR
Autor:  Fernando Iligaray
Tengo desarrollado un sistema desde hace varios años en Delphi 2.0 y lo que me impide migrarlo a una versión mas actualizada de Dephi es que todos mis reportes estan hechos con QuickReport 1.0 lo que no es compatible con las versiones de Quickreport nuevas.
Alguien conoce una forma rapida de modificar una buena cantidad de reportes para hacerlos compatibles con Delphi 3 o superior.

Saludos
  Respuesta:  Arturo Mendoza
No de hecho, no es posible emigrar nada del QuickReport 1 al versiones posteriores, te recomiendo que vuelvas a hacer los reportes con la versión 3.05 del QReport es mas facil y trae mas opciones que la versión 1.

Ese es el trabajo de emigracion...

Salu2.

    Pregunta:  40713 - PUERTO PARALELO
Autor:  Augusto Bonilla Cruz
Hola, estoy haciendo un programita y necesito utilizar el puerto paralelo, estoy utilizando estas líneas con ensamblador:

asm
mov dx,0378h
mov al,11110000b
out dx,al
end;

pero me encontré con un error de excepción que dice "raised exception class EPrivilege with message 'Privileged Instruction'", no sé cual sea el problema, tengo DELPHI 6 en un procesador Pentium 4 con Windows 2000, estuve leyendo que era porque es una instrucción del procesador y que posiblemente se encuentre en uso, como podría corregir este problema?

De antemano agradezco su valiosa ayuda.
  Respuesta:  Luis Reyned León Romero
Busca y baja de Internet el programa UserPort es freesoftware, ejecútalo y ya podras utilizar directamente los puertos en tu aplicación. Con este programa, no tienes que hacer ninguna modificación a tu código fuente.
  Respuesta:  Miguel Lucero
Augusto

En W2K, WNT y WXP no podés acceder directamente a los puertos. Para ello tenés que usar alguna dll que te permita acceder al puerto.

Yo hice un programa para programar PIC (NOPPP para Windows) y uso una dll para solucionar ese problema. El programa con código fuente y la dll en cuestión la podés bajar de http://www.lsis.com.ar/download.htm

Espero que te sirva

    Pregunta:  41076 - COMO METER UNA URL CON USUARIO:PASSWORD@DIRECCION?
Autor:  Paco Reina
He de automatizar un acceso a una pagina Web que requiere password.
Con el Explorer en la URL se puede poner "http://usuario:password@direccion y llego hasta la pagina, pero si uso el componente IdHTTP que viene con el delphi 7 me da error porque "se piensa" que detrás de los dos puntos va el puerto de la conexion. ¿Alguien me puede ayudar?
Gracias
  Respuesta:  Mariano Giustozzi
Hola
Lo que tenes que hacer es lo siguiente
en uses tenes que declarar SHELLAPIS o SHELLAPI
En este ejemplo es con unn boton

procedure TForm1.WebCOVAXTEK1Click(Sender: TObject);
begin
ShellExecute(Form1.Handle,nil,Pchar ('http:\\www10.brinkster.com\covaxtek\'),'','',SW_SHOWNORMAL);

end;

    Pregunta:  41091 - SQL SERVER Y DELPHI 5.O PARA INSERTAR IMAGENES
Autor:  FABIAN ENRIQUE CAYAMBE ANDRADE
TENGO UNA BASE DE DATOS HECHA EN SQL SERVER Y REALICE LA CONEXIÓN CON DELPHI 5.0 PERO EN UNA TABLA TENGO UN CAMPO TIPO IMAGEN EN SQL SERVER 2000 PERO EN DELPHI 5.0 ME DA PROBLEMAS AL INSERTAR Y ME APARECE EL MENSAJE DE NON-BLOB Y NO ME PERMITE REALIZAR NADA.

COMO PUEDO SOLUCIONAR ESTE PROBLEMA O QUE CAMPO PUEDO DEFINIR PARA EVITAR ESTO.
  Respuesta:  G Horner
Yo he insertado imágenes en la base de datos, quizá no sea la mejor forma, pero a mi me funcionó:

{RutaIlustracion es una variable conteniendo la ruta de la imagen, este procedimiento inserta un registro en una tabla, incluyendo la imagen, el campo emb_foto es de tipo blob}

var
Stream: TAdoBlobStream;

begin
gxConeccion:=TAdoConnection.create(gxConeccion);
gxConeccion.ConnectionString:=ConeccionBD;
gxconeccion.LoginPrompt:=false;
gxConeccion.open;

rs_auxiliar:=TAdoDataSet.create(rs_auxiliar);
rs_auxiliar.Connection:=gxConeccion;
rs_auxiliar.commandtext:='select * from Tabla';
rs_auxiliar.Active:=true;
rs_auxiliar.Insert;

Stream:=TAdoBlobStream.Create(TBlobField(rs_auxiliar.fieldbyname('emb_foto')),bmwrite);
Stream.LoadFromFile(RutaIlustracion);
Stream.Free;

rs_auxiliar.FieldByName('emb_keyemb').value:=trim(ClaveEmbobinado);
rs_auxiliar.Fieldbyname('emb_palabras').value:=trim(Palabras);
rs_auxiliar.Fieldbyname('emb_lectura').value:=trim(Lectura);
rs_auxiliar.Fieldbyname('emb_fotocel').value:=trim(FotoCelda);
rs_auxiliar.FieldByName('emb_ladimp').value:=trim(LadoImprimir);
rs_auxiliar.Post;

rs_auxiliar.Connection:=nil;
rs_auxiliar:=nil;
gxConeccion.close;
gxConeccion:=nil;
end;

|<  <<  48 49 50 51 52 53 54 55 56 57 58  >>  >|