Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Fórmula para dividir un ancho (https://www.clubdelphi.com/foros/showthread.php?t=62019)

felipe88 01-12-2008 18:01:38

Fórmula para dividir un ancho
 
Hola,

No es tanto un truco, ni nada del otro mundo pero quiero compartir con ustedes esta simple fórmula que cree para solucionar cierto problema al repartir espacios equitativos.

¿De que se trata?

Simple, hay veces que tenemos cierta medida y dentro de esta queremos ubicar partes mas pequeñas, pero ¿como saber el espacio entre ellas para que queden equitativamente?

La solución:

                                                                                  d = dc - ( nb * a)
                                                                                            nb + 1
Donde:
d = Distancia o espacio a saber
dc = Distancia o ancho completo del objeto a dividir
nd = Numero de partes que serán puestas dentro del objeto (dc)
a = Ancho de cada parte que será puesta (nd)

En Delphi

Código Delphi [-]
d := ( dc - ( nb * a ) ) / ( nb + 1 ); // En este caso d debe ser un valor Double
d := Round ( ( dc - ( nb * a ) ) / ( nb + 1 ) ); // En este te devuelve un entero

Espero no se confundan con la fórmula y que les sea de utilidad para algo.

Saludos.

Delphius 01-12-2008 18:51:15

Ummm.... ¿una preguntita? ¿Y cómo le haces si dos o más controles de una misma clase tienen medidas diferentes?
Digo, porque esa fórmula asume que todos tienen igual ancho o largo. La fórmula puede usarse en ambas direcciones.

Por como lo veo yo diría que:

d = (DMax - sum(i=1,n)(d_i))/n

Siendo DMax el ancho o largo máximo. En pocas la torta a repartir:D
sum(i=0,n) es la sumatoria desde i=1 hasta n de (d_i).
d_i es el ancho o largo del control i_ésimo.
Y n es la cantidad de controles.

No se, ya sabes esa es mi idea. Pero tengo otras. Mi cerebro está carburando algunas "mejoras" a la fórmula.;)

Saludos,

felipe88 01-12-2008 20:19:05

Es válido el aporte... en caso de que los controles no tengan el mismo ancho solo es sumarlos ;)

Delphius 01-12-2008 23:59:36

Hola de nuevo,
Estuve haciendo "negocios",
A ver... ¿y si lo complicamos un poquito? ¿Que te parece?:D:p:rolleyes:

¿Quién no te impide tener en un orden i_ésimo la categoría de controles, y en un orden j_ésimo los diversos controles con sus medidas?
A ver si me explico mejor:

Por ejemplo, podemos asumir que:
i = 1 -> TEdit
i = 2 -> TLabel
i = 3 -> TButton
...
i = n -> TXxxxx

Y ahora, tener algo así:
valor J - Cantidad - Largo/Ancho
-------------------------------
I = 1. TEdit
-------------------------------
j = 1 -> 2 - 43/5
j = 2 -> 5 - 10/6
========================
i = 2. TLabel
-------------------------------
j = 1 -> 20 - 12/10
....

Con un esquema como éste se pueden conseguir cosas muy interesantes. Por ejemplo, podríamos hacer que algunos controles se muestren y oculten a demanda y hacer que los demás se reordenen;).

La fórmula vendría a ser algo como esto:

d = (DMax - Sum(i=1,n)(sum(j=1,m_i)(d_ij * c_ij)))/ sum(i=1,n)(sum(j=1,m_i)(c_ij))

Siendo:
m_i: la cantidad máxima de elementos para la categoría i_ésima
d_ij: el ancho o largo del componente j_ésimo de la categoría i_ésima
c_ij: la cantidad de componentes i_ésimo para el tamaño j_ésimo

Espero que se entienda la idea.

A ver si daño algunos cerebros:rolleyes::D.

Saludos,

felipe88 02-12-2008 03:02:37

Entiendo la idea... la fórmula no :D...

