Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Volví. (mucho trabajo)

Cita:
Empezado por escafandra Ver Mensaje
Si, ya me gustaría saber tanto...





Está bien que mires código y que lo entiendas pero tienes que diseñar una estrategia y luego implementarla. Si no, el resultado será muy chapucero. Puedes colgar los videos que quieras.





Lo importante no es el lenguaje sino tener claro que hacer con él. A mi me gusta más el C para lo que suelo hacer y Builder es primi hermado de delphi, así que me manejo en las dos caras de la moneda. Quizás puedas leer alguno de los libros recomendados para delphi, empezando con el incunable "La Cara Oculta de delphi 4" pero a escribir código se aprende escribiendo, leyendo y entendiendo. La documentación de la API de Windows que da M$ es muy buena pero hay que pensar en C. Hay mucha gente que le tiene miedo. En realidad te permite ir mucho más allá del límite de la VCL, pero siempre a bajo nivel.


Saludos.
Hola.
Vuelvo un rato después de algo de trabajo y poco tiempo a seguir con mi hobbie para poder despejarme un poco.

Me gustaría preguntarte alguna cosita para ver si cambio todo mi programa de raíz y lo empiezo de nuevo.


Pongamos que hago todo el programa de nuevo.

El front end lanza mi programa el cual abre y muestra la imagen de "LOADING GAME".
Lo que quiero es que al cargarse el emulador, mi programa se dé cuenta que el emulador está en ejecución.

Se puede saber si ese programa está en primer plano, está maximizado y ahí "esconder" la ventana de mi programa hasta que el emulador se cierre y ahí cerrarla?

Por que en realidad eso es todo lo que necesito que mi programa haga y con tanto bat y programas externos la estoy empeorando.

O sea;

FrontEnd ----> Lanza mi programa y queda a la espera de que mi programa termine para volver a primer plano.
Mi programa ---> Aparece encima de todo, mostrando una imagen de "LOADING GAME" o algo así, lanza el emulador y queda a le espera de que el emulador termine, para cerrarse y de esta manera darle el permiso al Frontend para que vuelva al prmer plano.


Podrías darme alguna de idea de como poder lograr eso sin liarme hasta no entender más nada y desistir, por favor?

Muchas gracias!!!!!
Responder Con Cita
  #2  
Antiguo 03-03-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Ok. Te presento un programita que se ejecuta maximizado mostrando un Label que dice "LOADING GAME" al arrancar. Luego Ejecuta "Notepad.exe" y se esconde. Al cerrar Notepad, el programita se termina.


Espero que esta sea la idea de lo que quieres hacer.


Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    function Execute(CommandLine: String): cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: String): cardinal;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfo));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION or STARTF_USESIZE;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WindowState:= wsMaximized;
  FormStyle:= fsStayOnTop;
  BorderStyle:= bsNone;
  Label1.Caption:= '"LOADING GAME"';
  Label1.Font.Size:= 30;
  Label1.Font.Style:= [fsBold];


  // Simula que tarda en cargar...
  Timer1.Interval:= 2000;  // Poner Timer1.Interval:= 1 para no esperar nada,
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Simula que tarda en cargar...
  Execute('Notepad.exe');

  Visible:= True;
  Label1.Caption:= 'NOS VAMOS';
  Update;
  Sleep(500);
  Close;
end;

end.


Saludos.
Responder Con Cita
  #3  
Antiguo 03-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Cita:
Empezado por escafandra Ver Mensaje
Ok. Te presento un programita que se ejecuta maximizado mostrando un Label que dice "LOADING GAME" al arrancar. Luego Ejecuta "Notepad.exe" y se esconde. Al cerrar Notepad, el programita se termina.


Espero que esta sea la idea de lo que quieres hacer.


Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    function Execute(CommandLine: String): cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: String): cardinal;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfo));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION or STARTF_USESIZE;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WindowState:= wsMaximized;
  FormStyle:= fsStayOnTop;
  BorderStyle:= bsNone;
  Label1.Caption:= '"LOADING GAME"';
  Label1.Font.Size:= 30;
  Label1.Font.Style:= [fsBold];


  // Simula que tarda en cargar...
  Timer1.Interval:= 2000;  // Poner Timer1.Interval:= 1 para no esperar nada,
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  // Simula que tarda en cargar...
  Execute('Notepad.exe');

  Visible:= True;
  Label1.Caption:= 'NOS VAMOS';
  Update;
  Sleep(500);
  Close;
end;

end.


Saludos.
Muchas gracias por tomarte el tiempo que es un recurso irrecuperable.
Esta tarde, en cuanto regrese del trabajo, esto va a ser lo primero que me ponga a hacer.

