DBGrid afeta o Caption do Form?

Delphi

05/12/2006

Olá companheiros de programação!

Delphi 7 - ClientDataSet - 3 Camadas - WebServices - MySQL

Estou com um problema que não consigo achar solução. Eu tenho um form que eu abro e nele tenho uma DBGrid onde eu coloco as linhas zebradas e simulo uma [b:97a77576cd]checkbox[/b:97a77576cd] para o usuário ´selecionar´ os registros que ele quiser e ser gerado daí um arquivo Word.
Tá td funcionando certo, mas acontece que o [b:97a77576cd]Caption[b] do [/b:97a77576cd]Form[/b] fica com o valor da ultima coluna do DBGrid no registro selecionado. Ex: o ultimo campo da DBGRID é um campo de Data e o Caption fica ´14/11/2006´, mto estranho. :shock:

Aqui tá o codigo do OnDrawColumnCell onde eu zebro e desenho a checkbox
var r: TRect;
    t: UINT;
    drawst: Integer;

const IsChecked: array[Boolean] of Integer =
        (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
begin
  r := Rect;

  with GridProd do
  begin
    if not(gdSelected in State) then
      if Odd(DataSource.DataSet.RecNo) then
      begin
        GridProd.Canvas.Font.Color:= clBlack;
        GridProd.Canvas.Brush.Color:= clWhite;
      end
      else
      begin
        GridProd.Canvas.Font.Color:= clBlack;
        GridProd.Canvas.Brush.Color:= $00DCC1AB;  //azul
      end;
    GridProd.Canvas.FillRect(r);

    if (Column.FieldName = ´ENVIAR´) and (DataSource.DataSet.RecNo > 0) then
    begin
      drawst := IsChecked[Column.Field.AsBoolean];
      DrawFrameControl(GridProd.Canvas.Handle, Rect, DFC_BUTTON, drawst);
    end
    else
    begin
      InflateRect(r, -3, -2);
      text := Column.Field.DisplayText;
      case Column.Field.Alignment of
        taLeftJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_LEFT;
        taRightJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_RIGHT;
        taCenter: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_CENTER;
      end;
      DrawText(GridProd.Canvas.Handle, PChar(text), Length(text), r, t);
    end;
  end; 


E aqui está o codigo onde eu mudo o estado da check(campo ´ENVIAR´)
  if Column.FieldName = ´ENVIAR´ then
  begin
    cdsItens.Edit;
    Column.Field.AsBoolean := not Column.Field.AsBoolean;
    cdsItens.Post;

    GridProd.Invalidate;
  end;


Se alguém puder me ajudar eu agradeço e agradeço a todos pela atenção.


Rogick

Rogick

Curtidas 0

Respostas

Massuda

Massuda

05/12/2006

A única forma disso acontecer seria você estar atribuindo um valor a Caption. Já procurou na unit se isso está acontecendo?


GOSTEI 0
Rogick

Rogick

05/12/2006

Já sim Massuda, a unica parte que eu altero o Caption da tela é na sua chamada.

function EscolherItensASeremEnviados(ped: Integer; tipo: string): Boolean;
var f: TEnvioOrcamento;
begin
  Application.CreateForm(TEnvioOrcamento, f);

  with f do
  begin
    PreencherGrade(ped);
    if tipo = ´O´ then mTipo := 1
    else
    if tipo = ´P´ then mTipo := 2;
    Caption := ´Envio de OSE de ´ + TP_PED[mTipo];  //  TP_PED = array[1..2] of string = (´Orçamento´, ´Pedido´)
    
    ShowModal;
    Result := ModalResult = mrOk;
    Release;
  end;
end;


Mas eu vou fazer mais testes, valeu pela atenção, e se puder me ajudar mais eu agradeço


GOSTEI 0
Rogick

Rogick

05/12/2006

Eu achei o erro, está no evento [b:33246bc61b]OnDrawColumnCell[/b:33246bc61b] parece que quando eu executo a função [b:33246bc61b]DrawText[/b:33246bc61b] ele tb desenha no Caption do Form

Aqui tá o codigo do OnDrawColumnCell onde eu zebro e desenho a checkbox
var r: TRect;
    t: UINT;
    drawst: Integer;

const IsChecked: array[Boolean] of Integer =
        (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
begin
  r := Rect;

  with GridProd do
  begin
    if not(gdSelected in State) then
      if Odd(DataSource.DataSet.RecNo) then
      begin
        GridProd.Canvas.Font.Color:= clBlack;
        GridProd.Canvas.Brush.Color:= clWhite;
      end
      else
      begin
        GridProd.Canvas.Font.Color:= clBlack;
        GridProd.Canvas.Brush.Color:= $00DCC1AB;  //azul
      end;
    GridProd.Canvas.FillRect(r);

    if (Column.FieldName = ´ENVIAR´) and (DataSource.DataSet.RecNo > 0) then
    begin
      drawst := IsChecked[Column.Field.AsBoolean];
      DrawFrameControl(GridProd.Canvas.Handle, Rect, DFC_BUTTON, drawst);
    end
    else
    begin
      InflateRect(r, -3, -2);
      text := Column.Field.DisplayText;
      case Column.Field.Alignment of
        taLeftJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_LEFT;
        taRightJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_RIGHT;
        taCenter: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_CENTER;
      end;
      DrawText(GridProd.Canvas.Handle, PChar(text), Length(text), r, t);
    end;
  end; 
[b:33246bc61b][/b:33246bc61b]


GOSTEI 0
Rogick

Rogick

05/12/2006

Descupe-me, não é no DrawText não, é no evento msm :oops:

Eu desvinculei o evento do DBGrid e funcionou numa boa, o problema que tenho que zebrar e colocar a checkbox no DBGrid

To ficando maluco c/ isso, só falta isso p/ eu terminar esta tarefa. :cry:


GOSTEI 0
Rogick

Rogick

05/12/2006

Caros colegas, depois de mta luta descobri o erro, vou colocar o código p/ poder explicar melhor. Acontece... :oops: :lol:

var r: TRect; 
    t: UINT; 
    drawst: Integer; 
    // ??? -> Não declarei uma variável chamada "text"  
const IsChecked: array[Boolean] of Integer = 
        (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); 
begin 
  r := Rect; 

  with GridProd do 
  begin 
    if not(gdSelected in State) then 
      if Odd(DataSource.DataSet.RecNo) then 
      begin 
        GridProd.Canvas.Font.Color:= clBlack; 
        GridProd.Canvas.Brush.Color:= clWhite; 
      end 
      else 
      begin 
        GridProd.Canvas.Font.Color:= clBlack; 
        GridProd.Canvas.Brush.Color:= $00DCC1AB;  //azul 
      end; 
    GridProd.Canvas.FillRect(r); 

    if (Column.FieldName = ´ENVIAR´) and (DataSource.DataSet.RecNo > 0) then 
    begin 
      drawst := IsChecked[Column.Field.AsBoolean]; 
      DrawFrameControl(GridProd.Canvas.Handle, Rect, DFC_BUTTON, drawst); 
    end 
    else 
    begin 
      InflateRect(r, -3, -2); 
      text := Column.Field.DisplayText; // Está atribuindo ao Text ou Caption do Form
                                                       // Ou seja, ERRO, BUG, ETC.!!!!
      case Column.Field.Alignment of 
        taLeftJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_LEFT; 
        taRightJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_RIGHT; 
        taCenter: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_CENTER; 
      end; 
      DrawText(GridProd.Canvas.Handle, PChar(text), Length(text), r, t); 
    end; 
  end; 


Para resolver.... :roll:

var r: TRect; 
    t: UINT; 
    drawst: Integer; 
    txt: string; // Declarar uma variável com o nome text ou outro p/ não confundir 
const IsChecked: array[Boolean] of Integer = 
        (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); 
begin 
  r := Rect; 

  with GridProd do 
  begin 
    if not(gdSelected in State) then 
      if Odd(DataSource.DataSet.RecNo) then 
      begin 
        GridProd.Canvas.Font.Color:= clBlack; 
        GridProd.Canvas.Brush.Color:= clWhite; 
      end 
      else 
      begin 
        GridProd.Canvas.Font.Color:= clBlack; 
        GridProd.Canvas.Brush.Color:= $00DCC1AB;  //azul 
      end; 
    GridProd.Canvas.FillRect(r); 

    if (Column.FieldName = ´ENVIAR´) and (DataSource.DataSet.RecNo > 0) then 
    begin 
      drawst := IsChecked[Column.Field.AsBoolean]; 
      DrawFrameControl(GridProd.Canvas.Handle, Rect, DFC_BUTTON, drawst); 
    end 
    else 
    begin 
      InflateRect(r, -3, -2); 
      txt := Column.Field.DisplayText; // joga o DisplayText NA variavel 
      case Column.Field.Alignment of 
        taLeftJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_LEFT; 
        taRightJustify: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_RIGHT; 
        taCenter: t := DT_SINGLELINE or DT_NOPREFIX or DT_VCENTER or DT_CENTER; 
      end; 
      // Desenha o texto na célula do DBGrid
      DrawText(GridProd.Canvas.Handle, PChar(txt), Length(txt), r, t); 
    end; 
  end; 



Resolvido :!: :!: :!: :D :D :D :D

[i:81f961be15]Se vcs quiserem podem usar este código e depois mostrem para sua mãe como o programa ficou bonito. ehehehe [/i:81f961be15] :wink:


GOSTEI 0
POSTAR