Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Duda tonta con herencia (https://www.clubdelphi.com/foros/showthread.php?t=84916)

Angel.Matilla 27-12-2013 10:02:50

Duda tonta con herencia
 
Estoy usando un componente TDateTimePicker para que el usuario indique una fecha. Como puede sre que el rango de fechas no alcance la fecha del sistema me gustaría, por aquello de la elegancia, eliminar el circulo de la fecha del día de forma que no se muestre. He estado viendo la ayuda de este componente y, al menos en teoría, debería poder hacer esto:
Código:

DateTimePicker1->ShowTodayCircle = false
ya que este elemento desciende de TCommonCalendar. Sin embargo si pongo esa línea de código al compilar me da este error:
Cita:

[C++ Error] LisPer.cpp(28): E2247 'TCommonCalendar::ShowTodayCircle' is not accessible
¿Cómo puedo acceder a las propiedades del componente antecesor del que quiero usar?

Casimiro Noteví 27-12-2013 10:29:41

Por favor, recuerda poner títulos descriptivos a tus preguntas ;)

Gracias y feliz año :)

Angel.Matilla 27-12-2013 10:32:15

Perdona, no me di cuenta.

Ñuño Martínez 27-12-2013 10:41:02

Si son "protected", heredándolas. Pero claro, deberás usar entonces la clase derivada y no la original (instalarlo como componente o crearlo "a mano").

Debería ser tan fácil como:
Código:

  class TMiDateTimePicker: public TDateTimePicker {
  public
  /* Getter */
    bool GetShowTodayCircle (void) inline { return this->ShowTodayCircle; }
  };

Hace mucho que no hago nada en C++, así que puede haber algún error.

escafandra 27-12-2013 19:57:01

La solución que propone Ñuño Martínez sería de esta forma:

Código:

class TMiDateTimePicker: public TDateTimePicker
{
  public:
    void __fastcall SetShowTodayCircle(bool v) {ShowTodayCircle = v;}
};

// Para quitar el círculo
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TMiDateTimePicker *DateTimePicker = (TMiDateTimePicker*)DateTimePicker1;
  DateTimePicker->SetShowTodayCircle(false);
}

Pero aunque te saltas la seguridad de la herencia, no funciona, te cambia la visualización (Kind) a Time. Se debe a que el TDateTimePicker no es un TCalendar hasta que no lo desplegamos.

La solución puede hacerse desde la API de Windows asignando al evento OnDropDown el siguiente código:

Código:

void __fastcall TForm1::DateTimePicker1DropDown(TObject *Sender)
{
  // Encontramos el HANDLE del calendario
  HANDLE hCalendar = (HANDLE)SendMessage(DateTimePicker1->Handle, DTM_GETMONTHCAL, 0, 0);
  if(hCalendar > 0)
    SetWindowLong(hCalendar, GWL_STYLE, GetWindowLong(hCalendar, GWL_STYLE)|MCS_NOTODAYCIRCLE);
}


Saludos.

Angel.Matilla 28-12-2013 10:52:18

Muchas gracias por la ayuda. Me ha funcionado perfectamente con la API.


La franja horaria es GMT +2. Ahora son las 17:46:56.

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