Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-09-2015
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Poder: 0
osmeg Va por buen camino
Bloquear reordenamiento de ciertos items en componente TButtonGroup

Buenos días amigos de ClubDelphi,

Hoy les traigo una inquietud, quizá alguien me pueda colaborar. Estoy utilizando el componente TButtonGroup y a este componente le agregó varios items (de tipo TGrpButtonItem) dinámicamente. Algunos de los items del componente los considero "especiales" y al ser considerados como tal quiero que cuando el usuario intente involucrarlos en el proceso de reordenamiento el programa lo impida y deje el orden de los items tal cual se encontraba inicialmente.

En pocas palabras, cuando el usuario intente reordenar alguno de estos items especiales, el evento OnReorderButton no se ejecutará. Sólo será ejecutado para los items que no se consideran especiales.

¿Existe alguna manera de implementar este comportamiento con este componente?

Gracias por su atención.
Responder Con Cita
  #2  
Antiguo 01-09-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Hola osmeg

Proba de la siguiente manera:

Código Delphi [-]
procedure TForm1.ButtonGroup1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonGroup1.IndexOfButtonAt(X, Y) in [0, 1] then
    ButtonGroup1.ButtonOptions := ButtonGroup1.ButtonOptions - [gboAllowReorder]
  else
    ButtonGroup1.ButtonOptions := ButtonGroup1.ButtonOptions + [gboAllowReorder]
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ButtonGroup1.Items.Add.Caption := 'Primero';
  ButtonGroup1.Items.Add.Caption := 'Segundo';
  ButtonGroup1.Items.Add.Caption := 'Tercero';
  ButtonGroup1.ButtonOptions := ButtonGroup1.ButtonOptions + [gboAllowReorder];
end;

De esa manera no podrias reordenar el "primero" ni el "segundo"

Una extension de lo anterior que se asemeja mas a lo que buscas (creo)

Código Delphi [-]
function IsSpecialButton(AButton: TGrpButtonItem): Boolean;
begin
  // tu codigo
  Result := True;
end;

procedure TForm1.ButtonGroup1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  LIndex: Integer;
  LButton: TGrpButtonItem;
begin
  LIndex := ButtonGroup1.IndexOfButtonAt(X, Y);
  LButton := ButtonGroup1.Items[LIndex];
  if LButton = NIL then
    Exit;

  if IsSpecialButton(LButton) then
    ButtonGroup1.ButtonOptions := ButtonGroup1.ButtonOptions - [gboAllowReorder]
  else
    ButtonGroup1.ButtonOptions := ButtonGroup1.ButtonOptions + [gboAllowReorder]
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ButtonGroup1.Items.Add.Caption := 'Primero';
  ButtonGroup1.Items.Add.Caption := 'Segundo';
  ButtonGroup1.Items.Add.Caption := 'Tercero';
  ButtonGroup1.ButtonOptions := ButtonGroup1.ButtonOptions + [gboAllowReorder];
end;

Última edición por AgustinOrtu fecha: 01-09-2015 a las 18:15:37.
Responder Con Cita
  #3  
Antiguo 01-09-2015
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Poder: 0
osmeg Va por buen camino
Hola AgustinOrtu. Gracias por tu aporte.

Con la implementación indicada se soluciona parcialmente el problema. Ahora faltaría buscar la forma de restringir el reordenamiento si un item "no especial" se superpone sobre uno "especial". Este caso no se tiene en cuenta con el evento OnMouseDown dado. ¿Será posible utilizar el evento OnReorderButton para evitar este comportamiento?

Gracias por su atención y colaboración.
Responder Con Cita
  #4  
Antiguo 01-09-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Habria que ver, el OnReorderButton se dispara despues de alterar el orden


Código Delphi [-]
procedure TButtonGroup.DoReorderButton(const OldIndex, NewIndex: Integer);
var
  OldIndexID: Integer;
begin
  FIgnoreUpdate := True;
  try
    if FItemIndex <> -1 then
      OldIndexID := Items[FItemIndex].ID
    else
      OldIndexID := -1;
    FButtonItems.Items[OldIndex].Index := NewIndex;
    if OldIndexID <> -1 then
      FItemIndex := Items.FindItemID(OldIndexID).Index;
  finally
    FIgnoreUpdate := False;
  end;
  if HandleAllocated then
    RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_UPDATENOW);
  if Assigned(FOnReorderButton) then
    FOnReorderButton(Self, OldIndex, NewIndex);
end;
Responder Con Cita
  #5  
Antiguo 01-09-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
La unica forma que se me ocurrio es esta

Código Delphi [-]
procedure TForm1.ButtonGroup1ReorderButton(Sender: TObject; OldIndex,
  NewIndex: Integer);
var
  Old, New: TGrpButtonItem;
begin
  if NewIndex = 1 then
  begin
    ButtonGroup1.Items.BeginUpdate;
    try
      Old := ButtonGroup1.Items[OldIndex];
      New := ButtonGroup1.Items[NewIndex];
      Old.Index := NewIndex;
      New.Index := OldIndex;
    finally
      ButtonGroup1.Items.EndUpdate;
    end;
  end;
end;

Aunque desconozco que pasaria con muchos botones. Basicamente se esta pintando el control dos veces

Sino lo suyo es heredar de TButtonGroup y reescribir DoReorderButton
Responder Con Cita
  #6  
Antiguo 02-09-2015
osmeg osmeg is offline
Miembro
NULL
 
Registrado: may 2014
Posts: 18
Poder: 0
osmeg Va por buen camino
Hola AgustinOrtu,

Gracias por tu aporte. Revisaré la alternativa que me das y te comento.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Componente para presentar una lista de items jocaro OOP 1 31-12-2011 17:42:17
Uso de TButtonGroup fasthorse C++ Builder 1 22-04-2008 19:03:05
Eliminar ciertos datos de la memoria RAM dec Seguridad 63 30-03-2007 03:42:29
Componente que tenga checkboxes como items k_miragaya OOP 2 22-07-2004 09:55:54
Componente de dos ListBox con items intercambiables Tomás OOP 6 07-05-2004 18:42:39


La franja horaria es GMT +2. Ahora son las 17:33:47.


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
Copyright 1996-2007 Club Delphi