propriedade PickList Da Grid... Sugestão de Método...

Delphi

29/07/2005

Defini para uma coluna da Grid a Propreidade PickList

e manipilei o evento onKewPress , para que , o usuário não consiga editar, nesta coluna, ... De modo que o conteudo so sera definido pelo que foi previamente armazenado no PicList Desta Coluna... [b:c041293833]Isto é , o usuário não consegue digitar nada Nesta coluna , a não ser o que esta previamente definido na propriedade PicKList[/b:c041293833]

procedure TFormFormMovimentoCheques.DBGrid1KeyPress(Sender: TObject;
  var Key: Char);
begin
  if dbgrid1.SelectedIndex=2 Then
       if Key = #8 Then
         begin
           if  DbGrid1.EditorMode Then
               query1.FieldByName(´Observacoes´).AsString:=´´
           else
             Key:=0;
         end
       else
           Key:=0;
end;


:idea: :idea: :idea: :idea: :idea:
Funciona bem... Mas necessito que ao ser selecionado[size=18:c041293833][b:c041293833] um Item em particular da Grid [/b:c041293833][/size:c041293833], o usuário Possa digitar nessa coluna...

[color=darkred:c041293833]Quando o usuário clicar no PickList[4], da Grid , que no meu caso é ´Pagamento de Contas´ , o usuário poderá acrescentar , a quem se destina esse pagamento de contas[/color:c041293833]

:lol: :lol: :lol: :lol: :lol:
[b:c041293833]Isto também eu consegue , acrescentando o código abaixo [/b:c041293833]:arrow:

procedure TFormFormMovimentoCheques.DBGrid1KeyPress(Sender: TObject;
  var Key: Char);
var
TextoOriginal:String;
begin
  if dbgrid1.SelectedIndex=2 Then
       if Key = #8 Then
         begin
           query1.FieldByName(´Observacoes´).AsString:=´´
         end
       else
         begin
           textoOriginal:=Dbgrid1.DataSource.DataSet.FieldByName
                        (Dbgrid1.Columns.Items[2].FieldName).Value;
           textoOriginal:=Copy(TextoOriginal,0,19);
           if  textoOriginal = Dbgrid1.Columns.Items[2].PickList[4] then
             [b]// Permite digitaçaõ *** O Problema esta aqui[/b]
           else
               Key:=0; //Naão permite digitação
        end;
end;


[color=darkblue:c041293833][size=18:c041293833]O Agravante nisso tudo é que gostaria que o usuario digitasse somente apos o conteudo do Dbgrid1.Columns.Items[2].PickList[4][/size:c041293833][/color:c041293833]

O Contudo do Dbgrid1.Columns.Items[2].PickList[4] no meu caso é [b:c041293833]´Pagamento De Contas´... [/b:c041293833]Assim quando a o cursor ficar posicionado numa posição [b:c041293833]interna[/b:c041293833] a String ´Pagamento De Contas´ , a digitação seria cancelada.... Mas quando o usuário digitar após a String ´Pagamento De Contas´ seria permitido a digitação


Assim o usuario [b:c041293833][size=18:c041293833]tem fixo o conteudo ´Pagamento De Contas[/size:c041293833]´[/b:c041293833] e ele so pode escrever no final dessa palavra ´Pagamento De Contas angela´ Por exemplo

:cry: :cry: :cry: :cry: :cry: :cry: :cry:
Isto sera usado posteriormente para consulta , por isto a necessaidade do usuário não poder alterar o inicio da String

Sei que isto parece ser uma tarefa difícil, mas quem sabe alguem tem uma idéia [size=12:c041293833][/size:c041293833]


Marco Salles

Marco Salles

Curtidas 0

Respostas

Motta

Motta

29/07/2005

Isto deve ser um tipo , eu criaria outra coluna e habilitaria esta somente se fosse do tipo de pagamento de conta, da maneira que fez o usuário pode alterar o inicio da string e depois fica difícil fazer estatisticas sobre isto.

O banco que vc usa suporta constraints/triggers ? Pode usa-las para validar o uso da outra coluna

A 2ª coluna teria somente a descrição da 1ª.


GOSTEI 0
Marco Salles

Marco Salles

29/07/2005

Para quem quiser testar .....

var
 Analisar:Boolean;
 Recursivo:Boolean;
 Acrescentar:Boolean;
 textoPickList:String;
 textoOriginal:String;


procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
 Texto:String;
 Tamanho:Integer;
