Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Chat Comico - Dudas y mas (https://www.clubdelphi.com/foros/showthread.php?t=86282)

FideRosado 14-07-2014 08:14:37

Chat Comico - Dudas y mas
 
1 Archivos Adjunto(s)
Hola amigos he creado un chat, pero acabo de encontrarme con algo que he querid hacer el caso es que esta es la idea que me he creado en un form que tiene lo basico para que ande, le llamaremos form2, del cual a partir de el crearems cuantos necesitemos, el caso es que como veran, los mensajes originalmente deberian estar en la parte inferir saliendo desde abajo, el cas es que imprimo paneles en un ScrollBox, el cual por defectto los imprime en la parte superior, y eso es lo que me mmolesta, por lo menos saber como se puede imprimir desde abajo.. como se muestra la imagen..


http://clubdelphi.com/foros/attachme...1&d=1405318188

ecfisa 14-07-2014 13:46:11

Hola FideRosado.
Cita:

Empezado por FideRosado (Mensaje 478951)
... imprimo paneles en un ScrollBox, el cual por defectto los imprime en la parte superior, y eso es lo que me mmolesta, por lo menos saber como se puede imprimir desde abajo.. como se muestra la imagen..

En principio es muy simple, basta con fijar su propiedad Align = alBottom.

Pero... si deseas que los mensajes mas recientes vayan quedando debajo de los mas antiguos se complica un poco, ya que hay que forzar el órden por defecto de alineación alBottom.

Te pongo un ejemplo de como podrías implementarlo de este último modo:
Código Delphi [-]
...
implementation

uses Contnrs;

var
  PnlList: TObjectList;
  MsgCount: Integer = 1;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PnlList:= TObjectList.Create;
  Timer1.Interval:= 1000;
  Timer1.Enabled:= True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const
  PNL_HEIGHT = 60;
  MENSAJES: array [1..5] of string = (
    'Hola ¿ Como estas ?','Bién, ¿ Todavia de vacaciones ?','Si, vuelvo mañana',
    '¿ Como está el clima allá ?','Ayer llovió pero hoy esta lindo');
  PNL_COLOR: array[Boolean] of TColor = (clCream, clMoneyGreen);
var
  pnl: TPanel;
  i:Integer;
begin
  ScrollBox1.DisableAlign;
  for i:= PnlList.Count-1 downto 0 do
    with TPanel(PnlList[i]) do
    begin
      Align:= alNone;
      Top:= Top - PNL_HEIGHT;
    end;
  ScrollBox1.EnableAlign;
  pnl:= TPanel.Create(Self);
  pnl.Parent:= ScrollBox1;
  pnl.Width:= ScrollBox1.Width-10;
  pnl.Height:= PNL_HEIGHT;
  pnl.Align:= alBottom;
  pnl.Name:= 'PanelChat'+IntToStr(MsgCount);
  pnl.Caption:= IntToStr(MsgCount)+') '+MENSAJES[MsgCount]+'  ';
  pnl.ControlStyle:= pnl.ControlStyle - [csParentBackground];
  pnl.Color:= PNL_COLOR[Odd(MsgCount)];
  PnlList.Add(pnl);
  for i:= PnlList.Count-1 downto 0 do
    TPanel(PnlList[i]).Align:= alBottom;
  Inc(MsgCount);
  if MsgCount = 6 then Timer1.Enabled:= False;
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
  PnlList.Free;
end;

Salida del demo:



Saludos :)

FideRosado 14-07-2014 17:19:04

felicidades
 
has lgrado lo que pense, puedes adjuntarme el proy para verle el codigo, pues com ke me pierdo un pco.. saque un biejo proy que tengo y estuve mirando esas propiedades..

FideRosado 14-07-2014 18:44:52

respuesta
 
he usado esta simple funcion para poner los ultimos en el fondo
algo sencillo

Código Delphi [-]
for i:= ScrollBox1.ControlCount - 1 downto 0 do begin
    if ScrollBox1.Controls[i] is TPanel then begin
       TPanel(ScrollBox1.Controls[i]).Align:=alTop;
       TPanel(ScrollBox1.Controls[i]).Align:=alBottom;
    end;
  end;

FideRosado 14-07-2014 18:47:20

respuesta
 
aunke seguire buscando formas mas adecuadas para hacero.. claro esta..

ecfisa 15-07-2014 02:11:09

