Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. "se voce esta contente bata palma" (interessante nick...) :huh: bom, a sugestão é que você faça uso o método Add da propriedade SQL (é um TStrings) associado a passagem por parâmetros. Apesar de extenso, seu código ficará mais legível e elegante. Além disso, para minimizar a digitação, faça uso de with ... do: ... with modulo.Gravar_idPessoal do begin Close; SQL.Add('insert into tab_identificacao'); SQL.Add('(cod_moradia,area,quadra,lote,endereco,numero,compl,cep,'); SQL.Add( 'bairro,ponto_ref,tel,cel,tel_rec,um_resp,um_apelido,um_pai,'); SQL.Add( 'um_mae,um_pais,um_cidade,um_uf,um_tempo_SV,um_tempo_atual,'); SQL.Add( 'um_tempo_bairro,um_pis,um_cert_nasc,um_cart_trab,um_cert_casam,'); SQL.Add( 'um_rg,um_dta_emis,um_org_emis,um_cpf)'); SQL.Add('values(:cod_moradia,:area,quadra,:lote,:endereco,:numero,:compl,:cep,'); SQL.Add( ':bairro,:ponto_ref,:tel,:cel,:tel_rec,:um_resp,:um_apelido,:um_pai,'); SQL.Add( ':um_mae,:um_pais,:um_cidade,:um_uf,:um_tempo_SV,:um_tempo_atual,'); SQL.Add( ':um_tempo_bairro,:um_pis,:um_cert_nasc,:um_cart_trab,:um_cert_casam,'); SQL.Add( ':um_rg,:um_dta_emis,:um_org_emis,:um_cpf)'); ParamByName('cod_moradia').AsString := nm_cad; ParamByName('area').AsString := nm_area; ParamByName('quadra').AsString := nm_quadra; ParamByName('lote').AsString := nm_lote; ParamByName('endereco').AsString := ed_endereco.Text; ParamByName('numero').AsString := ed_numero.Text; ParamByName('compl').AsString := ed_complem.Text; ParamByName('cep').AsString := ed_cep.Text; : : ParamByName('um_rg').AsString := ed_rg1.Text; ParamByName('um_dta_emis').AsString := mk_dtemissao1.Text; ParamByName('um_org_emis').AsString := ed_orgao1.Text; ParamByName('um_cpf').AsString := ed_cpf1.Text; ExecSQL; end; ... end; Na verdade, se você utiliza este TQuery (Gravar_idPessoal) apenas para esta finalidade, não teria porquê adicionar as linhas da instrução "insert ... values" no código do seu programa. Utilizando a forma como expus acima (parametrização) basta que você coloque dentro da propriedade SQL (em design-time - clicando no quadrinho com "...") toda a instrução "insert ... values" e no código você teria apenas a parte da passagem de parâmetros (os ParamByName) - ficaria muito mais enxuto, não acha?! E simplificando mais ainda, eu perguntaria por que você não utiliza os componentes Dataware (como o TDBEdit) - não teria todo este trabalho. :blink: Abraços
  2. Isabela, não seria o caso de utilizar um componente tipo o quickreport para mostrar seu texto?! :unsure: Provavelmente você está utilizando um componente TRichEdit para o editor, não?
  3. Micheus

    Contador No Dbgrid

    deio, que banco de dados você está utilizando? (paradox permitiria isso facilmente)Que componente? Esse seu DBGrid mostra dados filtrado, tipo usando um like? Você tem ordenação por algum campo e ele pode variar (hora um campo hora outro)?
  4. Pirambu!, dá uma olhada neste outro post e veja se consegue resolver seu problema.
  5. Carlos Rocha, este seu post já está fora do escopo do tópico "Problemas Na Instalação". <_< De qualquer modo, que eu saiba, com o DBLookupCombobox não tem como. O que ocorre (se a questão for digitar um texto para a localização) é que ao digitar um seqüência de caracteres, o resultado é equivalente a um select <campo> like <seqüência digitada>.
  6. Então, vale o que coloquei logo abaixo dos questionamentos. Voce não está utilizando a propriedade HostName e, conforme mencionei antes, acredito que você precisará configurá-la - leia com atenção o que sugeri no outro post. Normalmente o que você deve fazer para conseguir isto é definir AutoSize = false, definir a largura desejada (Width) e setar a propriedade AutoStretch = True. Você deverá apenas ter em mente que não deverá haver nada logo abaixo deste componente (na mesma banda é claro), pois se o mesmo for expandido, encobrirá o que estiver logo abaixo. O ideal é que um componente nesta configuração esteja sozinho na banda ou no final de uma. Abraços
  7. Carlos Rocha, achoe que agora não é um problema de instalação, mas sim uma questão de conexão ao banco. Como foi que você implementou a conexão ao banco no seu código (seja em linhas de código ou no componente de conexão)? Colocou um caminho fixo? Se você utilizou a Zeos lib, você deve ter um componente chamado ZConnection com as devidas propriedades configuradas de modo a acessar o banco de dados. Num programa que utilizei Zeos lib + MySQL, para acesso via rede, utilizei as propriedades conforme seguem: HostName: <endereço IP ou nome da máquina na rede> User: <nome de usuário - root é o padrão> Password: <senha para o usuário informado> Protocol: <protocolo mysql - genérico ou conforme versão mysql-4.1, mysql-5> Para acessar o banco, propriamente dito, você pode optar pelas propriedades: Database: <nome do banco de dados - ou Schema quando você utiliza alguma ferramenta para sua criação> ou Catalog: <nome do Schema> (pelo que entendi, isto é como um alias - apelido) Então o que faço é, na máquina onde está instalado o programa, carregar de um arquivo .ini o endereço do servidor para onde deverá ser feita a conexão. Com o valor lido, basta atribuir a respectiva propriedade e conectar. Abraços
  8. Erso, se não estou enganado não há como trabalhar com script's com os componentes da paleta BDE. É mais provável que você crie um procedimento e passe cada instrução a ele para executar. Talvez algo assim: procedure Datamodule1.ExecScript; procedure ExecSQLCmd(SQLCmd :string); begin Query1.SQL.Clear; Query1.SQL.Add(SQLCmd); Query1.ExecSQL; end; ... begin ExecSQLCmd('UPDATE OPERADOR O SET O.CARGO = ''cargo1'' WHERE O.CD_OPERADOR = 1'); ExecSQLCmd('UPDATE OPERADOR O SET O.CARGO = ''cargo2'' WHERE O.CD_OPERADOR = 2'); end;
  9. agora quero saber como faço para formatar essa celula para "moeda" Hudson Cavazin, veja se a dica neste outro tópico lhe ajuda. Dá uma olhada neste outro também. o excel não entende isso como uma função. Com certeza, pois você tem que dar um endereço referente a uma área -> linha/coluna e você está informando apenas a coluna C, esse endereço tem que ser algo como C1:C10 (coluna C da linha 1 até a 10). Isso é bem fácil de verificar, basta que você abra o Excel e crie um exemplo. Abraços
  10. Carlos Rocha, que bom que descobriu sozinho.Mas apenas para ficar claro a qualquer um que acompanhe este tópico: ao relatório QuickReport só podem ser adicionados componentes provenientes de sua paleta. Qualquer outra coisa, não estará ligada ao quick, mas sim ao form que o "hospeda". Pirambu!, a idéia será por aí mesmo. No caso específico deste campo o Carlos Rocha poderia utilizar direto um TQRDBText ligado ao campo QryPedidosCondicaoPgto. Mas no que se refere aos prazos anteriormente marcados nas caixas, daí teria que utilizar o procedimento que você citou. A exemplo do que sugeri no tutorial que postei em resposta ao outro postdele, poderia ser utilizado um procedimento para inicializar o texto a ser passado ao QRLabel que você sugeriu: function ConvertPrazos(OpcStr :string) :string; const Delimitador = ','; Prazos :array[0..6] of string = (' 15 dias,', ' 30 dias,', ' 45 dias,', ' 60 dias,', ' 75 dias,', ' 90 dias,', '120 dias,'); var Idx :Integer; begin Result := ''; while OpcStr <> '' do begin Idx := Pos(Delimitador, OpcStr); // não encontrar o delimitador, significa que o // resto da string contém o último valor if Idx = 0 then // neste caso, marcamos posição como posterior ao último caracter Idx := Length(OpcStr) +1; // Concatena prazo Result := Result +Prazos[StrToInt(Copy(OpcStr, 1, Idx -1))]; // elimina o item já processado da lista - em OpsStr Delete(OpcStr, 1, Idx); end; SetLength(Result, Length(Result) -1);; end; ... procedure TQRForm.QRBandBeforePrint(.....); begin // habilita impressão dos prazos apenas se esta foi a opção cadastrada QRLabelPrazo.Enabled := QryPedidosCondicaoPgto.AsString = 'A Prazo'; // monta o texto apenas se vai imprir esta opção if QRLabelPrazo.Enabled then QRLabelPrazo.Caption := ConvertPrazos(QryPedidosPrazoPgto.AsString); // suponde este o nome do campo end;Isso levando em conta que foram gravados dos índices marcados no CheckListBox, porque se foram armazenados os textos ,não há necessidade disto - é direto o campo no TQRDBText. Carlos Rocha, esta parte da "conversa" o pessoal aqui não conhece - não misture as coisas! <_< Quem lhe deu uma resposta neste post foi o Pirambu! não eu. ;) Abraços
  11. Carlos Rocha, vou apenas lhe sugerir olhar o código do programa exemplo que postei lá na sessão Tutoriais & Dicas, como citei antes. Por todas essas suas perguntas, percebo que você não a olhou e nem baixou o anexo com o programa e código completos para avaliar o que fazer para seu código funcionar. Todas estas questões estão funcionando lá.
  12. Carlos Rocha, como mais alguém pode precisar disto e a coisa é mais ou menos simples, fiz um mini-tutorial de como simular um DBCheckListBox e espero que possa lhe ajudar. Veja em Tutoriais & Dicas, tem um exemplo funcionando lá. Abraços
  13. Na paleta DataControls do Delphi não existe um componente DBCheckListBox que nos permita gravar uma seleção de itens num determinado campo de uma tabela. Ao tentar ajudar na solução desta questão neste post do colega Carlos Rocha, verifiquei que era um questionamento que já existia por aí, mas sem resposta. Resolvi então colocar nesta sessão (para que possa mais facilmente ser consultada por outros colegas), um mini-tutorial de como simular um DBCheckListBox a partir de um simples CheckListBox. (o código completo está disponível para download no final deste post) Primeiramente, vamos observar como o "componente" deveria operar: - Ao ser posicionado um registro, o CheckListBox deve mostrar marcado os itens que estão gravados no campo apropriado; - Ao marcarmos ou desmarcarmos um item, isto deveria se refletir no campo sendo editado, onde o nº da posição marcada seria armazenado; Sem esquecer de que, se não estiver em modo edição, devemos verificar se o DataSource está configurado para AutoEdit e então pôr o dataset em modo edição. Estarei utilizando a gravação do índice que aponta para o item marcado, mas poderíamos gravar o texto do item selecionado. O procedimento seria semelhante. A vantagem sobre utilizar um ou outro fica a critério de cada um. O componente CheckListBox armazena a informação sobre qual item está marcado na propriedade Checked. Esta propriedade é um array com o nº de posições igual ao nº de itens configurados na lista. Vamos, então, precisar criar um procedimento que possa ler os itens marcados e montar uma string com este valor para que a mesma possa ser gravada no banco: ... implementation {$R *.dfm} const Delimitador = ','; // Este procedimento é responsável por ler o valor gravado // no campo da tabela e mostrá-lo no CheckListBox procedure TForm1.PopulaCheckListBox; var Idx :Integer; OpcStr :string; begin // limpa seleção for Idx := 0 to CheckListBox1.Count -1 do CheckListBox1.Checked[Idx] := False; OpcStr := Table1Opcao_PrazoNum.AsString; while OpcStr <> '' do begin Idx := Pos(Delimitador, OpcStr); // não encontrar o delimitador, significa que o // resto da string contém o último valor if Idx = 0 then // neste caso, marcamos posição como posterior ao último caracter Idx := Length(OpcStr) +1; // Marca como selecionado o item lido CheckListBox1.Checked[StrToInt(Copy(OpcStr, 1, Idx -1))] := True; // elimina o item já processado da lista - em OpsStr Delete(OpcStr, 1, Idx); end; end; Para que ao movimentarmos a posição do registro na tabela, mais facilmente observado quando utilizamos DBGrid para mostrar os dados na mesma tela em que cadastramos, nós utilizaremos o evento OnDataChange do componente TDataSource que está ligado aos componentes de edição (no nosso caso, também será o mesmo que o do DBGrid). Este evento ocorre a cada modificação de um campo do dataset, então deve ser utilizado com moderação. Nós só atualizaremos a lista, a partir do registro atualmente selecionado, somente quando o dataset estiver no modo visualização (dsBrowse):procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField); begin // vamos manipular a lista apenas no modo exibição if (Sender as TDataSource).State = dsBrowse then PopulaCheckListBox; end; Nosso próximo objetivo é que ao marcarmos/desmarcarmos um item, o campo seja atualizado. Utilizaremos o evento OnClickCheck do componente CheckListBox. Este evento ocorre justamente nestas situações:procedure TForm1.CheckListBox1ClickCheck(Sender: TObject); var Idx :Integer; begin // verificamos se é possível colocar a tabela em modo // edição apenas click direto sobre a lista if DataSource1.AutoEdit then DataSource1.Edit else Exit; // o campo pode ser limpo em qualquer situação, pois, se for o caso, // será novamente prenchido com os valores atuais. Se cancel for // utilizando, as informações não serão perdidas Table1Opcao_PrazoNum.Clear; // *** ilustrando como seria se gravássemos o texto ao invés do índice // Table1Opcao_PrazoStr.Clear; // verifica para cada elemento da lista, se algum está marcado for Idx := 0 to CheckListBox1.Count -1 do begin // apenas se estiver marcado contatena no campo if CheckListBox1.Checked[Idx] then begin Table1Opcao_PrazoNum.AsString := Table1Opcao_PrazoNum.AsString + IntToStr(Idx) +Delimitador; // *** ilustrando como seria se gravássemos o texto ao invés do índice // Table1Opcao_PrazoStr.AsString := Table1Opcao_PrazoStr.AsString + CheckListBox1.Items[Idx] +Delimitador; end; end; // retira o delimitador que fica sobrando no final Table1Opcao_PrazoNum.AsString := Copy(Table1Opcao_PrazoNum.AsString, 1, Length(Table1Opcao_PrazoNum.AsString) -1); // *** ilustrando como seria se gravássemos o texto ao invés do índice // Table1Opcao_PrazoStr.AsString := Copy(Table1Opcao_PrazoStr.AsString, 1, Length(Table1Opcao_PrazoStr.AsString) -1); end; No caso de optar por gravar o texto e não o índice, basta que nas linhas do código acima sejam suprimidas as que contém Opcao_PrazoNum e sejam retirados os comentários das que contém Opcao_PrazoStr. Já a procedure PopulaCheckListBox deve ser substituída pelo código abaixo:procedure TForm1.PopulaCheckListBox; var Idx :Integer; OpcStr :string; begin // limpa seleção for Idx := 0 to CheckListBox1.Count -1 do CheckListBox1.Checked[Idx] := False; OpcStr := Table1Opcao_PrazoStr.AsString; while OpcStr <> '' do begin Idx := Pos(Delimitador, OpcStr); // não encontrar o delimitador, significa que o // resto da string contém o último valor if Idx = 0 then // neste caso, marcamos posição como posterior ao último caracter Idx := Length(OpcStr) +1; // Marca como selecionado o item lido if CheckListBox1.Items.IndexOf(Copy(OpcStr, 1, Idx -1)) >= 0 then CheckListBox1.Checked[CheckListBox1.Items.IndexOf(Copy(OpcStr, 1, Idx -1))] := True; // elimina o item já processado da lista - em OpsStr Delete(OpcStr, 1, Idx); end; end; Espero que consigam ajustar às suas necessidades. O exemplo está em anexo, se houver problemas também pode ser baixado deste link. Abraços DBCheckListBox.zip
  14. deio, você definiu um índice pelo campo que você quer procurar?Uma outra coisa que observei é, que apesar de definir o índice com a propriedade case insensitive, se o texto da busca não for digitado de acordo com o gravado, ele não encontra (pelo menos foi só observando isso que obtive resultado positivo). Também observe que quando você procura utilizando stEqual você só encontrará o texto digitado se ele existir exatamente como digitado. Voltando ao seu post anterior: É complicado tentar lhe explicar (assim, trocando mensagem) algo do qual você não tem praticamente idéia alguma. Sugiro que você procure por alguma apostila ou livro básico para que você possa ter uma idéia melhor da programação Delphi, bem como uso de seus componentes basicos (edição e acesso a banco - paleta BDE). Dê uma olhada neste link, eu coloquei um exemplo bem simples (um form, com um edit para você digitar o que procurar, um botão para executar esta ação e um dbgrid que mostra o conteúdo da tabela). Tem que esperar um pouquinho até aparecer o botão para download. No site SourceForge, onde o componente está "hospedado", há um link para download de um demo bastante completo. Ele lista os recursos e habilita um botão com caption "Demo" para mostrar numa outra janela o exemplo tópico explicado - dê uma olhada. Caso você já não o tenha baixado, click aqui para acessá-la. Só uma curiosidade: você tem mesmo que começar a lidar com banco de dados, utilizando justamente um componente que não é o "padrão" do Delphi ou escolheu ele por acaso? E que isso implicará em poucos exemplos/auxílio a respeito. Abraços
  15. deio, supondo que seu Form3 seja o form de busca e que datamodule6.DBF1 seja o dataset também utilizado no seu DBGrid no outro form, a localização por sí só, já deveria ter acontecido - exceto se não foi encontrado nada igual ao que você procurou. Acredito que a sua busca deva está ocorrendo sobre o campo que é o índice da sua tabela, se não for, também não deverá encontrar nada. se você testar o resultado da função, você terá certeza se está ou não encontrando o que procura: procedure TForm3.Button1Click(Sender: TObject); var busca : variant; begin busca := edit1.text; if datamodule6.Dbf1.SearchKey(busca,stEqual) then ShowMessage('Encontrei o que procurava!'); end; Quando colocar código aqui no forum, utilize as tag's (veja botões na barra de edição) para melhor visualização do código, com fiz agora acima. ;) Abraços
  16. Antonio Jose, sobre colar no Excel talvez você possa utilizar este tópico em Tutoriais & Dicas (ali em cima na página).Mas, se antes de exportar, você quiser mostrar todas as linhas selecionadas você deverá marcar as mesmas utilizando a propriedade SelectedRows (do tipo TBookmarkList, dê uma olhada no help). Também será necessário habilitar na propriedade Options do DBGrid a opção dgMultiSelect, dgAlwaysShowSelection. O fato de habilitar estas propriedades, já propiciará o usuário fazer uma seleção, linha a linha, bastando para isso que o usuário segure a tecla CTRL+<click do mouse> (experimente). Para a leitura das informações das linhas selecionadas, você faz algo similar a isto: // utilizar desta forma (DBGrid1.DataSource), deixa você livre para ligar um TTable ou TQuery ao DBGrid with DBGrid1.DataSource do if DBGrid1.SelectedRows.Count > 0 then for Idx :=0 to DBGrid1.SelectedRows.Count-1 do begin DataSet.GotoBookmark(pointer(DBGrid1.SelectedRows.Items[Idx])); // move os dados da consulta (dataset do dbgrid) aqui variavel := DataSet.FieldByName('nome_campo').Value; ... end; Veja se você consegue avançar Abraços
  17. Carlos Rocha, imagino que você esteja querendo gravar apenas as opções marcadas, não é? Com o procedimento citado, você está na verdade gravando o texto com todas as opções presentes no CheckListBox. Para você gravar o que foi realmente selecionado, você deverá utilizar a propriedade Checked (CLBpgto.Checked[indice]) verificando se a opção (na posição indece) está marcada ou não (true ou false). Você terá que achar um meio de gravar esta informação e montá-la novamente. Lembre que a forma de ler a informação do campo no banco é a oposta a sua gravação. Abraços
  18. Pois, essa foi a solução que arranjei .... mas será que não há outra maneira? obviamente que agora será apenas só para saber mas gostava de saber .... JPedro, eu acredito que esse seja mesmo o caso, já que parece que você vai trabalhar com um banco de origem e outro de destino (supostamente não são fisicamente os mesmos). Com estas informações já dá para tentar fazer uma avaliação melhor. Se tiver novidades aviso. Abraços
  19. Rodrigao, você já testou com outra impressora, utilizando esta versão do programa, o mesmo relatório, ou mesmo a partir de outra máquina - se possível? (só para desencargo de consciência) Já chegou a sair algo impresso? O programa não trava neste caso? Voce teria algum outro relatório que possa testar? (já houve um episódio em que tive que refazer todo o relatório e simplesmente funcinou... Vai entender?! :blink:) Lembrei de mais uma perguntinha :rolleyes: Aparentemente, voce está conseguindo visualizar na tela, certo?! Se sim, caso você setar a propriedade PrintEmpty = False no QuickReport, ao mandar imprimir continua saindo a folha em branco? (Teste)
  20. Micheus

    Tela De Login

    Pirambu!, na criação de qual form está ocorrendo esta mensagem. Talvez seja necessário você destruir o FLOGIN após seu uso, antes de criar os forms com propriedades MDI (é só um palpite :huh: ): ... if FLOGIN.ShowModal = mrOk then begin FLOGIN.Free; Application.CreateForm(TFMENU, FMENU); ... Abraços
  21. deio, talvez tenha a ver com a observação que fiz no meu primeiro post - o datamodule tem que existir (ser criado) antes de você utilizar ele. Verifique a ordem de criação no menu Project->Options->Auto-create forms. Ele tem que ser criado antes das janelas que o utilizam. pegando parte do que já havia postado anteriormente...(...)A seguir, no seu form, após você adicionar o nome da unit do datamodule na cláusula uses(como mencionei anteriormente), bastará que você selecione na propriedade DataSource do seu DBGrid, o datasource proveniente do mesmo (aparecerá na lista o datasource precedido do nome do datamodule).(...) O dataset ligado a este datasource, será o mesmo que você estará aplicando o filtro - essa é a idéia Daí, ao iniciar a busca (na sua outra tela de filtros) e estando você utilizando o mesmo dataset existente no datamodule (aquele ligado ao DBGrid também), a aplicação dos filtros se refletirá sobre o resultado apresentado no DBGrid. Ao fechar o form secundário, o resultado mostrado no DBGrid deve estar de acordo com o pesquisado. Abraços
  22. mcsmarmcs, vou dar umas dicas do StringGrid, o ListView deixo com o Churc porque eu ainda não utilizei ele. :rolleyes: No StringGrid você pode definir o número de linhas e colunas já em design-time: propriedades ColCount e RowCount; Se você vai popular as linhas em run-time, a sugestão é que você defina RowCount com 2 (uma para o "header" e outra para a 1ªlinha de dados). Este mínimo é obrigatório para ter o header, do contrário - definir 1 - você não terá o "header"; O número de colunas, parece-me que você sabe de ante-mão, então, basta defini-la na propriedade ColCount lembrando de somar o número de colunas fixas, caso haja; O "header" da linha e da coluna são definidos pelas propriedades FixedCols e FixedRows, respectivamente. Acredito que você terá apena o "header" das colunas, logo você define FixedRows=1 e FixedCols=0; O texto que será mostrado no "Header" é definido em run-time (no código), basta que você atribua-o à cada coluna na linha 0 (zero). Um StringGrid é, digamos assim, uma matriz de strings que você acessa via propriedade Cells[Col, Row]. Mas você também pode vê-la de outro modo, como uma matriz de TStrings, já que você tem uma lista de linhas e uma lista de colunas do tipo TStrings. Neste caso você acessa elas através da propriedade Rows e Cols. Digamos que você quer acessar/processar todas as linhas da 4ª coluna de seu StringGrid, então você faz um loop varrendo a lista TString daquela coluna, como segue: var IdxRow :Integer; Valor :Double; begin Valor := 0; // o 1º elemento da linha é o header, então começamos de 1 (não de zero) // da mesma forma, a 4ª coluna corresponde ao item 3, já que a lista começa em 0 for IdxRow := 1 to StringGrid1.Cols[3].Count -1 do Valor := Valor + (StrToFloat(StringGrid1.Cols[3].Strings[IdxRow]); ShowMessage('Valor total da 4ªcoluna: ' +FloatToStr(Valor));' end; observe que o for, poderia também ficar assim:... for IdxRow := 1 to StringGrid1.RowCount -1 do Valor := Valor + (StrToFloat(StringGrid1.Cells[3, IdxRow])); (Se não errei nada, é claro. hehehe) A adição ou remoção de linhas do StringGrid, é feita através da propriedade RowCount, basta aumentar ou diminuir. Após adicionar uma linha, você pode incluir os campos de forma bem simples, já que você tem as informações separadas. Por ex. para adicionar os dados da linha 1:StringGrid1.Lines[1].Strings[0] := '01/10/2007'; StringGrid1.Lines[1].Strings[1] := 'Batatinha'; StringGrid1.Lines[1].Strings[2] := '20Kg'; ouStringGrid1.Cells[0, 1] := '01/10/2007'; StringGrid1.Lines[1, 1] := 'Batatinha'; StringGrid1.Lines[2, 1] := '20Kg';fica a seu gosto. A dimensão de cada coluna, você poder fazer em design-time, apenas posicionando o cursor, no header, sobre as divisas e clicando e arrastanto. Em run-time, você deve utilizar a propriedade ColWidths[idx], onde cada posição Idx define a largura da coluna, de maneira similar, você pode modificar a altura das linhas via propriedade RowHeights. Outras propriedades que você pode querer mexer são: ScrollBars e Options (essa em especial, permite que você defina características sobre seleção e edição) O resto é você mexer nas propriedades e observar, a maioria fala por si. Qualquer detalhe, basta selecionar a propriedade e pressionar F1. Abraços
  23. Paleta "Aditional".Voce provavelmente está adicionando as tabulações concatenando o texto a ser incluído no ListBox, é isto?
  24. Rodrigao, essa página em branco, é impressa por último? Só após a última folha com dados ser impressa? Já conferiu o tamanho do papel utilizado na configuração do relatório (design-time) com o definido na impressora? Qual versão do QuickReport você utiliza? A documentação do QuickReport aponta um problema destes com a versão anterior a 2.0K.
  25. deio, é bem simples. Como o Churc disse, você adiciona ele ao seu projeto via menu principal do Delphi. Assim como um form, o datamodule tem uma arquivo de codificação (.pas) e um "container" como se fosse um form, onde você pode colocar certos tipos de componentes (aqueles associados a acesso da banco de dados). Então, após criar o datamodule, você adiciona seus componentes tipo dataset (TTable, TQuery, ...), os DataSources e liga os dataset's a eles. A seguir, no seu form, após você adicionar o nome da unit do datamodule na cláusula uses(como mencionei anteriormente), bastará que você selecione na propriedade DataSource do seu DBGrid, o datasource proveniente do mesmo (aparecerá na lista o datasource precedido do nome do datamodule). Veja se já consegue, continuar a partir daqui. Abraços
×
×
  • Criar Novo...