unit uBusca;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs,EditNew,
  Db, DBTables, fOx3Bus, DBGrids, IBQuery, Grids, Buttons, WinTypes,
WinProcs, Rotger,IbDataBase;

type
  Tbusca = class(TIbquery)
  private
    { Private declarations }
    procedure FormkeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState); Protected
    procedure FormKeyPress(Sender: TObject; var Key: Char); Protected
    procedure DBGrid1KeyDown(Sender: TObject; var Key: Word;
    Shift: TShiftState); Protected
    procedure BitBtn2Click(Sender: TObject); Protected
    procedure BitBtn1Click(Sender: TObject); Protected
    Procedure DBGrid1DblClick(Sender: TObject); Protected
    procedure ComboChange(Sender: TObject); Protected
    procedure ComboExit(Sender: TObject); Protected
    Procedure EditChange(Sender: TObject); Protected
    Procedure EditExit(Sender: TObject); Protected
    Procedure CarregarDados(Primeiro: Boolean); Protected
    Procedure AdPesquisa(Campo,Mascara: String; Campos: String); Protected
    Function PegaLargura: Integer; Protected


    FTitulo: String;
    FCondicaoRetorno: String;
    Flargura: Integer;
    FModo: TModalREsult;
    FMostrarTudo: Boolean;


  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(AOwner : Tcomponent); override;
    procedure Execute;
  published
    { Published declarations }
    property Titulo: String read FTitulo write FTitulo;
    property CondicaoRetorno: String read FCondicaoRetorno write
FCondicaoRetorno;
    property Largura: Integer read FLargura write FLargura;
    property ModalResult: TModalREsult read Fmodo Write Fmodo;
    property MostrarTudo: Boolean read FMostrarTudo Write FMostrarTudo;

  end;

procedure Register;

implementation
Var
  Qtos: Integer;
  c: Tbusca;

procedure Register;
begin
  RegisterComponents('Vc', [Tbusca]);
end;

Procedure TBusca.Execute;
Var
  I,N: Integer;
  Tbus: String;
  Vet: Array Of String;
Begin
  Fox3Busca:=TfOx3Busca.Create(Application);
  Fox3Busca.Width:=PegaLargura;
  if Titulo='' then Titulo:='Consulta de Dados.';
  CarregarDados(True);


Fox3Busca.Dbgrid1.Options:=[dgTitles,dgColLines,dgIndicator,dgRowLines,dgTabs,dgRowSelect,dgAlwaysShowSelection,dgConfirmDelete];
  Fox3Busca.KeyPreview:=True;
  Fox3Busca.OnKeyDown:=FormKeyDown;
  Fox3Busca.OnKeyPress:=FormKeyPress;
  Fox3Busca.suiButton1.OnClick:=BitBtn1click;
  Fox3Busca.suiButton2.OnClick:=BitBtn2click;
  Fox3Busca.Dbgrid1.OnDblClick:=DBGrid1DblClick;
  Fox3Busca.DbGrid1.OnKeyDown:=DbGrid1KeyDown;
  Fox3Busca.Combo.OnChange:=ComboChange;
  Fox3Busca.Combo.OnExit:=ComboExit;
  Fox3Busca.Editn1.OnChange:=EditChange;
  Fox3Busca.Editn1.OnExit:=EditExit;
  Fox3Busca.Caption:=Titulo;
  Fox3Busca.ShowModal;
  If Sair=1 Then ModalResult:=MrOk
  Else ModalResult:=MrCancel;
  Fox3Busca.Free;
End;

procedure Tbusca.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  If Fox3Busca.Combo.Tag<>2 Then
  Begin
    If Fox3Busca.dbgrid1.Focused Then Exit;
    If Key=Vk_Up Then Prior;
    If Key=Vk_Down Then Next;
    If IntToStr(Key)='34' Then MoveBy(14);
    If IntToStr(Key)='33' Then MoveBy(-14);
    If (Not Fox3Busca.DbGrid1.Focused) and (Not
Fox3Busca.Suibutton1.Focused) Then
    Begin
  //    If (IntToStr(Key)='38') or (IntToStr(Key)='34') or
(IntToStr(Key)='40') Then Fox3Busca.DbGrid1.SetFocus;
      If IntToStr(Key)='13' Then Fox3Busca.suiButton1.SetFocus;
    End;
  End;
  If Key=Vk_F12 Then
  Begin
    Fox3Busca.Combo.SetFocus;
    Fox3Busca.Combo.Tag:=2;
  End;
end;

procedure Tbusca.FormKeyPress(Sender: TObject; var Key: Char);
begin
end;

procedure Tbusca.DbGrid1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  If IntToStr(Key)='13' Then Fox3Busca.suiButton1.SetFocus;
end;

procedure Tbusca.BitBtn2Click(Sender: TObject);
Begin
  Sair:=2;
  Fox3Busca.Close;
End;