La idea con esto no es solo poder posicionarlo a lo ancho sino también a lo alto dependiendo de la cantidad de controles "visibles" :confused:

felipe88 02-12-2008 03:03:51

d = (DMax - Sum(i=1,n)(sum(j=1,m_i)(d_ij * c_ij)))/ sum(i=1,n)(sum(j=1,m_i)(c_ij))

d: Distancia
DMax: Distancia máxima
i: Para los controles
j: Para los tamaños
m_i: La cantidad máxima de elementos para la categoría i
d_ij: El ancho o largo del componente j de la categoría i
c_ij: La cantidad de componentes i para el tamaño j

Traduciendo un poco :p...

Delphius 02-12-2008 03:12:29

Cita:

Empezado por felipe88 (Mensaje 329031)
Entiendo la idea... la fórmula no :D...

La idea con esto no es solo poder posicionarlo a lo ancho sino también a lo alto dependiendo de la cantidad de controles "visibles" :confused:

Disculpa felipe, no se si es por la hora o que, pero necesito preguntarlo. ¿Tu frase es una pregunta o una afirmación?:confused:

Pues como dije, es una idea... pero con un enfoque como ese, se puede diseñar un método que permita determinar mostrar u ocultar controles, y al espacio que "sobra" repartirlo en otros controles.
Por ejemplo, supongamos que tenemos grupos de Edits, Labels, Combos... dentro de un form, o incluso, un panel. Si por alguna casualidad de la vida, es viable una funcionalidad como la que describo, una fórmula basada en la que expuse permite que el espacio pueda ser aprovechado. Veamos un ejemplo "gráfico". Digamos que tenemos a disposición 200 de ancho, en total, de ese 200 el total ocupado por un grupo de combos es 70. El resto está ocupado por otros controles. "Ocultando" ese grupo de combos ahora tengo esos 70 más para distribuir el resto de los controles.

¿Me explico ahora? Espero que si, porque sino voy a tener que exprimirme más el cerebro.

Saludos,

felipe88 02-12-2008 03:26:07

Era una pregunta... me trague estos simbolitos ¿? :p
Ahora, pensando un poco... para hacer eso, creo (No sé si me equivoco) que ya dejaría de ser una simple fórmula para convertirse en algo parecido a un procedimiento... no se que piensas de eso; creo que sería buena una tercera opinión ;)

Delphius 02-12-2008 03:38:39

Cita:

Empezado por felipe88 (Mensaje 329033)
Era una pregunta... me trague estos simbolitos ¿?
Ahora, pensando un poco... para hacer eso, creo (No sé si me equivoco) que ya dejaría de ser una simple fórmula para convertirse en algo parecido a un procedimiento... no se que piensas de eso; creo que sería buena una tercera opinión

Y bueno, fórmulas son fórmulas... :D métodos, son métodos.
No más yo decía:rolleyes:;):D Ya sabes... mi brain is...:D
Si, a ver si un tercero se suma y dice algo. Para ver si desempatamos.:rolleyes:

Saludos,

Lepe 02-12-2008 15:59:41

Pero, ¿es usable?

Muchas veces nos centramos en problemas técnicos y no miramos globalmente.

¿Qué diría el usuario cuando los controles cambian de sitio "aleatoriamente"?. Para que un programa sea fácil de usar, debe mantener las cosas en el mismo sitio, de esa forma el usuario, mecánicamante, apunta el ratón a los controles.

Si empezamos a distribuirlos en tiempo de ejecución... malo (al menos a mi parecer).

Esto sí sería muy útil para repartir las mesas en un programa de restaurante. Algo así como tiene Neftali en su web, donde el usuario crea el mapa del restaurante y distribuye las mesas y sillas en el espacio.

Saludos

felipe88 02-12-2008 16:32:46

Cita:

Empezado por Lepe (Mensaje 329104)
Pero, ¿es usable?

Muchas veces nos centramos en problemas técnicos y no miramos globalmente.

