Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Frames dentro de ControlPages (https://www.clubdelphi.com/foros/showthread.php?t=82415)

jars 05-03-2013 18:20:49

Frames dentro de ControlPages
 
Hola amigos.
Tengo el siguiente problema.
En un formulario tengo una componente del tipo TPageControl en la que voy a tener varias sesiones de chat.
Cuando creo una nueva TTabSheet en esta creo un TFrame, al que en el momento de la creacion le seteo el sessionid.
Mi problema es que no encuentro la forma de acceceder a las variables y componentes del frame desdePageControl.
Este es el fragmento de codigo que crea cada page.

Código Delphi [-]
var
  frameChat: TfrChat;

procedure TfrmMediaTabs.AddNewTab(const Value: Integer);
var
  newtab: TsTabSheet;
begin
  newtab := TsTabSheet.Create(PageControl);
  newtab.Tag := StrToInt(ChatSession);
  newtab.PageControl := PageControl;

  FrameChat := TfrChat.Create(newtab);
  FrameChat.Name := 'Frame' + ChatSession;
  FrameChat.Parent := newtab;
  FrameChat.Align := alClient;
  FrameChat.SessionID := ChatSession;  // <---- como la puedo acceder

Espero haberme explicado bien.
Gracias.

movorack 05-03-2013 20:04:42

SessionID es una variable accesible o propiedad publica del frame?

jars 05-03-2013 20:29:12

Es una propiedad publica del frame.
Basicamente lo que quiero hacer es que cuando recibo un mensaje de chat, con el sessionid lo pueda localizar y agregar ese mensaje en el richedit del tab que corresponda.

roman 05-03-2013 21:53:20

No debería haber ningún problema. ¿Puedes mostrar cómo tienes declarada la propiedad SessionId del frame?

// Saludos

jars 05-03-2013 22:00:32

Roman, asi esta declarada:
Código Delphi [-]
type
  TfrChat = class(TFrame)
    Panel1: TPanel;
    btnSend: TcxButton;
    mSend: TsMemo;
    SB: TmxStatusBar;
    ToolBar1: TToolBar;
    btnSave: TToolButton;
    btnFont: TToolButton;
    Panel2: TPanel;
    mHistory: TJvRichEdit;
    FontDialog: TFontDialog;
    sAlphaImageList1: TsAlphaImageList;
  private
    FSessionID: string;
    procedure SetSessionId(const Value: string);
  public
    property SessionId: string read FSessionId write SetSessionId;
  end;

Si no deberia haber ningun problema, por favor decime como la accedo.
Gracias

movorack 05-03-2013 22:02:01

Según ese código no deberías tener ningún problema! :S

roman 05-03-2013 22:27:04

Pues sí, no debe haber ningún problema. Exactamente, ¿cuál es el mensaje de error que obtienes?

// Saludos

Neftali [Germán.Estévez] 06-03-2013 10:18:05

Además de lo que te han dicho, tal vez deberías guardar en una lista las referencias a los Frames que vas creando. Es decir, si para crearlos todos usas el mismo código y la misma variable, te será más fácil acceder a los frames si los almacenas en una lista (TObjectList o TList).

jars 06-03-2013 13:07:44

Pues lo que estoy haciendo ahora es guardandolo en un StrinList (Sessions), este es el código.
Código Delphi [-]
procedure TfrmMediaTabs.NewMessage(SessionId, TextMessage: string);
var
  x: Integer;
begin
  x := Sessions.IndexOf(SessionId);
  if x < 0 then Exit;
  TfrChat(Sessions.Objects[x]).mHistory.Text := TextMessage;
end;

Con este codigo, cada vez que llega un mensaje desde la web, intento agregarselo a la sessión que corresponda pero me encuentro que solamente me muestra el de la primera session y no el de la segunda.

Código Delphi [-]
  // frmMediaTabs es el formulario que contiene a PageControl
  frmMediaTabs.ChatSession := '1234';
  frmMediaTabs.Show;
  frmMediaTabs.NewMessage('1234', 'Este es el mensaje para la primera sesión');

  frmMediaTabs.ChatSession := '13587';
  frmMediaTabs.Show;
  frmMediaTabs.NewMessage('13587', 'Este es el mensaje para la segunda sesión');

jars 06-03-2013 18:40:28

Si tengo 3 tabs y estoy parado en el 3, como hago para acceder programaticamente a mHistory (TJvRichEdit) del frame de tab 1?
No encuentro la forma o no me doy cuenta de como hacerlo, .... se puede?

ecfisa 06-03-2013 19:13:41

Cita:

Empezado por jars (Mensaje 456095)
Si tengo 3 tabs y estoy parado en el 3, como hago para acceder programaticamente a mHistory (TJvRichEdit) del frame de tab 1?
No encuentro la forma o no me doy cuenta de como hacerlo, .... se puede?

Hola.

No estoy seguro de haber interpretado lo que estas buscando, pero según lo que entendí sería:
Código Delphi [-]
  ...
  PageControl1.ActivePageIndex := 1;
  JvRichEdit.SetFocus;
  ...
En este caso la consulta está relativamente relacionada, pero recuerda que para nuevas preguntas se debe crear un nuevo hilo. ;)

