
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Dê uma olhada neste programa: Window Sizer (com fontes - necessita se registrar no site).Alem de redimensionar a janela ele faz o que você quer: obtém o título dela - verifique em windowsizerdlg.cpp o evento CWindowSizerDlg::OnHotKey. Abraços
-
perguntinha básica: qual é esse erro que sempre ocorre. você está utilizando o ZStoredProc, certo?!
-
Pirambú!, se enveredar por estas bandas, este componente (free) pode ser útil - TSimpleGraph (download do componente e demo estão no final da página) Abraços
-
beleza, parabéns :D dá uma olhada nesta linha: 'AND between :datai and :dataf '+ você não está sentindo falta de nada não? :unsure: AND ??? between :datai and :dataf Percebeu?! o que é mesmo que tem que estar entre datai e dataf? Não seria DATA_EMISSAO? ;) manda logo esta encrenca... :D Abraços
-
Qual o banco de dados utilizado? Utilizando ADOQuery é pouco provável que esteja trabalhando com Paradox. Apenas salientando que, no exemplo do Jonas, CADASTRO e COMPLEMENTO são alias definidos via BDE Administrator ou SQL Explorer - os quais dizemos bancos de dados, já que referem-se (apontam) a eles (corrijam-me se eu estiver errado). Pela terminação .DB no nome das tabelas, o exemplo parece referir-se a Paradox. Eu tenho a impressão que para o seu caso esta opção pode não ser aplicável, porque esta interpretação dos ":" como exemplificada eu só ví em uso com componentes da paleta BDE. (aqui, eu posso estar errado) Se, por exemplo, o banco fosse MySQL e o componente ADOQuery com a conexão setada para um DSN (ODBC) chamado DSN_BASE (referenciando um database de nome BASE) com esta sintaxe: ao tentar abrir a consulta, você receberia uma mensagem "reclamando" da não definição dos parâmetros e você acessando a propriedade Parameters veria na lista base:usuario e fone:usuario. para que este exemplo funcionasse, a consulta teria que ficar sem o ":", como segue: No caso do Firebird (não sei se a versão 2 já permite), ele não dá suporte a consulta com tabelas de múltiplos bancos: > Firebird não suporta consultas a múltiplas tabelas que se estendam por > múltiplos bancos de dados (Firebird book, página 431) conforme eu havia lido isto neste post (2º => July 06, 2005 9:45 PM), na época em que estava aprendendo sobre ele. Estes comentários são apenas para chamar a atenção, mais uma vez, para a importância de ser informado qual o banco de dados utilizado e componentes de acesso. Abraços
-
Jonas, estou achando que este campo Ord não existe na tabela do robinhocne. Está parecendo a mesma situação o colega vms questionou em junho. robinhocne, se realmente este campo Ord não existe na sua tabela, então dê uma olhada neste post. A idéia a de utilizar um campo calculado (neste caso você criaria um chamado Ord, por exemplo) e atribuiria a ele o valor de RecNo. Abraços
-
vms, apenas a título de observação, a tecla Padrão, no Windows, responsável pela execução do evento OnClick é a Barra de ESPAÇOS. (Isto também é válido para os CheckBox) No Windows, a tecla ENTER pode ser o padrão para execução do evento OnClick, apenas de um botão que tenha sua propriedade Default=True. Isto ocorre normalmente nas caixas de diálogos onde aparecem OK e Cancel em que o botão OK fica destacado e ao teclar ENTER o mesmo é acionado. De modo similar, quando um botão tem sua propriedade Cancel=True, pressionar a tecla ESC resulta na execução do seu evento OnClick, o que também ocorre em caixas de diálogos como citado. Alterar estes procedimentos (padrão), pode ter efeitos como os que se pode ter ao trocar o TAB pelo ENTER para mover-se entre os campos. Particularmente sou avesso a este tipo de alteração, visto que a padronização (oferecida pelo ambiente Windows) viabiliza a utilização de seus recursos em qualquer aplicativo. Assim, se o usuário sabe "navegar" por uma aplicação, saberá por todas. Abraços
-
[resolvido] Salvar Atalho Num Banco E Abrir O Arquivo Correspondente A
uma questão respondeu Micheus em Delphi, Kylix
Caso o usuário possa acionar os SpeedButtons em questão, acho que seria conveniente verificar se a tabela está ou não no modo Edição/Inserção, já que a atribuição de um valor ao campo resultará em erro caso a mesma não esteja nestas situações. Assumi que o nome da tabela em questão é Tartigo, já que em uma procedure você colocou Tartigo e em outra Tbio. procedure TPCadsArtigos.SpeedButton1Click(Sender: TObject); begin // *** Observe que o nome do campo deveria ser TartigosAtalho // (sempre que adicionado em design-time, será nome_dataset+nome_campo) if OpenDialog1.Execute then begin // *** verificando estado atual da tabela if not (DataModule1.Tartigos.State in [dsInsert, dsEdit]) then DataModule1.Tartigos.Edit; DataModule1.TartigosAtalho.AsString := OpenDialog1.filename; end; end; procedure TPcadsArtigos2.SpeedButton2Click(Sender: TObject); var ProgLink :string; begin // *** Observe que o nome do campo deveria ser TartigosAtalho // (sempre que adicionado em design-time, será nome_dataset+nome_campo) if not DataModule1.TartigosAtalho.AsString <> '' then begin ProgLink := DataModule1.TartigosAtalho.AsString; WinExec(PChar(ProgLink), SW_SHOWNORMAL); end else ShowMessage('Atalho não foi definido'); end; -
acborba, é relevante você mencionar o banco de dados que utiliza, porque se for Paradox ele não suporta criação de chave primária via instrução SQL (ALTER TABLE). A chave primária normalmente é definida na criação da tabela, mas sua criação posterior para a maioria dos bancos de dados pode ser com a instrução SQL: ALTER TABLE <nome tabela> ADD PRIMARY KEY (<nome do campo ou campos separados por ",">); índices secundários: ALTER TABLE <nome tabela> ADD INDEX (<nome do campo ou campos separados por ",">); Jonas, aquele link leva para "COMO FAZER CONSULTAS SQL", então coloquei aqui o que ele questionou - Chaves Primárias Abraços
-
O que não está dando certo? O que está ocorrendo?Voce deve ser objetivo em suas dúvidas - coloque os efeitos para que possamos mais facilmente identificar as causas ;) Eder, a variável TOTAL é do tipo REAL - não vai receber STRING de jeito algum...para a variável, a soma pode ser mantida: total := cota + juros + multa + extra; mas para visualização do resultado, teria que ser acrescentada a linha abaixo para que o Edit ref. a total a receba o total: total.Edit := FloatToStr(cota + juros + multa + extra); talvez fosse esta situação que você estava querendo citar. Abraços p.s. ao postar vi que o colega rvmprogramador já havia citado a correção, mas ficam as "advertências" aqui
-
[resolvido] Salvar Atalho Num Banco E Abrir O Arquivo Correspondente A
uma questão respondeu Micheus em Delphi, Kylix
Inicialmente, queria dizer que removi este seu ultimo post (igual ao que estou respondendo aqui) lá do tópico Abri Um Arquivo Pdf, porque já estamos tratando do assunto aqui. Voce não deve repetir tópicos/post. continuando... para inclusão de um novo item (linha ou registro) na sua tabela de atalhos você tem que: 1) estar com a tabela aberta (chamar o método Open ou utilizar a propriedade Active=True); 2) o novo registro é obtido através dos métodos Insert ou Append; a abertura/fechamento da tabela não precisa ocorrer "o tempo todo", vai depender de como você estruturar suas telas. então, supondo a tabela aberta num momento inicial: DataModule1.Tbio.Active:= true; supondo que você utilize um botão para incluir um novo registro, no OnClick do mesmo você colocaria: DataModule1.Tbio.Append; supondo que você utilize um botão para alteração de um registro já gravado, no OnClick do mesmo você colocaria: supondo que você utilize um botão para incluir um novo registro, no OnClick do mesmo você colocaria: DataModule1.Tbio.Edit; supondo que você utilize um botão para acionar a caixa de seleção do arquivo, no OnClick do mesmo você colocaria: ... if OpenDialog1.Execute then begin DataModule1.TbioLINK.AsString := OpenDialog1.Filename; end; se você tiver algum botão para gravar as informações, lá você colocará: DataModule1.Tbio.Post; se não tiver, deverá achar um momento em que irá gravar os dados Faltariam-me mais informações para dar mais esclarecimentos Negativo! Nos exemplos o nome dos arquivos estão fixos - é meramente ilustrativo. (...), mas o que eu quero é o seguinte WinExec(PChar('Variável'), SW_SHOWNORMAL); apenas ajustando os termos, senão vamos ter problema de comunicação: você vai salvar (gravar) no banco de dados. Ao DBEdit1.text você atribui um valor, que postiriormente, quando chamar o método Post do dataset (table ou query), será tranferido para o banco. Bom, para executar um atalho salvo, você terá que localizar o tal registro no banco e uma vez localizado você terá o conteúdo do atalho no respectivo campo. Vou exemplificar supondo que o nome do campo em que foi armazenado o atalho seja LINK:var ProgLink :string; begin if not DataModule1.TbioLINK.AsString <> '' then begin ProgLink := DataModule1.TbioLINK.AsString; WinExec(PChar(ProgLink), SW_SHOWNORMAL); end else ShowMessage('Atalho não foi definido'); end; Veja se você avança um pouco mais. Abraços -
é basicamente a mesma coisa sim. Mas este recurso de vídeo-aula ficou show heim. Se a moda pega... :D
-
se você definiu os relacionamentos no seu banco (MSAccess) via opção do menu Ferramentas->Relacionamentos e ao configurar os relacionamentos e marcou a caixa "Impor integridade referencial" (e algumas de suas opções), então, ao tentar excluir uma cidade em uso, uma exceção deveria ocorrer em seu programa. Parece então, que você está fazendo o "controle" da integridade referencial na mão (no código). Deste modo, para evitar o foi questionado, antes de excluir a cidade, simplesmente faça uma consulta na tabela alunos para verificar se a cidade está ou não em uso. use uma query como: se o resultado (QtdCidade) for maior que 0, então ela está em uso e não pode ser excluída. captou?!
-
Acho que neste caso você apenas precisa definí-la. Assim, seria mais um dúvida associada a configuração do SO do que de programação.Mas, vamos lá: - na área de trabalho, localize o ícone Meu Computador, clique com o botão direito do mouse e selecione Propriedades; - na tela de propriedades do sistema, acesse a guia Avançado; - na parte inferior da guia, deve haver um botão com o caption Variáveis de ambiente, click nele; - bom, agora você tem duas opções: definir a variável para o usuário (group "Variáveis de usuário para ...") atual ou para todos (group "Variáveis do sistema"). (para esta última, você terá que ter direitos de administrador) Quanto a este comentário: se você observar seu código, a variável de ambiente chama-se Variavel_Ambiente_JOB, e pelo que é feito com o valor obtido dela, na verdade ela contém apenas o nome de um arquivo (texto) de configuração, onde nele se encontram as informações citadas:- Esta linha lê em temp o conteúdo da variável Variavel_Ambiente_JOB: temp := GetEnvironmentVariable('Variavel_Ambiente_JOB'); - Sendo arqConfig do tipo TStringList, esta linha faz a leitura de um arquivo cujo nome está em temp arqConfig.LoadFromFile(temp); Então seu problema, seria definir a variável de ambiente no servidor de teste para que você consiga prosseguir com o desenvolvimento, e descobrir qual e onde está o arquivo apontado pela variável de ambiente no servidor "titular", já que você precisará dela também (eu imagino) Abraços
-
é, faz um tempinho, e já tem um upgrade:function TFRCadRim.GetNewFieldCod(TableName, FieldName :string; WhereOption :string = '') :LongInt; begin DMdados.SQLDataSetMax.CommandType := ctQuery; DMdados.SQLDataSetMax.CommandText := 'SELECT (MAX('+FieldName+')) AS '+FieldName+' FROM '+TableName; if WhereOption <> '' then DMdados.SQLDataSetMax.CommandText := DMdados.SQLDataSetMax.CommandText +' WHERE ' +WhereOption; DMdados.SQLDataSetMax.Open; Result := DMdados.SQLDataSetMax.FieldByName(FieldName).AsInteger +1; DMdados.SQLDataSetMax.Close; end; e já adaptei aqui para o seu código. Daí para obter o MAX de ID, chame ela assim: GetNewFieldCod('CadRIM', 'ID'); para o MAX de Contr_RIM, chame ela assim: GetNewFieldCod('CadRIM', 'ID', Format('extract(year from data) = %d', [YearOf(Date)])); - a função YearOf está declarada na unit DateUtils; (Delphi 7) - a função Format está declarada na unit SysUtils; Veja se agora vai...
-
juniorboll, quem é form1 e quem é form2.Inicialmente parecia que o form2 seria o seu form principal. Agora, já não parece. :huh: O que você realmente quer: a- Mostrar o seu form principal, e antes que alguma coisa possa ser feita nele, seja apresentada a tela de login; b- Mostrar a tela de login, e após validada, fechá-la e mostrar o form principal; (opção que postei) Churc, acho que suas pastas no 4share não foram acessadas nos 30 dias requeridos... (os arquivos foram removidos)
-
a solução mais complicada... O exemplo é um projeto com apenas duas telas (Login e Principal). O código fonte do projeto (em que os forms estão criados em design-time) está assim (para ver o código do projeto, menu View->Project Source): program Project1; uses Forms, Unit1 in 'Unit1.pas' {Login}, Unit2 in 'Unit2.pas' {Principal}; {$R *.RES} begin Application.Initialize; Application.CreateForm(TLogin, Login); Application.CreateForm(TPrincipal, Principal); Application.Run; end. e deve ser alterado para: program Project1; uses Forms, controls, // *** para usar a constante mrOK Unit1 in 'Unit1.pas' {Login}, Unit2 in 'Unit2.pas' {Principal}; {$R *.RES} var StartMainForm :Boolean; // *** para viabilizar a validação begin Application.Initialize; // *** criaremos a tela login sem Owner (nil) - isto evita que ela // seja assumida como o MainForm da aplicação (Application) Login := TLogin.Create(nil); try // *** se o login for válido, o retorno será mrOk e StartMainForm se tornará TRUE StartMainForm := Login.ShowModal = mrOk; finally Login.Release; // *** após utilizada, a tela de login é eliminada da memória end; if StartMainForm then // *** se a senha era válida inicia a aplicação normalmente begin Application.CreateForm(TPrincipal, Principal); Application.Run; end else // *** do contrário, terminamos a aplicação Application.Terminate; end. Só falta agora, ajustar a tela de login para retornar mrOk para a senha válida. Eu utilizo este form com a propriedade BorderStyle = bsDialog, e com dois botões: - um de confirmação, com a propriedade ModalResult = mrNone (com isto, nada acontece ao pressionarmos ele. Teremos que escrever o evento OnClick); - outro de cancelamento, com a propriedade ModalResult = mrCancel (com isto, ao ser pressionado, a janela será fechada sem que seja necessário colocar qualquer código no evento OnClick dele - como Close, p.ex.); no evento OnClick do botão de confirmação temos o seguinte código:procedure TLogin.Button1Click(Sender: TObject); begin if MaskEdit1.Text = 'senha' then ModalResult := mrOk else ShowMessage('A senha digitada não confere!'); end; É complicado apenas explicando, na prática é bem simples. Abraços
-
alguma possibilidade de você estar utilizando um tipo de fonte neste label que não tenha este caracter ou que esteja em outra posição da tabela (outro código)?
-
robosa, esta pergunta já está sendo respondida neste outro tópico: Caixa De Confirmação De Exclusão, Você deseja apagar esse cadastro? S ou N. - por fa, aproveite-e e tire dúvidas ref. ao assunto lá - estou fechando este tópico. Abraços
-
É isso ai Micheus o ID sequencialmente e o Contr_RIM a cada ano a contagem reinicia e vai adicionando mais 1. Tem como ?? Estou usando o BD MySql com DBexpress e ClientDataset estou meio apressado, indo embora, então deixo só as consultas SQL. É só colocar nos devidos componentes para executar: Esta é direta, é só dá um open e pegar o resultado +1 Nesta é necessário passar como parâmetro o Ano Acho que você consegue montar o resto. Abraços
-
é, esta dica também tinha achado, mas como em um dos foruns um cara perguntou: se eu estiver compilando o programa com os pacotes em runtime não é traduzido. como proceder? (ref Planeta Delphi) e ficou sem resposta, achei melhor não postar. ;) Talvez, seja necessário fazer o mesmo procedimento sugerido pelo colega que cite: matar as respectivas .DCU e dar um rebuild no projeto.
-
Estas funções fazem uso de recurso do SO, logo, se o seu Windows é em Inglês, estes textos aparecerão neste idioma. Para a versão 2006 tem uma dica do colega Titanius no DevMedia - Tradução das mensagens do Delphi 2006 Eu sei que existe um procedimento similar para as versões anteriores do Delphi, mas não tenho conhecimento de algum link. Abraços
-
para este caso, uma boa opção seria utilizar o evento OnValidate do Field (você seleciona o campo na lista de campos do dataset e no Object Inspector vai até a lista e eventos). Assim, uma mesma procedure poderá ser utilizada para todos os outros fields que sejam requeridos. O código poderia fica assim: procedure TForm1.Table1DescricaoValidate(Sender: TField); begin if Sender.Required and (Sender.AsString = '') then Raise EDatabaseError.CreateFmt('O campo "%s" é obrigatório.', [Sender.DisplayName]); end; Observe que testamos se o campo é requerido e se algum texto foi digitado (usando o método de "conversão" AsString - tanto '' quanto null serão avaliados), sendo que satisfeita a condição, geramos uma exceção de banco de dados formatando adequadamente a mensagem. Eu utilizei a propriedade DisplayName, mas você poderia utilizar FieldName, sem problemas. Abraços
-
tux_boy, uma alternativa, enquanto não aparecer outra seria: begin ... try TabelaTal.Post; except on E:EDatabaseError do begin if Pos('KEY VIOLATION', UpperCase(E.Message)) > 0 then E.Message := 'Esta informação já está cadastrada!'; raise; end; end; end;este é um método. O que fazemos é: - interceptar uma exceção através do bloco try..except..end; - no caso de uma exceção no banco de dados (EDatabaseError), verificamos a mensagem. Se for a procurada, trocamos o texto da mensagem; - na seqüência, forçamos a continuação da exceção pela chamada de Raise. Se ele não estivesse presente, nenhuma mensagem de erro seria apresentada. Abraços
-
VDLR, parece-me que você quer que ID seja incrementado sequencialmente (sempre pelo MAX+1) para todos os registros da sua tabela. Já para Contr_RIM, parece-me que você deseja incrementá-lo sequencialmente (sempre pelo MAX+1), mas apenas para os registros dentro de um determinado ano, ou seja, a cada ano a contagem reinicia. Certo?! VDLR, pelos seus questionamentos dá para perceber que você não está utilizando Interbase ou Firebird.Como sempre insisto em mencionar, em dúvidas com BD, é conveniente mencionar: Banco de dados e componente utilizados!!! Pelo exemplo, o Jonas tentou exemplificar o tal gerador, utilizando um banco Interbase ou Firebird (já que usa rdb$DATABASE) e componentes da paleta DataAcces (DatasetProvider +ClientDataset, pelo que sugere qryUso.DataSet.CommandText) Abraços