begin
if not Recursivo Then
  begin
    analisar:=False;
      if dbgrid1.SelectedIndex=1 Then
        if not (DataSource1.State in [DsEdit]) Then
          Query1.Edit;
      TextoPicKList:=DbGrid1.Columns.Items[1].PickList[4];
      textoOriginal:=Dbgrid1.DataSource.DataSet.FieldByName
                 (Dbgrid1.Columns.Items[1].FieldName).AsString;
      Texto:=TextoOriginal;
      Tamanho:=Length(Texto);
      textoOriginal:=Copy(TextoOriginal,0,19);
        if  textoOriginal = Dbgrid1.Columns.Items[1].PickList[4] then
           begin
             if Key =#8 Then
               begin
                 if Tamanho=Length(TextoOriginal) Then
                   query1.FieldByName(´Observacoes´).AsString:=´´
               end
             else
                if key = 32 Then
                  acrescentar:=True;
             analisar:=True;
             textoOriginal:=Dbgrid1.DataSource.DataSet.FieldByName
                   (Dbgrid1.Columns.Items[1].FieldName).AsString;
             keybd_event(VK_TAB,0,0 , 0); // Tab Press
          end
       else
         begin
           if Key = 8 Then
             begin
               query1.FieldByName(´Observacoes´).AsString:=´´
             end
           else
             Key:=0; //Naão permite digitação
        end;
  end
else
  begin
    DbGrid1.EditorMode:=true;
    Recursivo:=False;
  end
end;