Saludos.

jars 06-03-2013 19:16:45

No, me referia a acceder a mHistory pero sin cambiar de tab.

ecfisa 06-03-2013 19:22:38

Hola.

Siempre que no pretendas darle el foco (ya que en ese momento JvRichEdit es invisible), podes acceder de forma directa:
Código Delphi [-]
   JvRichEdit.Text := 'Hola'

Saludos.

jars 06-03-2013 19:32:03

Y como le indico que es el del primer tab.
Refresco un poco lo que hago.
En un formulario tengo una componente del tipo TPageControl en la que voy a tener varias sesiones de chat, una en cada Tab.
Cuando creo una nueva TTabSheet en esta creo un TFrame, al que en el momento de la creacion le seteo el sessionid.
Mi problema es que no encuentro la forma de acceceder a las variables y componentes del frame desde desde otro Tab.

movorack 06-03-2013 20:07:58

Ten en cuenta que el PageControl, mas especificamente el Tab solo es el lugar donde se despliega visualmente y puedes acceder al objeto del frame desde cualquier lugar donde sea accesible.

Es decir que recorriendo así puedes encontrarlo y modificarlo

Código Delphi [-]
for i := 0 to Self.ComponentCount - 1 do
begin
  if Self.Components[i] is TFrChat then 
    if TFrChat(Self.Components[i]).SessionId = SessionIdEval then
      TFrChat(Self.Components[i]).Memo1.Add(NuevoMens);      
end;

Retomando lo que dice neftali,

Puedes hacer la creación de los objetos y llevarlos a un TList. Estando allí, en lugar de recorrer todos los componentes del formulario, solo recorres los objetos incluidos en la lista.

ecfisa 06-03-2013 20:48:53

Cita:

Empezado por jars (Mensaje 456103)
Y como le indico que es el del primer tab.
Refresco un poco lo que hago.
En un formulario tengo una componente del tipo TPageControl en la que voy a tener varias sesiones de chat, una en cada Tab.
Cuando creo una nueva TTabSheet en esta creo un TFrame, al que en el momento de la creacion le seteo el sessionid.
Mi problema es que no encuentro la forma de acceceder a las variables y componentes del frame desde desde otro Tab.

Hola.

A ver si ahora entendí...

Tenes un PageControl, en cada TabSheet un Frame y dentro de cada uno de ellos un RichEdit (JvRichEdit) y tal vez otros componentes.
Si es así y le diste nombres a cada uno de los JvRichEdit (por ejemplo mHistory+ChatSession), un modo de acceder podría ser:
Código Delphi [-]
procedure TForm1.CambiarTextoRE(const aName, aText: string);
var
  S : TTabSheet;
  F : TFrame;
  i,j,k : Integer;
begin
  for i := 0 to PageControl1.ControlCount-1 do
  begin
    S := PageControl1.Controls[i] as TTabSheet;
    for j:= 0 to S.ControlCount - 1 do
    begin
      F := S.Controls[j] as TFrameChat;
      for k:= 0 to F.ControlCount -1 do
        if F.Controls[k].Name = aName then
          (F.Controls[k] as TRichEdit).Lines.Add(aText); // (no uso TjvRichEdit)
    end;
  end;
end;

Llamada de ejemplo:
Código Delphi [-]
  CambiarTextoRE('mHistory13587', 'Nueva linea de texto');

Saludos.


La franja horaria es GMT +2. Ahora son las 21:30:45.

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