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 18-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Quitar borde de selección a TStringGrid

Buenas tardes,
tengo un pequeño problemilla estoy seguro que podéis resolverlo. Me gustaría quitarle el borde que se genera alrededor de una celda que tienes seleccionada, en mi caso es un borde punteado.

Esta es la captura:
http://es.zimagez.com/zimage/captura440.php

No se si se puede eliminar o cambiar el color, lo pondría del mismo color que el relleno y sobraría.
Muchas gracias por vuestra ayuda.
Un saludo!
Responder Con Cita
  #2  
Antiguo 18-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Catublipas.
Cita:
Empezado por Catublipas Ver Mensaje
...
Me gustaría quitarle el borde que se genera alrededor de una celda que tienes seleccionada, en mi caso es un borde punteado.
...
Fijate si te sirve de este modo:
Código Delphi [-]
...
type
  TStringGrid = class(Grids.TStringGrid)
  protected
    procedure Paint; override;
  end;

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    ...
  end;

var
  Form1: TForm1;

implementation

{ TStringgrid }
procedure TStringGrid.Paint;
var
  R: TRect;
begin
  inherited;
  R := CellRect(Col, Row);
  DrawFocusRect(Canvas.Handle, R);
end;
...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 19-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Smile

Buenas ecfisa,
gracias por tu respuesta pero no consigo implementarla, no me reconoce
Código Delphi [-]
Grids.TStringGrid
ni el método paint tampoco.
¿Cómo implemento el método?

Muchas gracias de nuevo!
Responder Con Cita
  #4  
Antiguo 19-02-2016
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
Firemonkey o VCL?
Responder Con Cita
  #5  
Antiguo 19-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Estoy programandolo en VCL Form :P.
Responder Con Cita
  #6  
Antiguo 20-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Catublipas.
Cita:
Empezado por Catublipas Ver Mensaje
Buenas ecfisa,
gracias por tu respuesta pero no consigo implementarla, no me reconoce
Código Delphi [-]
Grids.TStringGrid
ni el método paint tampoco.
¿Cómo implemento el método?

Muchas gracias de nuevo!
Uso una versión antigua de Delphi como para probarlo, pero por las dudas intentá de este modo:
Código Delphi [-]
type
 TStringGrid = class(Vcl.Grids.TStringGrid)
 ...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 22-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Buenas ecfisa efectivamente con esto me deja pero me da los siguientes errores en el procedimiento procedure TStringGrid.Paint;


Código Delphi [-]
[dcc32 Error] Empresas.pas(171): E2003 Undeclared identifier: 'Paint'
[dcc32 Error] Empresas.pas(173): E2075 This form of method call only allowed in methods of derived types
[dcc32 Error] Empresas.pas(174): E2003 Undeclared identifier: 'CellRect'
[dcc32 Error] Empresas.pas(174): E2003 Undeclared identifier: 'Row'
[dcc32 Error] Empresas.pas(175): E2003 Undeclared identifier: 'Canvas'
[dcc32 Error] Empresas.pas(175): E2029 'END' expected but ',' found
[dcc32 Error] Empresas.pas(151): E2065 Unsatisfied forward or external declaration: 'TEmpresasForm.Paint'
[dcc32 Fatal Error] F2063 Could not compile used unit 'Empresas.pas'

muchas gracias de nuevo!
Responder Con Cita
  #8  
Antiguo 22-02-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pon tu código.
Responder Con Cita
  #9  
Antiguo 22-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Código Delphi [-]
interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Imaging.pngimage,
  Vcl.StdCtrls, Vcl.PlatformDefaultStyleActnCtrls, Vcl.Menus, Vcl.ActnPopup,
  Vcl.StdStyleActnCtrls, Vcl.ToolWin, Vcl.ActnMan, Vcl.ActnCtrls, Vcl.ActnMenus,
  System.Actions, Vcl.ActnList, Vcl.Grids, Vcl.DBGrids, Vcl.DBCGrids, Data.DB,
  IBX.IBCustomDataSet, IBX.IBQuery;

type
  TStringGrid = class(Vcl.Grids.TStringGrid);
  TEmpresasForm = class(TForm)
  ...
  procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
  procedure StringGridContactosDrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
  procedure Paint; override;

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  EmpresasForm: TEmpresasForm;
  iterador:Integer;
  R: TRect;

implementation

{$R *.dfm}

uses Login, FondoOscurecer, AnadirEmpresa, Contactos;
{ TStringgrid }
procedure TStringGrid.Paint;
begin
  inherited;
  R := CellRect(Col, Row);
  DrawFocusRect(Canvas.Handle, R);