La verdad es que no me puedo explicar como pudo ser algo tan sencillo y jamás imaginarlo. Ja!
Bueno están los que saben y son fuente inagotable de sabiduría y los que no aprendemos por más ganas que le echemos. 😂 🤣 😂

Te agradezco y más tarde te paso el reporte de como me fue.

Muy agradecido!
Saludos!!!!!
Responder Con Cita
  #4  
Antiguo 09-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Hola acá molestando otra vez.

Sabés que el programa se me queda tildado y no ejecuta nada?
Parece que el problema es acá:

if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI)

Pero no puedo saber por qué.
Me dice error
reised exception class $C00000005 with mesage 'access violation at 0x7788d00: write of adress 0x005eb846'

Qué puede ser?
Responder Con Cita
  #5  
Antiguo 09-03-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por MaxiDucoli Ver Mensaje
Hola acá molestando otra vez.

Sabés que el programa se me queda tildado y no ejecuta nada?
Parece que el problema es acá:

if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI)

Pero no puedo saber por qué.
Me dice error
reised exception class $C00000005 with mesage 'access violation at 0x7788d00: write of adress 0x005eb846'

Qué puede ser?
Tendrás que especificar más cosas, cual es el código exacto que has usado, S.O. y compilador. Para concretar las cosas te subo el proyecto que hice con su binario. Está escrito y compilado con delphi7.

Te propongo un cambio:
Código Delphi [-]
//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: String): cardinal;
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfo));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION;// or STARTF_USESIZE;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcess(nil, PCHAR(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

Lo puedes encontrar aquí: Exec_Whait_End.zip.


Saludos.
Archivos Adjuntos
Tipo de Archivo: zip Exec_Whait_End.zip (192,5 KB, 12 visitas)

Última edición por escafandra fecha: 09-03-2020 a las 09:16:21.
Responder Con Cita
  #6  
Antiguo 10-03-2020
MaxiDucoli MaxiDucoli is offline
Miembro
 
Registrado: feb 2006
Posts: 134
Poder: 21
MaxiDucoli Va por buen camino
Hola.
Con el Project1.exe funciona.
Muestra el Form, abre cmd.exe y cuando cierro cmd.exe dice NOS VEMOS y se cierra todo.

Pero con el código fuente me da el mismo error.


Uso Windows 10 actualizado a la última versión, Delphi 10.3.1, el códgo lo puse exactamente como me lo mandaste.

Pero me tira el error ese que te indiqué antes.

Que raro.
Responder Con Cita
  #7  
Antiguo 10-03-2020
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Es problema del unicode el delphi. Si se fuerza a usar AnsiChar funcionará. Este problema no ocurre en C, posiblemente esté mas declarada la API.
Prueba este código que si funciona en Berlin y funcionará en tu versión de delphi:


Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    function Execute(CommandLine: AnsiString): cardinal;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
// Creamos un proceso.
function TForm1.Execute(CommandLine: AnsiString): cardinal;
var
  SI: TStartupInfoA;
  PI: TProcessInformation;
begin
  ZeroMemory(@SI, sizeof(TStartupInfoA));
  SI.cb:= sizeof(SI);
  SI.dwFlags:= STARTF_USESHOWWINDOW or STARTF_USEPOSITION;
  SI.wShowWindow:= SW_SHOW;
  Result:= 0;
  if CreateProcessA(0, PAnsiChar(CommandLine), nil, nil, false, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, 10000);
    Visible:= false;
    WaitForSingleObject(PI.hProcess,INFINITE);
    GetExitCodeProcess(PI.hProcess, Result);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
  end
  else
    Result:= $FFFFFFFF;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowWindow(Handle, SW_MAXIMIZE);
  WindowState:= wsMaximized;
  FormStyle:= fsStayOnTop;
  BorderStyle:= bsNone;
  Label1.Caption:= '"LOADING GAME"';
  Label1.Font.Size:= 30;
  Label1.Font.Style:= [fsBold];
  // Simula que tarda en cargar...
  Timer1.Interval:= 2000;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:= false;
  // Simula que tarda en cargar...
  Execute('cmd.exe');
  Visible:= True;
  Label1.Caption:= 'NOS VAMOS';
  Update;
  Sleep(500);
  Close;
end;

end.

He añadido discretas mejoras y pasado a PAnsiChar.


Saludos.
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
Optimizar codigo n03l Varios 3 28-11-2013 22:07:11
optimizar el codigo en menos lineas darkbits Varios 5 19-07-2013 14:32:40
Ayuda como Optimizar Código JerS OOP 3 24-06-2011 06:59:44
optimizar codigo acrophet Varios 5 17-01-2011 00:28:39
Optimizar el sgte codigo BlueSteel Varios 9 14-08-2007 23:33:24


La franja horaria es GMT +2. Ahora son las 04:08:13.


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