Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Stringgrid doble texto (https://www.clubdelphi.com/foros/showthread.php?t=85664)

Luvac 15-04-2014 20:02:25

Stringgrid doble texto
 
Que tal buen dia,estoy utilizando un stringgrid lo que quiero hacer es que al momento que esta esta seleccionada resalte la fila encontre este codigo buscando en este foro:

Código:

var
  i:Integer;
  texto:STring;
begin
  For i:=1 to StringGrid1.ColCount-1 Do
  begin
      If (gdSelected in State) Then
      begin
        StringGrid1.Canvas.Font.Color := clred;
        StringGrid1.Canvas.Font.Style:=[fsBold];
      end
      else
      StringGrid1.Canvas.Font.Color := clBlack;

      Texto := StringGrid1.Cells[ACol,ARow];
      StringGrid1.Canvas.TextRect( Rect, Rect.Left+2, Rect.Top+2, Texto);
  end;

Lo hase como lo necesito pero el problema es que me escribe doble,una en color rojo adelante y la otra en negro atras,y los titulos tambien los pone dobles,como corrijo esto.(disculpen si este tema ya se habia tocado pero no encontre el topic)

ecfisa 15-04-2014 20:54:00

Cita:

Empezado por Luvac (Mensaje 475174)
...estoy utilizando un stringgrid lo que quiero hacer es que al momento que esta esta seleccionada resalte la fila encontre este codigo buscando en este foro...

Hola Luvac.

No termino de entender el efecto que buscas lograr, pero el código de tu mensaje hace exáctamente lo mismo que este:
Código Delphi [-]
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; 
  Rect: TRect; State: TGridDrawState);
begin
  with Sender as TStringGrid do
  begin
    if gdSelected in State then
    begin
      Canvas.Font.Color:= clred;
      Canvas.Font.Style:= [fsBold];
    end;
    Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol,ARow])
  end
end;

Saludos :)

Luvac 15-04-2014 21:11:52

1 Archivos Adjunto(s)
Hola ecfisa,gracias por tu pronta respuesta:

El efecto que quiero lograr es cuando el usuario seleccione una celda del stringgrid toda la fila resalte,vamos que resalte la fila seleccionada, pero me repinta dos veces una con el color rojo que esta bien pero atrás vuelve a escribir con color negro,con tu código da el mismo resultado.

ecfisa 16-04-2014 04:21:51

Hola Luvac.

A ver... fijate si te sirve de este modo:
Código Delphi [-]
...
type
  TStringGrid = class(Grids.TStringGrid)
  private
    FRowSelected: Integer;
  protected
    function CreateEditor: TInplaceEdit; override;
  public
    property RowSelected: Integer read FRowSelected write FRowSelected;
  end;

  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1Enter(Sender: TObject);
    procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
      var CanSelect: Boolean);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    ...
  private
  public
  end;
...

implementation

{ TStringGrid }
function TStringGrid.CreateEditor: TInplaceEdit;
begin
  Result := inherited CreateEditor;
  if Focused then
    TMaskEdit(Result).Font.Color := clRed
  else
    TMaskEdit(Result).Font.Color := clBlack;
end;

{ TForm }
procedure TForm1.FormCreate(Sender: TObject);
begin
   ...
end;

procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
  TStringGrid(Sender).RowSelected:= -1;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
  ROWCOL : array[Boolean] of TColor = (clBlack, clRed);
begin
  with TStringGrid(Sender) do
  begin
    Canvas.Font.Color:= ROWCOL[ARow = RowSelected];
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[Acol,ARow]);
  end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  with TStringGrid(Sender) do
  begin
    RowSelected:= ARow;
    Invalidate;
  end;
end;
...

Saludos :)

Luvac 16-04-2014 16:43:18

Gracias ecfisa
 
Solo que ahora no me deja ingresar datos me dise que no conoce Rowcount,cell[] etc.

Estoy utilizando Xe4, por cierto en esta parte

Código:

