PDA

Ver la Versión Completa : Componentes sin form.


rauros
27-07-2008, 21:14:05
Saludos. Me gustaría hacer algo muy simple pero no sé si posible es. Necesito un edit(componente) pero sin form. O un form invisible con un edit visible. O algo parecido.

dec
27-07-2008, 21:21:22
Hola,

Igual la función "InputBox()" (http://www.delphibasics.co.uk/RTL.asp?Name=InputBox) puede servirte.

rauros
27-07-2008, 21:24:32
No, gracias por ayudar pero no era eso lo que busco. Busco algo que sea solo un edit. Un edit y ya está xD. Más solo que la una.

dec
27-07-2008, 21:26:35
Hola,

Pues, ignoro si puedes mostrar un "TEdit" solo, aunque, quizás apoyándote en alguna ventana, incluso en la del propio escritorio de Windows... la verdad es que no sabría qué decirte. Pero, ¿por qué no usar un formulario, que sólo contenga el "TEdit"? Creo que esto sería una posibilidad, ¿no? ¿tú cómo lo ves? ;)

rauros
27-07-2008, 21:27:55
Me interesa eso de "apoyarme" en una ventana. Si tengo el handle, es suficiente?

coso
27-07-2008, 21:35:05
Hola rauros, puedes probar de crear un form con un edit, y autosize del form a true, borderstyle = bsnone

rauros
27-07-2008, 21:43:35
anda, gracias.

Caral
27-07-2008, 21:46:51
Hola
Bueno, no se puede esperar mucho de un novato:D
Un Edit solito, sin nada, ojo sin nada osea que no se puede cerrar, solo desde la barra de tareas, creo.:D
Saludos

dec
27-07-2008, 21:49:16
Hola,

La verdad es que me meto en camisas de once varas. Por ejemplo, he hablado de "apoyarse" en una ventana, pero, con la función CreateWindow() (http://winapi.conclase.net/curso/index.php?fun=CreateWindow) es posible crear un "Edit" (ojo, ya no un "TEdit") más o menos sencillamente, y sin necesidad de apoyarse en ventana alguna. Sin embargo, he creado un "Edit", pero, habría que ver de qué manera es posible hacerse con su control: saber qué texto se ha escrito, cuándo ha cambiado, etc., etc. Y, lo cierto es que yo no estoy muy puesto en estos asuntos, que son "pegarse" con el API de Windows directamente. Igual algún otro compañero puede echarte una mano, para lo dicho, o con alguna otra idea que solucione lo que quieres. Lo lamento. :(

rauros
27-07-2008, 21:52:36
Tranquilos, el edit sin bordes me sobra. Ahora me gustaría hacer como si fuera ligado a una aplicación. Por ejemplo, si va con notepad, significa que si notepad está en 1ª posición (delante de el resto de ventanas) el edit vaya también a la 1ª con el notepad.

dec
27-07-2008, 21:56:39
Hola,

Joroba, estuvo buena esa Caral. ;)

Caral
27-07-2008, 21:59:16
Hola
Gracias Dec, pero es sacado de aqui mismo, del club.:D
Algo he aprendido.:)
Saludos

coso
27-07-2008, 22:02:18
hola rauros, puedes poner la form en StayOnTop si se encuentra la ventana del notepad activa, aunque ten en cuenta que si se entra a tu miniedit :D el notepad perdera el foco

Neftali [Germán.Estévez]
28-07-2008, 08:47:38
Tal soy demasiado básico (todavía ando dormido), pero ¿no bastaría con hacer un form igual de grande que el edit y colocarle dentro el Edit?

Formulario con BorderStyle a bsNone y Autosize a True.

rauros
28-07-2008, 12:07:15
hola rauros, puedes poner la form en StayOnTop si se encuentra la ventana del notepad activa, aunque ten en cuenta que si se entra a tu miniedit :D el notepad perdera el foco

¿Eso significa que todas las teclas que use en vez de funcionar en el notepad funcionará en mi programa? Es que hay programas que están visibles pero no reciben el foco, como el administrador de tareas, greatis windowse, etc...
Por ejemplo, yo estoy escribiendo ahora mismo por aquí y tengo el administrador de tareas en medio, lo que significa que no recibe el foco, ¿no?
Muchas gracias a todos, que me habéis ayudado.

coso
28-07-2008, 12:10:03
no se bien bien como iria, pero seguro que deberas vigilar el tema del foco de la aplicación, pues es posible que te vaya saltando de una a otra. Mira por aqui el club algunos ejemplos (por ejemplo, lo de enviar teclas a aplicaciones externas) a ver como funciona y como lo resuelven...saludos

y tengo el administrador de tareas en medio, lo que significa que no recibe el foco, ¿no?

