Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Quitar borde de selección a TStringGrid (https://www.clubdelphi.com/foros/showthread.php?t=89853)

Catublipas 18-02-2016 17:35:28

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!

ecfisa 18-02-2016 20:11:07

Hola Catublipas.
Cita:

Empezado por Catublipas (Mensaje 502260)
...
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 :)

Catublipas 19-02-2016 08:43:43

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!

AgustinOrtu 19-02-2016 08:54:09

Firemonkey o VCL?

Catublipas 19-02-2016 10:37:19

Estoy programandolo en VCL Form :P.

ecfisa 20-02-2016 08:11:43

Hola Catublipas.
Cita:

Empezado por Catublipas (Mensaje 502317)
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 :)

Catublipas 22-02-2016 08:59:00

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!

Casimiro Notevi 22-02-2016 09:53:43

Pon tu código.

Catublipas 22-02-2016 10:13:52

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;
...

ecfisa 23-02-2016 02:40:22

Hola Catublipas.

Lo que sucede que has copiado mal...

Esta es tu declaración de TStringGrid:
Cita:

Empezado por Catublipas (Mensaje 502416)
Código Delphi [-]
...
type
  TStringGrid = class(Vcl.Grids.TStringGrid);
  TEmpresasForm = class(TForm)
  ...

Sin embargo, la propuesta que te hice era:
Cita:

Empezado por ecfisa (Mensaje 502272)
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 :)

AgustinOrtu 23-02-2016 03:52:01

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

Catublipas 23-02-2016 09:04:57

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?

ecfisa 23-02-2016 09:55:30

Hola Catublipas
Cita:

Empezado por Catublipas (Mensaje 502454)
...
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 :)

Catublipas 23-02-2016 11:44:16

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! :)

ecfisa 23-02-2016 12:18:25

Cita:

Empezado por Catublipas (Mensaje 502459)
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 :)

Catublipas 23-02-2016 12:24:32

3 Archivos Adjunto(s)
Perdón corrijo, no termina de quitar el borde jajajaja.
Os paso las imagenes a ver si se os ocurre algo.

Catublipas 23-02-2016 12:35:50

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.

ecfisa 23-02-2016 13:20:13

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 :)

Catublipas 23-02-2016 13:43:55

Ecfisa funciona perfecto, he hecho lo que has puesto y he desactivado el Default Drawing y va clavado!
Muchas gracias de nuevo!:)

Un saludo!


La franja horaria es GMT +2. Ahora son las 12:28:04.

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