function TStringGrid.CreateEditor: TInplaceEdit;
begin
  Result := inherited CreateEditor;
  if Focused then
    TMaskEdit(Result).Font.Color := clRed
  else
    TMaskEdit(Result).Font.Color := clBlack;
end;

'if Focused' me marca error,si pudieras decirme que unidades utilizaste te lo agradecería ya que yo puse unas y no se si son las correctas.

ecfisa 16-04-2014 18:07:30

Hola Luvac.

El código funciona correctamente en Delphi 7 pero tal vez no lo haga en Delphi XE4... En realidad todo el embrollo de reescribir TInplaceEdit era a fin de que también pusiera el texto en rojo cuando editaras, pero no es relevante para la seleccion de la fila.

Anulando esa parte del código y usando sólo los eventos del StringGrid supongo que tendría funcionarte en XE4 :
Código Delphi [-]
...
implementation

var
  RowSelected: Integer;

procedure TForm1.StringGrid1Enter(Sender: TObject);
begin
  RowSelected:= 0; 
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
  ROWCOL : array[Boolean] of TColor = (clBlack, clRed);
begin
  with TStringGrid(Sender) do
  begin
    Canvas.Font.Color:= ROWCOL[ARow = RowSelected];
    Canvas.TextOut(Rect.Left+2, Rect.Top+2, Cells[Acol,ARow]);
  end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
  ARow: Integer; var CanSelect: Boolean);
begin
  with TStringGrid(Sender) do
  begin
    RowSelected:= ARow;
    Invalidate;
  end;
end;

Saludos :)

Luvac 16-04-2014 18:25:14

Lo siento ecfisa pero sigue igual,no se que le pasa,me pinta dos veces,sabes como cambiarle el color de la fuente por defecto porque se le podria poner un color igual que el del grid y ya no importaria si lo pinta o no porque no se veria.

ecfisa 16-04-2014 18:37:03

Hola Luvac.

No se que decirte... Funciona correctamente en Delphi 7 y lamentablemente no poseo la versión con que trabajas como para revisar el comportamiento que mencionas.

Saludos :)

Luvac 16-04-2014 18:49:12

Gracias ecfisa por tu tiempo,voy a dejarlo asi entonces por el momento y seguiré buscándole.

ecfisa 16-04-2014 20:04:46

Hola Luvac.

Ahora me surge una duda... ¿ Estas trabajando con VCL o FireMonkey ?

Saludos :)

Luvac 16-04-2014 20:56:29

Con vcl eficsa

ecfisa 16-04-2014 21:18:46

1 Archivos Adjunto(s)
Hola Luvac.

Hagamos el último intento, te adjunto el código de prueba que funciona correcto en Delphi 7 y probalo con el XE4, por ahí encontras como adecuarlo...

Recordá que si te da problemas el reescribir la clase TStringGrid podes eliminar esa parte del código y declarar la variable RowSelected como global a la unidad.

Saludos :)

nlsgarcia 17-04-2014 06:52:08

Luvac,

Cita:

Empezado por ecfisa
...Funciona correctamente en Delphi 7 y lamentablemente no poseo la versión con que trabajas (Delphi XE4)...

Cita:

Empezado por Luvac
...sigue igual, no se que le pasa, me pinta dos veces...

El código del archivo adjunto del Msg #12 funciona correctamente en Delphi 7 y Delphi 2010 bajo Windows 7 Professional x32, en Delphi XE4 sin embargo requiere de un pequeño ajuste para que se visualice correctamente la data en las celdas del TStringGrid:
Código Delphi [-]
  
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
const
  ROWCOL : array[Boolean] of TColor = (clBlack, clRed);
begin
  with TStringGrid(Sender) do
  begin
    Canvas.Font.Color:= ROWCOL[ARow = RowSelected];
    Canvas.TextOut(Rect.Left+3, Rect.Top+3, Cells[Acol,ARow]);
  end;
end;
Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 14:50:59.

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