si, significa que no tiene el foco en ese momento, funciona en background que se dice

rauros
28-07-2008, 17:45:09
He puesto formStyle en fsStayOnTop pero no funciona, al clicar en otra aplicación el edit se queda detrás...

coso
28-07-2008, 18:30:38
? que raro, yo lo tengo ahora mismo delante, y solo he hecho esto desde un nuevo proyecto: borderstyle := bsNone, autosize := true, formstyle := fsStayOnTop :confused:

coso
28-07-2008, 18:31:45
a ver si es que la otra aplicación tambien tiene el fsstayontop...

rauros
29-07-2008, 12:41:54
No se que ocurrio pero se solucionó. Ahora tengo otra pregunta, como puedo hacer que al clicar una secuencia de botones (alt + c, por ejemplo), el programa reciba el foco. Lo de la secuencia debe hacerse aunque el programa no tenga el foco, por eso pregunto, que no tengo ni idea de si se puede hacer.

Neftali [Germán.Estévez]
29-07-2008, 13:21:46
Debes registrar esa combinación de teclas de forma global a sistema.
Aquí tienes el código (http://www.swissdelphicenter.ch/en/showcode.php?id=147) de cómo hacerlo.

cmm07
29-07-2008, 17:21:16
en los componentes JVCL creo que ví un componente que hace eso...

rauros
29-07-2008, 22:08:02
Ese código no me funciona. Está copiado tal cual.

Neftali [Germán.Estévez]
30-07-2008, 09:05:06
Ese código no me funciona. Está copiado tal cual.

Puedes explicar mejor qué te pasa. ¿Porqué no te funciona? ¿No te compila?

RegisterHotKey es la llamada que se utiliza para registrar combinaciones de teclas a nivel Global del sistema. Funciona perfectamente (yo mismo la he utilizado varias veces sin problemas).

Busca sobre esa llamada y encontrarás muchos ejemplos, aunque las llamadas son similares a esa.

rauros
30-07-2008, 14:11:17
Nada más copiar el proyecto a la unidad 1 (unit1.pas) y compilar. Luego clico el botón imprimir Pantalla (una de las registradas) pero no funciona.

sur-se
30-07-2008, 16:12:40
Eso lo puedes hacer con el componente HotKeyManager.
http://www.vclcomponents.com/Delphi/System_Components/HotKeyManager-info.html
Un saludo.

Neftali [Germán.Estévez]
30-07-2008, 16:32:08
Eso lo puedes hacer con el componente HotKeyManager.

Se puede hacer con muchos más componentes además de ese, pero creo que no radica ahí el problema, ya que si miras el código del procedimiento AddHotKey del componente verás que acaba llamando a las funciones:

* GlobalAddAtom
* RegisterHotKey

Que son las mismas que se llaman en el ejemplo anterior.
Supongo que si no han funcionado antes...

coso
30-07-2008, 16:46:05
{
RegisterHotKey fails if the keystrokes specified for the hot key have
already been registered by another hot key.

Windows NT4 and Windows 2000/XP: The F12 key is reserved for use by the
debugger at all times, so it should not be registered as a hot key. Even
when you are not debugging an application, F12 is reserved in case a
kernel-mode debugger or a just-in-time debugger is resident.
}

esto estaba alla en la funcion. ¿Es posible que sea lo que te esta ocurriendo?

rauros
30-07-2008, 16:47:49
Pues sí. Ahora va xD.

sur-se
30-07-2008, 17:53:24
Bueno pues ahí pongo otra solución sin usar componentes externos como sugiere Neftali:

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure HtoK(var Msg : TWMHotKey); message WM_HotKey;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}

procedure tform1.HtoK(var Msg : TWMHotKey);
begin
showmessage('Alt-V');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
registerHotKey(handle,GlobalAddAtom('ALT_V'),MOD_ALt,vKKeyscan('v'));

end;

end.


Un saludo.

coso
30-07-2008, 20:00:11
Si, bueno, sur-se, eso es exactamente el codigo de neftali, pero incorrecto...¿deberas desregistrarlas al acabar la aplicación no?

coso
30-07-2008, 20:04:16
y...el componente externo lo has citado tu...

sur-se
31-07-2008, 08:22:51
Efectivamente, un poco más resumido que el código de neftalí, y más sencillo de entender al tener menos código. Si al final faltaría desregistrar, pero es básicamente un ejemplo de esqueleto para hacerlo.

Respecto al componente, efectivamente lo puse yo porque es una solución muy sencilla (haga lo que haga internamente) que encapsula todo. Era por si le servía al compañero que puso el post, nada más. Yo lo utilizo porque me ahorra escribir código nada más.

Un saludo.

coso
31-07-2008, 08:51:44
si si, claro, efectivamente...