procedure Tbusca.BitBtn1Click(Sender: TObject);
Begin
  Sair:=1;
  Fox3Busca.Close;
End;

procedure Tbusca.DBGrid1DblClick(Sender: TObject);
Var
  TqArq: TQuery;
  Wcampo: String;
  I:Integer;
Begin
  // Verifica Campo Retorno
  If Not Vazio(CondicaoRetorno) Then
  Begin
    Wcampo:='';
    For I:=1 to Length(CondicaoRetorno) do
    Begin
      If Vazio(Copy(CondicaoRetorno,I,1)) Then Break;
      Wcampo:=Wcampo+Copy(CondicaoRetorno,I,1);
    End;
    If Not Vazio(Wcampo) Then
    Begin
      TqArq:=TQuery.Create(Application);

*******************

      TqArq.Database:=database;    // AQUI EXATAMENTE DA O ERRO - Cannot 
assign to a read-only property

*******************

      For I:=0 to Sql.Count-1 Do
      Begin
        If (Pos('ORDER',UpperCase(Sql[i]))<>0) or
(Pos('Where',UpperCase(Sql[i]))<>0)  Then Break;
        Tqarq.Sql.Add(Sql[i]);
      End;
      For I:=0 to FieldCount-1 do
      begin
        If UpperCase(Wcampo)=UpperCase(Fields[i].FieldName) Then
        Begin
          If Fields[i].DataType=ftInteger Then
          Begin
            Tqarq.Sql.Add('Where 
'+TrocaStr(CondicaoRetorno,Wcampo,InttoStr(Fox3Busca.DataSource1.DataSet.FieldValues[Wcampo])));
          End;
        End;
      End;
      Try
        Tqarq.Open;
        If Tqarq.Recordcount=0 Then ShowMessage('Selecao nao Valida');
      Except
      End;
    End;
  End;
  Sair:=1;
  Fox3Busca.Close;
End;

procedure Tbusca.ComboChange(Sender: TObject);
Begin
  CarregarDados(False);
  Fox3Busca.Combo.Tag:=1;
  Fox3Busca.DbGrid1.SetFocus;
end;

procedure Tbusca.ComboExit(Sender: TObject);
Begin
  Fox3Busca.Editn1.Clear;
  Fox3Busca.Editn1.SetFocus;
end;

procedure Tbusca.EditChange(Sender: TObject);
Var
  CampoPesquisa: String;
begin
  If Fox3Busca.Combo.Items.Count<>0 Then
  Begin;

CampoPesquisa:=Copy(Fox3Busca.Combo.Text,Pos('@',Fox3Busca.Combo.Text)+1,40);//Copy(Fox3Busca.Combo.Text,1,30);
    If Fields[Fox3Busca.Combo.ItemIndex].DataType=FtString Then
       Locate(CampoPesquisa,Fox3Busca.Editn1.Text,[LoPartialKey])
       Else If Fields[Fox3Busca.Combo.ItemIndex].DataType=FtInteger Then
       Begin
         If Not Vazio(Fox3Busca.Editn1.Text) Then
Locate(CampoPesquisa,StrtoInt(Fox3Busca.Editn1.Text),[LoPartialKey])
       End;
  End;
end;

procedure Tbusca.EditExit(Sender: TObject);
begin
  If Fox3Busca.DbGrid1.Focused Then Exit;
end;

Procedure Tbusca.CarregarDados(Primeiro: Boolean);
Var
  I,N: Integer;
  CampoPesquisa,Arquivo,xSql,Campos,Pedaco,Resto: String;
  Vet: Array Of String;
begin

  Close;
  If Not Primeiro Then
  Begin
    For I:=0 to Sql.Count-1 Do
    Begin
      If Pos('ORDER',UpperCase(Sql[i]))<>0 Then
      Begin
        Sql[i]:='Order By
'+Copy(Fox3Busca.Combo.Text,Pos('%',Fox3Busca.Combo.Text)+1,100);
        Break;
      End;
    End;
  End;

  For I:=0 To Sql.Count-1 Do
  Begin
    If I=0 Then Campos:=Copy(Sql[i],7,Pos('FROM',UpperCase(Sql[i]))-7);
    If Pos('ORDER BY',UpperCase(Sql[i]))<>0 Then
    Begin

CampoPesquisa:=TiraBrancos(Copy(Sql[i],Pos('BY',UpperCase(Sql[i]))+2,Length(Sql[i])));

CampoPesquisa:=TiraBrancos(Copy(CampoPesquisa,1,SeInt(Pos(',',CampoPesquisa)=0,Length(CampoPesquisa),Pos(',',CampoPesquisa)-1)));
    End;
  End;
  {  For I:=0 To Sql.Count-1 Do
    ShowMessage(Sql[i]);}

  Open;
  Active:=True;
  Fox3Busca.DataSource1.dataset:=Self;
  SetLength(Vet,FieldCount);
  qtos:=-1;

  // Verifica Alinhamentos
  For I:=0 to FieldCount-1 do
  begin
    If Fields[i].DataType=ftCurrency Then
Fields[i].Alignment:=TaRightJustify;
    If Fields[i].Visible Then
    Begin
      Inc(Qtos);
      If (Fields[i].DataType=FtString) or (Fields[i].DataType=FtDateTime)
Then
          Fox3Busca.DBGrid1.Columns[Qtos].Title.Alignment:=TaCenter;
    End;
  End;

  For I:=0 to FieldCount-1 do
  begin
    If (Primeiro) and (Fields[i].Visible) and
(Fields[i].FieldKind<>fkCalculated) Then
AdPesquisa(Fields[i].fieldname,Fields[i].DisplayLabel,Campos);
//AdPesquisa(Fields[i].fieldname,Campos);
  End;


  If Not Primeiro Then
  Begin
    if fields[Fox3Busca.combo.ItemIndex].DataType=ftString then
       Fox3Busca.EditN1.EditType:=etString
    else if (fields[Fox3Busca.combo.ItemIndex].DataType=ftFloat) or
(fields[Fox3Busca.combo.ItemIndex].DataType=ftCurrency) then
       Fox3Busca.EditN1.EditType:=etFloat
    else if (fields[Fox3Busca.combo.ItemIndex].DataType=ftInteger) or
(fields[Fox3Busca.combo.ItemIndex].DataType=ftSmallInt) then
       Fox3Busca.EditN1.EditType:=etInteger;

  End;
  N:=0;
  For I:=0 to Fox3Busca.Combo.Items.Count-1 do
  Begin
    If
UpperCase(CampoPesquisa)=UpperCase(Copy(Fox3Busca.Combo.Items.Strings[i],Pos('%',Fox3Busca.Combo.Items.Strings[i])+1,100))
Then
    Begin
      N:=I;
      Break
    End
    Else N:=0
  End;
  Fox3Busca.Combo.Itemindex:=N;
End;

Procedure Tbusca.AdPesquisa(Campo,Mascara:String; Campos: String);
Var
  Wpos,I: Integer;
  Pedaco,Wvar: String;
Begin
  Wpos:=Pos(UpperCase(Campo),UpperCase(Campos));
  Wvar:='';
  If Wpos<>0 Then
  Begin
    Pedaco:='';
    // Acha o Pedaco antes da variavel  Ex C.
    for I:=Wpos-1 downto 1 do
    Begin
      If Copy(Campos,I,1)=',' Then Break;
      Pedaco:=Pedaco+Copy(Campos,I,1);
    End;
    Wvar:='';
    // Acerta o Pedaco achado mudando-o de posicao

    For I:=Length(Pedaco) DownTo 1 Do
        Wvar:=Wvar+Copy(Pedaco,I,1);

    If Pos(' AS',UpperCase(Wvar))<>0 Then Wvar:=Copy(Wvar,1,Pos('
AS',UpperCase(Wvar))-1)
    Else
    Begin
      For I:=Wpos to Length(Campos) do
      Begin
        If (Copy(Campos,I,1)=' ') or (Copy(Campos,I,1)=',') Then Break;
        Wvar:=Wvar+Copy(Campos,I,1);
      End;
    End;
  End;
  Fox3Busca.Combo.Items.add(Mascara+Repli('
',200)+'@'+PadDir(Campo,40)+'%'+Wvar)
end;

Function Tbusca.PegaLargura: Integer;
Var
  I,Wtam,Wret: Integer;
begin
  Wtam:=0;
  If Largura=0 Then
  Begin
    For I:=0 To FieldCount-1 Do
        If Fields[i].Visible Then Wtam:=Wtam+Fields[i].DisplayWidth;
    If Trunc(Wtam*6.50) > Fox3Busca.Width Then Wret:=Trunc(Wtam*6.50)
    Else Wret:=Fox3Busca.Width;
  End
  Else
  Begin
    Wret:=Largura;
    If Wret<Fox3Busca.Width Then Wret:=Fox3Busca.Width;
  End;
  If Wret>796 Then Wret:=796;
  Result:=Wret;
End;

constructor Tbusca.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Largura:=0;
end;


end.






----- Original Message ----- 
From: "Joao Morais" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Tuesday, October 17, 2006 4:14 PM
Subject: Re: [delphi-br] Erro na criação de um componente


> Doretto wrote:
>
>> Eu acho que o problema esta em  criar dentro de um componente que é 
>> baseado
>> no Ibquery outro ibquery..  ele nao aceita que eu use as propriedades do
>> ibquery...
>
> Poder, pode. Passe a rotina inteira pra gente dar uma olhada.
>
> --
> João Morais
>
>
>
> -- 
> <<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>
>
> Links do Yahoo! Grupos
>
>
>
> 



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 

Responder a