Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Agregar y Arrastrar como en Tiempo de Diseño? (https://www.clubdelphi.com/foros/showthread.php?t=29732)

jam888 31-01-2006 13:05:18

Agregar y Arrastrar como en Tiempo de Diseño?
 
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:
Código Delphi [-]
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í.

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í.

jam888 31-01-2006 15:13:57

lo he probado yyyyyyyy?
 
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

Cita:

Empezado por jam888
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

ok, ahora si
 
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

Cita:

Empezado por jam888
¿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):

Código Delphi [-]
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 pero........
 
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

Casi todo ok...
 
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:
Código Delphi [-]
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 de la pagina de neftali

jam888 08-02-2006 16:50:26

ok, esta bueno
 
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


La franja horaria es GMT +2. Ahora son las 20:32:49.

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