¿Qué diría el usuario cuando los controles cambian de sitio "aleatoriamente"?. Para que un programa sea fácil de usar, debe mantener las cosas en el mismo sitio, de esa forma el usuario, mecánicamante, apunta el ratón a los controles.

Si empezamos a distribuirlos en tiempo de ejecución... malo (al menos a mi parecer).

Esto sí sería muy útil para repartir las mesas en un programa de restaurante. Algo así como tiene Neftali en su web, donde el usuario crea el mapa del restaurante y distribuye las mesas y sillas en el espacio.

Saludos

Tienes razón Lepe... solo lo decimos como ejercicio práctico y es un buen ejercicio lógico ;)... además como mencionas en el ejemplo de Neftali, esta fórmula te serviría hasta para centrar los muebles en tu sala ;):p:D

Lepe 02-12-2008 19:15:30

oye, pero por mí no so cortéis ehhh!!! era sólo una apreciación, pero desde luego es interesante, igual sale una clase de todo esto:
- posibilidad de distribución horizontal, después vertical y al revés.
- lista de objetos que se quieren controlar, con distintos tamaños (como ya habéis comentado).
- etc.

Saludos

Delphius 02-12-2008 19:30:08

¡Hey que bueno!¡Ya pescamos a uno felipe!
Uno más para el cacao cerebral, a ver que fórmula sale de todo esto:D

Buena idea Lepe, quien no quita que surja una clase que nos diga como organizar todo. Propongo que la llamemos Feng Shui:D:p:);)

Yo me imagino métodos como:

Código Delphi [-]
 RegisterCategory(AControlClass: TControlClass)
AddControl(Size: integer); overload;
AddControl(Category, Size: integer); overload;
Reorganize;

Saludos,

maeyanes 02-12-2008 20:10:50

Hola...

Aquí metiendo mi cuchara:

Código Delphi [-]
TFormControlsOrganizer = class
private
  FMargins: TMargins; // Una clase conteniendo propiedades tales como Botton, Top, Left, Right
  FForm: TForm;
public
  constructor Create(AForm: TForm);
  procedure ArrangeControls(AControls: Array of TComponent);
property
  Margin: TMargins read FMargins write SetMargins;
end;

implementation

constructor TFormControlsOrganizer.Create(AForm: TForm);
begin
  inherited Create;
  // Para tener más adelante el alto y ancho de la forma al momento de hacer los cálculos
  FForm := AForm
end;

procedure TFormControlsOrganizer.ArrangeControls(AControls: Array of TComponent);
var
  I: Integer;
  AControl: TComponent;

begin
  for I := 0 to High(AControls) do
  begin
    AControl := AControls[i];
    // Se hacen los calculos para acomodar el control.
  end
end;

// Para organizar tres edits a lo ancho de la forma se haría algo como:
Organizer.ArrangeControls([Edit1, Edit2, Edit3]);

Y bueno, es solo una idea de como quedaría una clase que hiciera algo así... :p



Saludos...

felipe88 02-12-2008 21:57:55

Cita:

Empezado por Delphius (Mensaje 329212)
¡Hey que bueno!¡Ya pescamos a uno felipe!
Uno más para el cacao cerebral, a ver que fórmula sale de todo esto:D

Buena idea Lepe, quien no quita que surja una clase que nos diga como organizar todo. Propongo que la llamemos Feng Shui:D:p:);)

Yo me imagino métodos como:

Código Delphi [-]
RegisterCategory(AControlClass: TControlClass) AddControl(Size: integer); overload; 
AddControl(Category, Size: integer); overload;
Reorganize;

Saludos,

Feng Shiu...:rolleyes::D:D

Código Delphi [-]
FengShui.Organizar(Button1);

... aún no se descarta la idea de la clase... pero no quiero pensar en como seria :confused:... prefiero conservar mis neuronas :D


La franja horaria es GMT +2. Ahora son las 16:35:57.

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