Fórum propriedade PickList Da Grid... Sugestão de Método... #290002
29/07/2005
0
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]
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
Curtir tópico
+ 0Posts
29/07/2005
Motta
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
30/07/2005
Marco Salles
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
31/07/2005
Marco Salles
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..
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)