procedure TForm1.DBGrid1ColEnter(Sender: TObject);
var
Texto:String;
begin
if analisar Then
begin
keybd_event(VK_Tab, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Texto:=Dbgrid1.DataSource.DataSet.FieldByName
                  (Dbgrid1.Columns.Items[1].FieldName).AsString;
Texto:=Copy(Texto,0,19);
if Texto <> TextoPicKList Then
  begin
    if not (Datasource1.State In [DsEdit])  Then
      query1.Edit;
    Query1.FieldByName(´Observacoes´).AsString:=TextoOriginal;
  end
else
  begin
    if acrescentar then
      begin
         DbGrid1.EditorMode:=True;
         Query1.FieldByName(´Observacoes´).AsString:=TextoOriginal+´ :´;
         Acrescentar:=False;
      end;
  end;
DBGrid1.OnColEnter:=nil;
dbgrid1.SelectedIndex:=1;
DBGrid1.OnColEnter:=DBGrid1ColEnter;
analisar:=False;
recursivo:=True;
end
else
 begin
   if DbGrid1.SelectedIndex=1 Then
     begin
       DbGrid1.EditorMode:=true;
        keybd_event(VK_MENU, 0, 0, 0);
        keybd_event(VK_UP, 0, 0, 0);
        sleep(100);
        keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
       keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
     end
 end;
end;


[size=18:7ceccaa5e0][b:7ceccaa5e0]So não consgui o efeito desejado se no evento onKeyPress Ou No evento OnKeyDown , tiver alguma mensagem... Parece que ele não executa o código de simulação da tecla Tab : [/b:7ceccaa5e0][/size:7ceccaa5e0] :arrow:
keybd_event(VK_Tab, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);


So Não sei o Porque disso :cry: :cry: :cry: :cry:

Mas consegue o que queria , : permiter que o usuário digite somente apos o conteudo do Valor do PicKList

:P :P :P :P :P :P


GOSTEI 0
Marco Salles

Marco Salles

29/07/2005

So uma alteração , da mesma forma que eu o fiz no tópico : onde troquei a Tecla <ENTER> pela Seta para Baixo <Vk_Down> ....

http://forum.devmedia.com.br/viewtopic.php?t=66113&sid=8bb4e8d6982009553d37413b4be9c18e

var
 Analisar:Boolean;
 Recursivo:Boolean;
 Acrescentar:Boolean;
 textoPickList:String;
 textoOriginal:String;


procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
 Texto:String;
 Tamanho:Integer;
begin
if not Recursivo Then
  begin
    analisar:=False;
      if dbgrid1.SelectedIndex=1 Then
        if not (DataSource1.State in [DsEdit]) Then
          Query1.Edit;
      TextoPicKList:=DbGrid1.Columns.Items[1].PickList[4];
      textoOriginal:=Dbgrid1.DataSource.DataSet.FieldByName
                 (Dbgrid1.Columns.Items[1].FieldName).AsString;
      Texto:=TextoOriginal;
      Tamanho:=Length(Texto);
      textoOriginal:=Copy(TextoOriginal,0,19);
        if  textoOriginal = Dbgrid1.Columns.Items[1].PickList[4] then
           begin
             if Key =8 Then
               begin
                 if Tamanho=Length(TextoOriginal) Then
                   query1.FieldByName(´Observacoes´).AsString:=´´
               end
             else
                if key = 32 Then
                  acrescentar:=True;
             analisar:=True;
             textoOriginal:=Dbgrid1.DataSource.DataSet.FieldByName
                   (Dbgrid1.Columns.Items[1].FieldName).AsString;
             keybd_event(VK_TAB,0,0 , 0); // Tab Press
          end
       else
         begin
           if Key = 8 Then
             begin
               query1.FieldByName(´Observacoes´).AsString:=´´
             end
           else
             Key:=#0; //Não permite digitação
        end;
  end
else
  begin
    DbGrid1.EditorMode:=true;
    Recursivo:=False;
  end;
end;


procedure TForm1.DBGrid1ColEnter(Sender: TObject);
var
Texto:String;
begin

if analisar Then
begin
keybd_event(VK_Tab, $45, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
Texto:=Dbgrid1.DataSource.DataSet.FieldByName
                  (Dbgrid1.Columns.Items[1].FieldName).AsString;
Texto:=Copy(Texto,0,19);
if Texto <> TextoPicKList Then
  begin
    if not (Datasource1.State In [DsEdit])  Then
      query1.Edit;
    Query1.FieldByName(´Observacoes´).AsString:=TextoOriginal;
  end
else
  begin
    if acrescentar then
      begin
         DbGrid1.EditorMode:=True;
         Query1.FieldByName(´Observacoes´).AsString:=TextoOriginal+´ :´;
         Acrescentar:=False;
      end;
  end;
DBGrid1.OnColEnter:=nil;
dbgrid1.SelectedIndex:=1;
DBGrid1.OnColEnter:=DBGrid1ColEnter;
analisar:=False;
recursivo:=True;
end
else
 begin
   if Dbgrid1.DataSource.DataSet.FieldByName
                    (Dbgrid1.Columns.Items[1].FieldName).AsString = ´´ Then
     begin
        if DbGrid1.SelectedIndex=1 Then
          begin
             DbGrid1.EditorMode:=true;
             keybd_event(VK_MENU, 0, 0, 0);
             keybd_event(VK_UP, 0, 0, 0);
             sleep(100);
             keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
             keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
          end;
     end
 end;
end;



[b:a091f94586]Eu tb tinha esquecido de acrescentar o Código OnKewDown , quando Postei No Tópico anterior :cry: :cry: :cry: :cry: :cry: [/b:a091f94586]

procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=vk_Down Then
    begin
      if DbGrid1.SelectedIndex=1 Then
        begin
          if (DataSource1.State In [DsEdit]) then
            begin
             Key:=Vk_Return;
             DbGrid1.EditorMode:=true;
             keybd_event(VK_MENU, 0, 0, 0);
             keybd_event(VK_UP, 0, 0, 0);
             sleep(100);
             keybd_event(VK_UP, 0, KEYEVENTF_KEYUP, 0);
             keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
           end;
        end;
    end;
end;


Conclusões :

[b:a091f94586]a)[/b:a091f94586]Disse anterirmente que não tinha conseguido obter o efeito desejado quando acrescentava algum tipo de Mensagem ou no evento OnKeyDown Ou no Evento OnKeyExp...
Por exemplo , a simples instrução [b:a091f94586]Showmessage(´ola´);[/b:a091f94586] Acrescentada em um dessses códigos , é suficiente para que não se obtem os efetitos desejados...

[b:a091f94586]b)[/b:a091f94586]Este código esta ainda em fase de teste.. Os primeiros Resultados são satisfatório..

[b:a091f94586]c)[/b:a091f94586]Ele se destina a situação onde tenho um PICKLIST na Coluna1 Da Grid.. e nesse PickList Tenho Cinco Items... Porem implementei um código , onde todos os items do PICKLIST que são diferente de 4 , não se é permitido a digitação..(eles são fixos)... Porem ao PickList de Numero 4 é permitido a digitação , mas somente apos o conteudo Fixo desse PICKLIST. Assim se o usuário posicionar o Cursor internamente ao conteudo do Valor desse PICKLIST , e tentar digitar algo , ele não consegue alterar o seu valor



GOSTEI 0
POSTAR