PDA

Ver la Versión Completa : Agregar y Arrastrar como en Tiempo de Diseño?


jam888
31-01-2006, 13:05:18
Foro, mi duda y consulta es la siguiente ¿se puede agregar un edit (cajita de texto) y arrastrarlo por el formulario cuando un programa esta en ejecucion ¿Como? alguna idea ¿ puede implementarse ? si pueden un ejemplo sencillo y cortito.
Un Abrazo.

jmariano
31-01-2006, 13:16:56
Supongo que habrá mejores formas de hacerlo, pero puedes utilizar las propiedades y eventos relacionadas con arrastrar y soltar (propiedades Drag... y OnDrag...).

Aquí te pongo un ejemplo muy sencillito:

type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure FormDragDrop(Sender, Source: TObject; X, Y: Integer);
end;

implementation

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
if Source = Edit1 then
Accept := True;
end;

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer);
begin
if Source = Edit1 then
with Edit1 do
begin
Left := X;
Top := Y;
end;
end;


(Para que el ejemplo funcione tienes que poner la propiedad DragMode del componente Edit1 a dmAutomatic).

Saludos!

P.D: Se me había pasado que tambien preguntabas el tema de "agregar", para ello tendrías que crear el componente en tiempo de ejecución (lo único es que tendrías que decidir cuando "crearlo").

Neftali [Germán.Estévez]
31-01-2006, 13:28:43
En cualquiera de éstos dos hilos (por no buscar más) puedes ver cómo se crea un TEdit en ejecución:
http://www.clubdelphi.com/foros/showthread.php?t=20088
http://www.clubdelphi.com/foros/showthread.php?t=19465

También tienes demos de cómo crear controles en ejecución aquí (http://neftali.clubdelphi.com/delphi_ejemplos.html).

Para moverlo en ejecucion puedes hacerlo como te han dicho o utilizar éste componente de mi Web TSelectOnRuntime, que sirve justo para eso, para mover y redimensionar componentes en ejcución;
Puedes descargarlo junto con la demo de aquí (http://neftali.clubdelphi.com/CSelectOnRunTime.zip).

jam888
31-01-2006, 15:13:57
Hola de nuevo he probado lo de Jmariano y nada la cajita de texto se queda en su lugar , no puedo arrastrarla por el formulario y tampoco puedo cambiarle su tamaño¿ que podra ser?
Un Abrazo

dec
31-01-2006, 15:17:45
Hola,

El código de Mariano debería ir bien para cambiar la posición del "TEdit" con el ratón, arrastrándolo por el formulario. Pero, en todo caso, después de probar el componente que refiere Neftalí creo que podría irte bastante bien. ¿Lo comprobaste? ;)

jmariano
31-01-2006, 15:45:00
Hola de nuevo he probado lo de Jmariano y nada la cajita de texto se queda en su lugar , no puedo arrastrarla por el formulario y tampoco puedo cambiarle su tamaño¿ que podra ser?

Acuérdate de especificar en la propiedad DragMode del componente Edit1 el valor dmAutomatic para que funcione (por defecto está a dmManual).

De todas formas, como te dice dec, fíjate en el componente de Neftali que es más completo.

Saludos!

jam888
31-01-2006, 16:25:21
Ahora si marcha bien lo de Jmariano, lo que me queda es por cambiarle el tamaño tambien al edit ¿Como?. El tema es que no puedo incorporar componentes, si no ya tendria resuelto todo. Gracias por el tiempo dedicado.
¿ahora como puedo cambiarle el tamaño? Un Abazo.

Neftali [Germán.Estévez]
31-01-2006, 16:38:00
¿ahora como puedo cambiarle el tamaño?

Si te vale hacerlo mediante teclado es bastante sencillo; Ésto te puede servir de guía (evento OnKeyDown del Edit):


var
edt:TEdit;
begin

if not (Sender is TEdit) then begin
Exit;
end
else begin
edt := TEdit(Sender);
end;

if (key = VK_DOWN) and (Shift = [ssCtrl]) then begin
edt.Height := edt.Height + 5;
end;

if (key = VK_UP) and (Shift = [ssCtrl]) then begin
edt.Height := edt.Height - 5;
end;

if (key = VK_LEFT) and (Shift = [ssCtrl]) then begin
edt.Width := edt.Width - 5;
end;

if (key = VK_RIGHT) and (Shift = [ssCtrl]) then begin
edt.Width := edt.Width + 5;
end;


Utiliza el CTRL + las flechas para modificar el tamaño.

jam888
31-01-2006, 16:52:44
Anda con las teclas pero debo de hacerlo con el mouse (agrandarlo)por que asi me lo han solicitado, que va a hacer yo no mando. Espero me puedan respomder.Gracias

dec
31-01-2006, 16:59:54
Hola,

A ver. El componente escrito por Neftalí y que él mismo te refiere más arriba hace exactamente lo que precisas. Como el componente es de código abierto bien podrías estudiar su funcionamiento. ¿Porqué no echas un vistazo al componente susomentado de una vez por todas y nos dices qué tal te va con el mismo?

O, cuando menos, dínos, pues mira, he mirado el componente de Neftalí pero, no me va bien por esto, por esto y por esto otro. Porque, ya te digo, teniendo tan a la mano una posible solución a tu problema no entiendo por qué no la miras siquiera... ¿o es que la miraste ya, que es lo que digo, y no te sirvió?

jachguate
31-01-2006, 20:29:11
Esto mas bien parece una tarea del colegio que un requerimiento de un programa normal... yo diría que ya tenes suficiente información para hacerlo por tu cuenta. ... ¿no?

jam888
02-02-2006, 14:00:16
Estimados les comento que chequee el componente y ahora todo marcha ok,
lo unico es que cuando cambio de tamaño y lugar los componentes estos cambios no permanecen en el formulario, es decir lo cierro y cuando vuelvo a ejecutarlo los componentes esatan en el lugar original ¿Como guardo la distribucion y el tamaño de los componentes en el formulario?
Gracias y Un Abrazo.

jmariano
02-02-2006, 14:19:59
Lógicamente, todos los cambios que hagas sobre posición y tamaño estarán sólo almacenados en memoria (de ahí que se pierdan al salir del formulario), por lo que tendrás que almacenarlo en algún medio "no volátil", como un archivo en el disco duro, por ejemplo.

Para ello puedes utilizar la clase TStringList que te permite almacenar y cargar fácilmente cadenas de texto o utilizar las funciones que posee Delphi para almacenar y recuperar el estado (o recursos) de un objeto o componente.

Te pongo un ejemplo que viene en la ayuda de Delphi para "convertir" un componente a cadena de caracteres y viceversa:

function ComponentToString(Component: TComponent): string;

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;

end;
finally
BinStream.Free
end;
end;

function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);

finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;


(Consulta la ayuda de Delphi si tienes dudas de lo que hace ambos procedimientos porque está mu' bien explicado)

Saludos!

jachguate
02-02-2006, 20:34:35
las jedi tienen gestores de persistencia de propiedades que podes almacenar en archivos ini, el registry, xml o una base de datos.

Si te interesa, mirá los compoentes de la paleta Jv Persistence

vtdeleon
03-02-2006, 00:43:42
Saludos

O tambien puedes usar este componente (http://neftali.clubdelphi.com/delphi_componentes.html#TSaveCompos_1.2) de la pagina de neftali (neftali.clubdelphi.com)

jam888
08-02-2006, 16:50:26
Estimados gracias a todos por ocuparse de este tema.
Un Abrazo

marcial
30-03-2007, 19:09:03
Habria algo de esto para D5 ??
Gracias
Marcial