end;
...
Responder Con Cita
  #10  
Antiguo 23-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Catublipas.

Lo que sucede que has copiado mal...

Esta es tu declaración de TStringGrid:
Cita:
Empezado por Catublipas Ver Mensaje
Código Delphi [-]
...
type
  TStringGrid = class(Vcl.Grids.TStringGrid);
  TEmpresasForm = class(TForm)
  ...
Sin embargo, la propuesta que te hice era:
Cita:
Empezado por ecfisa Ver Mensaje
Código Delphi [-]
...
type
  TStringGrid = class(Grids.TStringGrid)
  protected
    procedure Paint; override;
  end;
  TForm1 = class(TForm)
  ...
Por último te sugerí la reforma del mensaje #6

Creo que el código final debería ser algo como esto:
Código Delphi [-]
...
type
  TStringGrid = class(Vcl.Grids.TStringGrid)
    protected
    procedure Paint; override;
  end;
  TEmpresasForm = class(TForm)
  ...

implementation

procedure TStringGrid.Paint;
var
  R: TRect;
begin
  inherited;
  R := CellRect(Col, Row);
  DrawFocusRect(Canvas.Handle, R);
end;
...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 23-02-2016
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
Otra alternativa es, si tu Delphi soporta los class helpers, es esto:

Código Delphi [-]
type
  TStringGridHelper = class helper for TStringGrid
  public
    procedure Paint; override;
  end;

Luego, podes implementar el metodo Paint;

Los class helper se agregaron justamente para no seguir utilizando el "truco" de la interposer class y resolver este tipo de problemas (acceder a funcionalidad protegida de una clase) de una manera mas elegante
Responder Con Cita
  #12  
Antiguo 23-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Buenas, os comento

he probado las dos maneras la respuesta de ecfisa me da error en la declaracion del procedimiento Paint. Y he probado la respuesta de AgustinOrtu que no me da error en la declaracion de la clase TStringGrid pero me da el siguiente error:

Código Delphi [-]
[dcc32 Error] Empresas.pas(16): E2137 Method 'Paint' not found in base class

Uso Delphi xe7 ¿tiene algo que ver?
Responder Con Cita
  #13  
Antiguo 23-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Catublipas
Cita:
Empezado por Catublipas Ver Mensaje
...
Uso Delphi xe7 ¿tiene algo que ver?
Por los motivos que te expuse no puedo asegurarlo, pero es una posibilidad.

Para salir de dudas, proba este ejemplo que funciona correctamente en Delphi 7:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, Menus, XPMan;

type
  TStringGrid = class(Grids.TStringGrid) //  class(Vcl.Grids.TStringGrid) para tu caso  
  private
    FBorde: Boolean;
  protected
    procedure Paint; override;
  public
    property Borde: Boolean read FBorde write FBorde default False;
  end;

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    PopupMenu1: TPopupMenu;
    MenuItemBorde: TMenuItem;
    XPManifest1: TXPManifest;
    procedure FormCreate(Sender: TObject);
    procedure MenuItemBordeClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation {$R *.dfm}

{ TStringGrid }
procedure TStringGrid.Paint;
var
  R: TRect;
begin
  inherited;
  if not FBorde then
  begin
    R := CellRect(Col, Row);
    DrawFocusRect(Canvas.Handle, R);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  c, r: Integer;
  sg : TStringGrid;
begin
  sg := StringGrid1;
  // títulos de columnas y filas
  sg.Rows[0].CommaText := ',Col1,Col2,Col3,Col4,Col5';
  for r := 1 to sg.RowCount - 1 do
    sg.Cells[0, r] := Format('Fil%d',[r]);

  // algunos valores al StringGrid
  for c := sg.FixedCols to sg.ColCount - 1 do
    for r := sg.FixedRows to sg.RowCount - 1 do
      sg.Cells[c,r] := IntToStr(c+r);

  sg.PopupMenu := PopupMenu1;
  sg.Borde     := True; // StringGrid inicia con borde
end;

// PopupMenu-ItemBorde
procedure TForm1.MenuItemBordeClick(Sender: TObject);
const
  TXT: array[Boolean] of string = ('Poner borde', 'Quitar borde');
begin
  StringGrid1.Borde     := not StringGrid1.Borde;
  MenuItemBorde.Checked := StringGrid1.Borde;
  MenuItemBorde.Caption := TXT[StringGrid1.Borde];
  StringGrid1.Refresh;
end;

end.

Muestra:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 23-02-2016 a las 12:08:39.
Responder Con Cita
  #14  
