Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    Funções...

    Só para completar, se bem me lembro, os fontes .pas de .dcu's existentes e não alterados, são recompilados apenas utilizando a opção explicita para tal -> Build All. A opção Build recompila apenas códigos alterados. Em opções do projeto, na guia Link, existe a possibilidade escolher em que formato será gerado o resultado da compilação, se em .DCU (default) ou .OBJ (podendo talvez - nunca testei - ser linkado em outra linguagem de programação que faça uso desta extenção). Na verdade não sei se as versões recentes do Delphi ainda tem esta opção, mas acredito que tenha sido mantida. []s
  2. Se você criar o alias dinamicamente, poderia apenas alterar o parâmetro referente a localização da base de dados e desta forma utilizar o caminho desejado, sem maiores alterações. Isto normalmente é feito através do componente Database. Acho que é isto.
  3. no evento OnTitleClick o parâmetro Column trás esta informação: Column.Title.Caption de qualquer modo, se desejar obter o texto apresentado no título da coluna de um dbgrid, utilize a propriedade DisplayText do TField - não há conversão de TField para string
  4. Micheus

    Campos Dbmemo

    os caracteres estranhos provavelmente são dois: #10 e #13, que não são processados pelo DBGrid.
  5. Micheus

    Rapido Por Favor

    Lembrar que esta última sugestão, só será válida se query tiver a instrução select da 1ª sugestão (só retorna uma linha e com o valor máximo) ou, caso seja um selec que retorne todas as linhas da tabela, se o select utilizar a clausula ORDER BY Nome_Campo, já que o último registro (LAST) deverá ser o maior valor existente.
  6. Micheus

    Minimizar Tudo

    Desculpem me intrometer, verifique se isto serve para vc: function EnumWindowsProc(Handle :HWND; Param :LPARAM): BOOL; stdcall; export; begin if IsWindowVisible(Handle) then if Param = 0 then SendMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0) else SendMessage(Handle, WM_SYSCOMMAND, SC_RESTORE, 0); Result := BOOL(TRUE); end; Chame EnumWindows com 0 (Zero) para minimizar e com outro valor para restaurar as janelas. EnumWindows(@EnumWindowsProc, 0); Usando SendMessage, não haverá problema ao restaurar as janelas
  7. A utilização de templates é uma possível aplicação do que você colocou. você pode criar um cadastro de cliente simples (básico), implementar procedimentos/funções necessárias e após definí-lo como template. Num novo sistema você poderá reutilizá-lo (criar novo form a partir do template) acrescentando mais detalhes (conceito de herança; observe que seu form sempre descende da classe TForm, sendo que neste caso passará a descender da classe armazenada no template). Ao definir novos procedimentos/funções (em POO: métodos) virtuais (virtual) neste template, quando houver a necessidade de reescrever (override) algum deles na nova classe você estará implementando o polimorfismo (outra característica da POO). Como o s3c disse, no delphi você já programa naturalmente em OO. Criar novas classes utilizando todo o conceito de POO, do zero, só em casos muito específicos e que só você poderá determinar quando lhe será mais apropriado. O caso mais comum de implementação em POO, no delphi, em que você não terá o "automatismo" da IDE criando os eventos para vc, ocorre na criação de componentes. Quando descendendo dos existentes, a IDE até ajuda na criação (definição) do novo objeto, mas toda codifição deverá ser feita na mão.
  8. Mr Wiklich, provavelmente você já pesquisou na web e viu que não é realmente um tópico fácil de encontrar resposta. Há alguns anos, trabalhei numa empresa onde cheguei a implementar um módulo do programa que direcionava chamadas telefônicas para um ramal desocupado, inclusive dando mensagens ao interlocutor (um pequeno módulo num sistema de tele-marketing). Também não havia encontrado material, mas pesquisando o help, guia de referência(microsoft) e utilizando componentes TPAPro, com uns testes aqui outros ali, consegui fazer a coisa funcionar relativamente bem (havia algumas limitações de hardware). É importante verificar suas necessidades e recursos de hardware também. Dependendo da aplicação que você quer dar ao seu programa, pode ser importante verificar o tipo de placa de telefonia que irá utilizar e que funções da TAPI ela suporta. TurboPower Async Professional http://sourceforge.net/projects/tpapro Playing and Recording Sounds during Telephony Calls - http://www.geocities.com/macrotech_tr/net/tapi10.html (parte 1) - http://www.geocities.com/macrotech_tr/net/tapi11.html (parte 2) - http://www.geocities.com/macrotech_tr/net/tapi12.html (parte 3) - http://www.geocities.com/macrotech_tr/net/tapi13.html (parte 4) Vários exemplos (talvez você encontre algo parecido com o que deseja criar) - http://www.kobira.co.jp/sakura/d_net_RasAPI.htm Referência - Microsoft - http://msdn.microsoft.com/library/default....2_reference.asp Espero ter lhe ajudado.
  9. Acredito que será possível apenas se você trabalhar com a propriedade Lines, onde você varre linha por linha e, encrontrando a desejada, pode excluí-la utilizando o método Delete(Index) desta propriedade. algo assim: procedure .... var Idx :Integer; begin ... Idx := 0; with Memo1 do while Idx < Lines.Count do begin if Pos(StringALocalizar, Lines[Idx]) > 0 then Lines.Delete(Idx) else Inc(Idx); end; ... end;
  10. veja se isto lhe atende: procedure OpenDataSet(Form :TForm); var Idx :Integer; begin for Idx := 0 to Form.ComponentCount -1 do if Form.Components[Idx] is TDataSource then try (Form.Components[Idx] as TDataSource).DataSet.Open; except end; end; Este procedimento varrerá o form passado como parâmetro e, ao encontrar cada DataSource, abrirá o respectivo DataSet(que, dentre os vários possíveis, será um ClientDataSet no seu caso).
  11. Micheus

    Delphi/sql

    olhando o código postado ADOQUERY1.SQL.Add('SELECT * FROM INSUMOS.COD_INSUMO ='+QuotedStr(Edit2.text)); parece-me que está faltando algo. Não seria: ADOQUERY1.SQL.Add('SELECT * FROM INSUMOS WHERE INSUMOS.COD_INSUMO ='+QuotedStr(Edit2.text));
  12. Observe que quando você utiliza um teste do tipo x = y implica no fato de que esta avaliação deva ter um resultado verdadeiro ou falso. Sendo assim, na situação apresentada, nada mais lógico do que atribuir o "teste" (o qual resultará em verdadeiro ou falso) diretamente a variável booleana. Ficou mais claro?
  13. Já que falou em sugestão... Eu costumo utilizar a seguinte sintax para a linha abaixo: IF (qitens_pedido.State=dsEdit) OR (qitens_pedido.State=dsINSERT) THEN IF qitens_pedido.State in [dsEdit, dsInsert] THEN Observei também que o fragmento de seu código, abaixo, repete-se várias vezes, variando apenas dois parâmetros (índices). if qgrade.FieldByName('n1').AsString= '0' then begin dbgitens.Fields [1].ReadOnly:= true; dbgitens.Fields[1].Text:=''; end else begin dbgitens.Fields[1].ReadOnly:= false; dbgitens.Fields[1].Text:=''; end; Nesta situação eu costumo fazer da seguinte maneira: procedure Tfrm_pedido.dbgItensColExit(Sender: TObject); var verifVazio: string; procedure AjustaReadOnlyItem(IdxGrade: string; IdxItens: Integer); begin // Text fica vazio em ambos os casos, logo fica fora do if dbgitens.Fields[IdxItens].Text:=''; // a comparação já resulta em um valor booleano, logo, basta atribuir à propriedade dbgitens.Fields[IdxItens].ReadOnly:= qgrade.FieldByName(IdxGrade).AsString = '0'; end; begin ... if dbcCondicao.Text = '60 DIAS' THEN begin dbgitens.Fields[19].Text:=qproduto.fieldbyname('prc60').Value; preco_unitario:=qproduto.fieldbyname('prc60').Value; showmessage('60'); end; //habilitando grade AjustaReadOnlyItem('n1', 1); AjustaReadOnlyItem('n2', 2); AjustaReadOnlyItem('n3', 3); ... AjustaReadOnlyItem('ngg', 18); ... end; Ok?!
  14. dê uma olhada nesta discursão: http://www.delphipages.com/threads/thread....D=74221&G=74219 há diversas alternativas e apesar de não suprir a necessidade do indivíduo que postou a pergunta, parece-me que atenderá a sua.
  15. Micheus

    Ajuda Por Favor

    bom, supondo que você realmente utilize os campos de A a J, eu daria estes nomes aos componentes dos campos em questão (p.e. um edit teria o nome CampoA, um segundo CampoB e assim por diante). Para viabilizar minha proposta, associado a cada produto, haveria um campo chamado (p.e.) CAMPOS_DO_CALCULO(VARCHAR 10) onde estariam indicados os campos que fazem parte do cálculo desejado. Por exemplo, o produto Goiabada teria seu respectivo campo CAMPOS_DO_CALCULO preenchido com 'ABDJ' enquanto que o Marmelada seria 'CDFHI'. Deste modo, para cada evento OnChange do ComboBox, seria obtido do produto selecionado o respectivo campo CAMPOS_DO_CALCULO e de posse deste faria o seguinte: procedure Form1.ComboBox1OnChange(...); var Letra :Byte; Control :TControl; begin ... // obtém o campo CAMPOS_DO_CALCULO aqui ... for Letra := Ord('A') to Ord('J') do begin Control := Form1.FindComponent('Campo'+Char(Letra)) as TControl; if Assigned(Control) then Control.Enabled := Pos(Char(Letra), CAMPOS_DO_CALCULO) > 0; end; end; isto funciona, veja se lhe serve.
  16. desclupe-me, no post anterior onde aparece leia-se componente_SQL.ParamByName('DATA_INICIAL).AsDate = primeiro_dia_mes; componente_SQL.ParamByName('DATA_FINAL').AsDate = ultimo_dia_mes;
  17. Além das opções já mencionadas, se você utilizasse em sua tabela um campo datetime, date ou timestamp, poderia utilizar funções do banco MySQL como MONTH(campo_data), YEAR(campo_data) e neste caso, para filtrar o mês atual poderia utilizar: SELECT ... WHERE (MONTH(campo_data) = MONTH(NOW())) AND (YEAR(campo_data) = YEAR(NOW())) ou parametrizando: SELECT ... WHERE (MONTH(campo_data) = :MES_ATUAL) AND (YEAR(campo_data) = :ANO_ATUAL) ... componente_SQL.ParamByName('MES_ATUAL').AsInteger = MonthOf(Date); componente_SQL.ParamByName('ANO_ATUAL').AsInteger = YearOf(Date); ou ainda SELECT ... WHERE campo_data BETWEEN :DATA_INICIAL AND :DATA_FINAL ... componente_SQL.ParamByName('DATA_INICIAL).AsInteger = primeiro_dia_mes; componente_SQL.ParamByName('DATA_FINAL').AsInteger = ultimo_dia_mes; para conferir outras funções relacionadas a data e hora, dê uma olhada neste link: http://dev.mysql.com/doc/refman/5.0/en/dat...-functions.html observe também que neste link tem a descrição da função DATE_FORMAT que lhe ajudará a formatar o campo data da maneira que quizer.
  18. fiz alguns testes até verificar que você não adicionou a cláusula override ao método Create. ... constructor Create(AOwner: TComponent); override; destructor Destroy; override; ... destructor TQueryExc.Destroy; begin sTitulos.Free; inherited; end; ... Dicas: 1) preferencialmente, ao atualizar uma propriedade dento do código do objeto, utilize a variável e não a propriedade publicada. Ex. no método SetQueryExc, utilize sTitulos ao invés de Titulos; 2) não esqueça de "destruir" todo objeto que você possa ter criado para seu componente;
  19. Micheus

    Relatório

    Com relação ao uso de datas nas query's, uma boa opção é utilizar parâmetros e não a concatenação da data na query no formato de texto: 1) concatenado no texto da query ... Query1.SQL.add('where DAT_VENDA between '''+Edit1.Text+''' and '''+Edit2.Text+''''); ... Query1.Open; 2) passado como parâmetro ... Query1.SQL.add('where DAT_VENDA between :DAT_INCIAL and :DAT_FINAL'); ... Query1.ParamByName('DAT_INCIAL').AsDate := StrToDate(Edit1.Text); Query1.ParamByName('DAT_FINAL').AsDate := StrToDate(Edit2.Text); Query1.Open; corrijam-me se estiver errado.
  20. Micheus

    Mdo Transação

    Se entendi corretamente, você quer que uma aplicação enchergue o que foi incluído na outra, sem ter que reiniciar o programa. Certo?? No momento estou longe de meus fontes, mas se me lembro bem , dê um duplo clique no seu component TMDOTransaction para configurar o tipo de transação que provavelmente está como Snapshot (ou algo similar, pois nesta situação você estará enxergando apenas uma "foto" do banco antes do momento da abertura do mesmo, por isso um não enxerga as alterações do outro) e configure para a opção Readcommited. Eu estou utilizando os seguintes parâmetros em uma transação: read write read_committed rec_version nowait e a única coisa necessária para atualizar os dados no programa é um refresh (caso esteja utilizando um TMDOQuery para suas consultas, então deve fechar e abrir a query para atualizá-la). Espero ter ajudado. qualquer duvida dá um toque.
  21. acho que esta pergunta já foi respondida anteriormente, e a sugestão é a de inicializar o campo da tabela no evendo OnNewRecord, atribuindo o valor Ativo. []s
  22. Se o que você está querendo fazer é ler sua lista de string e popular o cabeçalho do TStringGrid com seu conteúdo talvez esta possa ser uma sugestão: // redimensiona as colunas do grid StringGrid1.ColCount := ComboBox1.Items.Count; // a linha zero é o header - atribui cada item da lista a uma coluna do grid StringGrid1.Rows[0].AddStrings(ComboBox1.Items); []s
  23. Micheus

    Variáveis

    Acho que não vai dar, já que messagebox é uma função(não um objeto ou algo assim). Ao que parece a mensagem será sempre a mesma, com mesmo texto, botões - certo?! Neste caso seria conveniente você criar uma função que apresente seu messagebox, escolha uma unit para colocar seu código, definindo na cláusula Interface o cabeçalho da função, e então, adicione esta unit onde for utilizar a mensagem e chame a função onde necessitar. []s
×
×
  • Criar Novo...