Hola FideRosado.

Si, ese código es mas simple, pero no tan eficiente por que tiene que buscar entre todos los controles que existan en el ScrollBox. Usar un TObjectList para almacenar sólo los Panels añadidos reduce la cantidad de elementos a recorrer y obviamente también evita evaluar si se trata de un Panel u otro control.

Código Delphi [-]
var
  PnlList: TObjectList;

....
begin
  // creación del nuevo TPanel pnl
  pnlList.Add(pnl);
  ScrollBox1.DisableAlign;
  for j:= PnlList.Count-1 downto 0 do
  begin
    TPanel(PnlList[j]).Align:= alTop;
    TPanel(PnlList[j]).Align:= alBottom;
  end;
  ScrollBox1.EnableAlign;
  ....

Saludos :)

FideRosado 15-07-2014 05:07:50

respuesta
 
si eso es, el recorre buscando los controles y les cambia laAlign,pero la verdad es que no entiend lo que me pones, es que necesito seguir un codigo ya echo para entender esa cmplegidad. si puedes adjuntame el proy enviamelo a ...

mamcx 15-07-2014 05:30:26

Lo que te mostraron resuelve de forma muy directa el problema. Haz seguido un curso en programación? Entiendes las bases? Sabes, por ejemplo, como procesar listas, ordenar & buscar items? Sabes que es Queue y un Stack?

Porque si las bases no las tienes claras, vas a a perder mucho tiempo intentando hacer las cosas.

ecfisa 15-07-2014 05:46:25

Cita:

Empezado por FideRosado (Mensaje 479000)
si eso es, el recorre buscando los controles y les cambia laAlign,pero la verdad es que no entiend lo que me pones, es que necesito seguir un codigo ya echo para entender esa cmplegidad. si puedes adjuntame el proy enviamelo a ...

Hola FideRosado.

Soy respetuoso de las normas de nuestro sitio y si lees la norma 11 de la guía de estilo, entenderás por que no respondo de forma privada.
Además de ir contra nuestras normas, publicar tu correo te deja expuesto a recibir spam, motivo por el cuál modifico ese punto de tu mensaje.

Sin embargo, con muchísimo gusto te agrego un ejemplo simplificado, pero totalmente funcional, que implementa mi sugerencia anterior.
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
  public
  end;

var
  Form1: TForm1;

implementation

uses Contnrs;

var
  PnlList: TObjectList;
  MsgCount: Integer = 1;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PnlList:= TObjectList.Create; // Crear lista
  Timer1.Interval:= 500;
  Timer1.Enabled:= True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
const
  PNL_HEIGHT = 60;
var
  pnl: TPanel;
  j: Integer;
begin
  // Creación de un panel
  pnl:= TPanel.Create(Self);
  pnl.Parent:= ScrollBox1;
  pnl.Width:= ScrollBox1.Width-10;
  pnl.Height:= PNL_HEIGHT;
  pnl.Name:= Format('PanelChat%d',[MsgCount]);
  pnl.Caption:= Format('Mensaje: %d',[MsgCount]);

  // Agregarlo a la lista;
  PnlList.Add(pnl);

  // Reorganizar paneles
  for j:= PnlList.Count-1 downto 0 do
  begin
    (PnlList[j] as TPanel).Align:= alTop;
    (PnlList[j] as TPanel).Align:= alBottom;
  end;

  Inc(MsgCount);
  if MsgCount = 7 then Timer1.Enabled:= False; // límite 7 msgs
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  PnlList.Free; // Liberar lista
end;

end.
El TTimer, la variable MsgCount y algun otro detalle están a fin de simular el arribo de los mensajes.

Saludos :)

Casimiro Noteví 15-07-2014 14:54:12

Cita:

Empezado por ecfisa (Mensaje 479002)
Soy respetuoso de las normas de nuestro sitio y si lees la norma 11 de la guía de estilo, entenderás por que no respondo de forma privada.
Además de ir contra nuestras normas, publicar tu correo te deja expuesto a recibir spam, motivo por el cuál modifico ese punto de tu mensaje.

Me "copio y pego" esa frase tan bien expresada, porque hace falta usarla más veces de las que quisiera :D

FideRosado 15-07-2014 16:28:48

respuesta
 
tienen razn, necesitaba verlo desde es punto de vista..


La franja horaria es GMT +2. Ahora son las 10:23:28.

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