Antiguo 23-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Buenas ecfisa,
me ha funcionado al parecer me faltaba incorporar la libreria Vcl.grids, ya no me da el error pero no me quita el borde.
Es posible que sea porque el StringGrid lo he creado en tiempo de diseño, o ¿no tiene nada que ver?
Muchas gracias de veras por vuestra ayuda de nuevo!
Responder Con Cita
  #15  
Antiguo 23-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por Catublipas Ver Mensaje
Buenas ecfisa,
me ha funcionado al parecer me faltaba incorporar la libreria Vcl.grids, ya no me da el error pero no me quita el borde.
Es posible que sea porque el StringGrid lo he creado en tiempo de diseño, o ¿no tiene nada que ver?
Muchas gracias de veras por vuestra ayuda de nuevo!
No me parece... controla que la declaración:
Código Delphi [-]
type
  TStringGrid = class(Vcl.Grids.TStringGrid)
  ...
preceda (esté mas arriba) a la definición de la variable de tipo TStringGrid que uses en el formulario.

Otra opción es que hagas una nueva unidad,
Código Delphi [-]
unit Unit2;

interface

uses Windows, Types, Grids; // Vcl.Grids, etc, etc

type
  TStringGrid = class(Grids.TStringGrid) //  class(Vcl.Grids.TStringGrid)
  private
    FBorde: Boolean;
  protected
    procedure Paint; override;
  public
    property Borde: Boolean read FBorde write FBorde default False;
  end;

implementation

{ TStringGrid }
procedure TStringGrid.Paint;
var
  R: TRect;
begin
  inherited;
  if not FBorde then
  begin
    R := CellRect(Col, Row);
    DrawFocusRect(Canvas.Handle, R);
  end;
end;
end.
y luego en el formulario en que la vayas a usar la incluyas en la última posición en el uses de la sección interface:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,  Menus, Grids, Unit2; // <- Última en ser incluída

type
   // (Ya no se necesita la declaración por la inclusión de Unit2)
   TEmpresasForm = class(TForm)
...

Nota: Para todos los casos toma en cuenta las diferencias que tiene Delphi XE7 con Delphi 7 cuando se hace referencia a las unidades y clases, vg.:
Código:
Delphi 7   : Grids.TStringGrid
Delphi XE7 : Vcl.Grids.TStringGrid
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #16  
Antiguo 23-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Perdón corrijo, no termina de quitar el borde jajajaja.
Os paso las imagenes a ver si se os ocurre algo.
Imágenes Adjuntas
Tipo de Archivo: jpg 1.jpg (18,5 KB, 6 visitas)
Tipo de Archivo: jpg 2.jpg (19,4 KB, 5 visitas)
Tipo de Archivo: jpg 3.jpg (17,4 KB, 5 visitas)
Responder Con Cita
  #17  
Antiguo 23-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
He probado creando la unidad nueva, hago referencia en la otra unidad y sigo en las mismas, no me da problemas, pero sigue sin quitar el borde.
Por cierto he probado a desactivar Default Drawing pero es un caos aunque si que quita el borde, pero se desconfigura todo.

Última edición por Catublipas fecha: 23-02-2016 a las 12:55:40.
Responder Con Cita
  #18  
Antiguo 23-02-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
La verdad, estoy imposibilitado de probar el código sobre XE7 así que ando a tientas .

Lo último que se me ocurre es que pruebes calificando la función DrawFocusRect:
Código Delphi [-]
{ TStringGrid }
procedure TStringGrid.Paint;
var
  R: TRect;
begin
  inherited;
  if not FBorde then
  begin
    R := CellRect(Col, Row);
    Windows.DrawFocusRect(Canvas.Handle, R);  // ( también prueba con: Canvas.DrawFocusRect(R); )
  end;
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #19  
Antiguo 23-02-2016
Catublipas Catublipas is offline
Miembro
NULL
 
Registrado: ene 2015
Posts: 55
Poder: 10
Catublipas Va por buen camino
Ecfisa funciona perfecto, he hecho lo que has puesto y he desactivado el Default Drawing y va clavado!
Muchas gracias de nuevo!

Un saludo!
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
Radiogroup sin borde? drykea Varios 3 19-08-2013 14:16:46
TPageControl sin borde Jose Roman OOP 3 11-04-2013 20:02:33
quitar auto seleccion en una celda StringGrid sakuragi OOP 0 01-06-2006 00:01:06
Borde de un Timage NuncaMas Gráficos 2 06-12-2003 10:03:03
Quitar el Borde a un TDateTimePicker Er_Manué OOP 0 13-05-2003 09:41:45


La franja horaria es GMT +2. Ahora son las 22:15:55.


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