
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Se você partir do princípio de que a tabela ASCII contém o alfabeto, números e mais um símbolos - acho que você não precisa criar nada. Dê uma olhada neste link: Código ASCII (acho que vai lhe explicar mais do que eu) Abraços
-
Não estou 100% certo, mas dentro do loop em que você faz o scan (lá na sua thread) você tente colocar a linha: Application.ProcessMessages; Este comando dá oportunidade à sua aplicação de processar os eventos, como por ex. o click do mouse, teclado...
-
Voce tem certeza que não está utilizando ela em algum outro dataset que possa estar aberto enquanto você tenta limpá-la?Voce consegue observar se a mensagem ocorre quando você tenta setar a propriedade Exclusive=True ou com o comando EmptyTable? (normalmente após o erro, a execução do programa é desviada para a linha do código aonde ele ocorreu)
-
Lívio, acho que aqui não seria a seção mais adequada para a questão, mas vamos o ver o que se consegue. Conforme o andamento, eu movo para outra seção. ;) Pela mensagem e dados que você postou, não ficou realmente faltando você informar a senha (password) para conectar ao banco?
-
Calcular horas entre duas datas e horas
pergunta respondeu ao ODAIR MAYER de Micheus em Delphi, Kylix
Odair, como é que você tem esta data e hora? Você tem elas em TEdit's ou em um dataset? A princípio, tendo estas informações em uma variável do tipo TDateTime, basta que você subtraia uma da outra para ter um resultado do mesmo tipo. Daí, para seu caso, que é diferença de horas e que vejo será superior a 24:00 sugiro utilizar uma função que postei aqui no forum. Dê uma olhada neste post para entender um pouco mais sobre o TDateTime e achar o link para a função. Abraços -
(Resolvido) Ultimo campo do ClientDataSet
pergunta respondeu ao Anderson Scinfo de Micheus em Delphi, Kylix
Talvez você possa utilizar a propriedade RecordNo para saber se é = as RecordCount (50 no seu caso). Mas, há algum motivo especial para realizar este procedimento? É que este procedimento é basicamente o que o próprio DBGrid usa para obter os dados do dataset e mostrá-los no seu grid. Assim, você estaria fazendo um retrabalho. Abraços -
Não se expressou mal não. Apenas o post meio que cobrava que alguém devesse o ter respondido, o que pode ser considerado um UP (eu considero) e que pelas normas do forum são proibidos. ;) Não tem nada de sarcástico não. Se você tivesse lido todos os meus outros mil e tantos posts, talvez você visse que não é o tipo de coisa que eu faça (exceto quando eu tenho que repetir a mesma coisa muitas vezes em um mesmo tópico - aí, as vezes, eu não em aguento ;)). Pelo menos não é minha intenção (talvez eu tenha me expressado mal).É uma pergunta direta mesmo, não tenho a mínima idéia do quanto você conhece, então, como passei apenas algumas diretrizes e não um código exemplo, resolvi lhe perguntar. Esta semana é uma semana bem parada, e a pressupor sua pressa em uma resposta, pareceu-me mais conveniente o questionamento. Abraços
-
qual erro?Eu peguei esse seu código e rodei no meu TC, com a lateração que mencionei e de: 01110111 ele passa a 11101110 Não deveria ser este o resultado se usar o vetor de permuta para {8,2,3,5,4,6,7,1}?
-
(Resolvido) Problema ao mostrar valores monetários em edits...
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
Oh my god! :o Vou ter que parodiar o nosso colega Jhonas... Traduzindo a mensagem de erro: Tipos incompatíveis: string e extended (texto e número, para simplificar mais ainda) você não tem que adicionar um string no seu TStringList Vvlr? Para quê que você vai mudar justo esta linha? Esta você não tinha que mexer nada nela!!! <_< Deveria continuar exatamente como estava: um texto numérico, com a vírgula que você substituia por um ponto utilizando a função StrReplace! Era o que já tínhamos corrigido nos outros post's. Abraços -
Acredito que não.Ou você cria uma procedure no banco para executar o processo no servidor ou você cria um procedimento no seu programa para fazer isto. Você fala em renumerar. Isto parece significar que já existe algum tipo de numeração. Se estes números dizem respeito a campos chave, os quais podem estar servindo de referência em outras tabelas, você poderá ter problemas de integridade referencial - esteja atento. Abraços
-
ela está fazendo o que você esta pedindo.você já fez o teste de mesa com os valores que inicializou? Faça e você verá que está certo. for(i=0;i<8;i++) setbit(&result,(i+1),getbit(aux,p[i])); veja que, para i=0, você chama setbit passando o valor a ser comutado do bit i+1 que é 1 e com o valor bit em p que é 1. A menos que eu tenha entendido errado, e pela seqüência que você declarou no seu array p, você está comutando cada bit com ele mesmo, logo nada muda. Experimente modificar seu vetor de permuta para {8,2,3,5,4,6,7,1} Abraços
-
Marcos, tem como melhorar sim. Mas algumas informações são importantes: - Voce precisa mostrar o ano inteiro ou apenas um mês selecionado; - você deve obter a informação sobre o professor e sua escala de aulas em alguma tabela. Que informações pertinentes você tem; Abraços
-
Acho que a forma mais segura seria verificar na chave de registro HKEY_CLASSES_ROOT, isto porque, pelo que vi no meu arquivo de registro, onde houveram várias atualizações de versões do FireFox, pode não ser tão direta a verificação. Por exemplo, as informações do FireFox ficam na chave de registro HKEY_LOCAL_MACHINE. Veja o que eu tenho aqui: HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\2.0.0.10 (pt-BR)\Main Install Directory = C:\Arquivos de programas\Mozilla Firefox PathToExe = C:\Arquivos de programas\Mozilla Firefox\firefox.exe HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox 2.0.0.10\bin PathToExe = C:\Arquivos de programas\Mozilla Firefox\firefox.exe Logo, não há garantias de fazer um procedimento padrão. Mas utilizando a chave das classes sim. Bom, neste chave você encontrará duas entradas cujas linhas de comandos são exatamente as mesmas: HKEY_CLASSES_ROOT\FirefoxHTML\shell\open\command (padrão) = C:\ARQUIV~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1" HKEY_CLASSES_ROOT\FirefoxURL\shell\open\command (padrão) = C:\ARQUIV~1\MOZILL~1\FIREFOX.EXE -requestPending -osint -url "%1" Verificar a existência desta chave (classe TRegFile usando OpenKey), já é um indício da existência do FireFox instalado, mas não garante nada caso tenha sido feita uma desinstalação incorreta. Neste caso, cabe ainda conferir a existência do programa (uso da função FileExists). Uma vez que exista, então o negócio é ler esta string de comando e substituir o %1 (que é o parâmetro) pela sua URL e executar esta linha de comando via WinExec, por exemplo. Você consegue montar o código, ou precisa de ajuda nisto também? Abraços
-
Fiz uma alteração no código: select * from "clientes.db" where nomcli = 'jose' Fiz um teste usando a palavra josé para ver se dava certo, deste jeito deu certo, daí eu inseri o que realmente me interessa: select * from "clientes.db" where nomcli = 'ednome.text' (ednome.text está em outro formulário) só que o objeto ednome.text não é reconhecido no quick report. Como eu faço para que ele seja reconhecido no relatório, eu inseri em implementation do quick report: uses U_ConsCli; que é o arquivo .pas do formulário. Fireboard, em primeiro lugar, sugiro que você parametrize sua consulta SQL: select * from clientes where nomcli = :NomCli depois, para inicializar este parâmetro, você utiliza o método ParamByName do seu dataset tipo query (você não citou que componente está utilizando, mas é o seu query1); Para acessar o valor do texto digitado no outro form, você tem duas opções: 1) como você adicionou o form na cláusula uses do relatório, então basta que você indique o caminho completo deste componente, neste caso, indicando o form onde ele está, que pelo nome da sua unit, poderia ser algo como ConsCli.ednome.text (onde ConsCli, seria o nome do form onde o componente EdNome está); 2) criar uma função no seu form onde está o quickreport, e passar como parâmetro para ela o nome. Então, neste função, você inicializaria a sua querie e mostraria o relatório; (é o modo mais elegante, eu diria) - um exemplo. Em qualquer dos casos, a atribuição do valor ao parâmetro na sua query seria assim: query1.ParaByName('NomCli').AsString := ConsCli.ednome.text; (se utilizando o caminho do Edit) query1.ParaByName('NomCli').AsString := NomCli; (se utilizando a função, onde o nome do parâmetro seria NomCli) Apenas uma observação: caso você queira fazer uma busca por aproximação, ou seja, nomes que começam com o texto digitado ou que o contenham em qualquer posição, você terá que fazer uso de LIKE e não do sinal de igual (=). Veja exemplo: post e uma exemplificação: post Abraços
-
(Resolvido) Problema ao mostrar valores monetários em edits...
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
E agora? robinhocne, você leu o que eu postei no post#5 ? Bom, eu vou colocar aqui denovo: Sendo mais claro: Você está passando um texto como parâmetro (TxtVal.Text), sendo que a função Format, utilizando o formato "%.2f" (onde f refere-se a float) requer que o parâmetro seja um número! Assim sendo, se este seu TxtVal é um componente TCurrencyEdit também (e eu acho que sim), então você deveria utilizar a propriedade Value. Abraços -
Bom, você precisará declarar uma variável do tipo vetor cujos os tipos dos itens sejam do tipo da sua estrutura: struct cad_paciente ListaPaciente[10]; assim, você poderá guardar cada valor informado na posição desejada. a lógica que você vai usar, pode ser variada: - definir um vetor de tamanho fixo e fazer um loop para ler x itens para o vetor, cada qual em uma posição; - definir um vetor dinâmico e ir o aumentando a cada item incluso; ... em algum lugar (variável), você pode controlar o número de itens em seu vetor e depois o utiliza num loop para listar os dados na tela. é por aí...
-
Poderíamos considerar também a importância no sentido de que você pode fazer uso de alocação dinâmica, ou seja, reservar espaço de memória em tempo de execução. Quando você declara: char Vet[30], está reservando espaço em memória para 30 caracteres para a variável Vet; Já se você declarar: char *vet, estará reservando apenas o tamanho destinado a um ponteiro. Assim, vamos supor que o texto a ser colocado nestas variáveis não tenha um tamanho pré-determinado. Ao utilizar um tamanho fixo, você deverá dimensionar o tamanho da variável de modo a receber com segurança um número "x" de caracteres, o que provocará um uso excessivo da memória. Vamos a um exemplo para tentar entender a diferença entre guardar um valor em uma variável de tamanho fixo e dinâmico: # include "conio.h" void main() { char Vet[30]; char *vet; int size_to_alloc=40; clrscr(); /* limpa a tela*/ memset(Vet, 0, sizeof(Vet)); /* inicializamos o vetor com */ printf("Entre valor para vetor fixo: "); gets(Vet); /* lê o texto fixo */ vet=(char *)malloc(size_to_alloc); /* Aloca memória para vetor dinâmico */ memset(vet, 0, size_to_alloc); /* inicializamos o vetor com */ printf("Entre valor para vetor dinamico: "); gets(vet); /* lê o texto do vetor dinâmico */ printf("%s sizeof:%d length:%d\n%s sizeof:%d length:%d\n", Vet, sizeof(Vet), strlen(Vet), vet, sizeof(vet), strlen(vet)); getch(); /* pausa até que algo seja pressionado */ free(vet); /* libera memoria alocada */ } Execute o programa, e informe para ambos os campos solicitados o mesmo texto. Observe o resultado apresentado. Mas, este exemplo praticamente não mostra nada. A diferença será melhor visualizada se, agora, acrescentarmos um loop para ler 5 valores e armazená-los em um vetor. Em cada posição deste vetor armazenaremos uma string (texto). Se o tamanho de cada posição do vetro for fixo, no ex. 50, então a área ocupada será de 5*30=150bytes. Mas considerando que o texto entrado, não necessariamente terá o comprimento máximo de 30 caractres, então utilizando alocação dinâmica poderemos diminuir o consumo de memória. Veja este exemplo: # include "conio.h" void main() { int idx; int size_used=0; char buffer[30]; char *Lista[5]; /* declaramos uma lista de ponteiros para char */ clrscr(); /* limpa a tela*/ memset(Lista, 0, sizeof(Lista)); /* inicializamos o vetor com */ memset(buffer, 0, sizeof(buffer)); /* inicializamos o vetor com */ for(idx=0;idx<=4;idx++){ printf("Entre valor para posi‡„o %d na Lista: ", idx+1); gets(buffer); /* le o texto fixo */ Lista[idx]=(char *)malloc(strlen(buffer)+1); /* Aloca memória para o array de char na posição idx da nossa Lista */ strcpy(Lista[idx], buffer); /* copia */ size_used+=strlen(Lista[idx]); printf("Foram alocados: %d bytes\n", strlen(Lista[idx])+1); } printf("\nTamanho de buffer (sizeof): %d bytes", sizeof(buffer)); printf("\nSe armazenassemos em cada item da lista \num vetor como buffer (fixo), ocuparíamos (5*%d): %d bytes", sizeof(buffer), sizeof(buffer)*5); printf("\nComo armazenamos so o necessario (dinamico), ocupamos apenas %d\n", size_used); getch(); /* pausa até que algo seja pressionado */ for(idx=0;idx<=4;idx++){ /* libera toda a memória alocada */ free(Lista[idx]); } } Veja se estes exemplos lhe servem de algum modo. (espero que sim) Abraços p.s. o código foi compilado com o Turbo C
-
e se você quer saber que recursos/opções estão diponíveis, então, após digitar Debug no prompt do "DOS" e aparecer o prompt do programa ("-"), você pode digitar "?" e teclar ENTER. Para executar os comandos, você utiliza a letra (inicial) referente ao comando listado, não o nome do comando. é isso aí. É mais útil, eu diria, quando você quer depurar programas de um único seguimento (64KB) - os arquivos executáveis "*.COM". Você pode também, escrever programas em ASM direto na memória, executá-lo e até gravá-lo (se não me falha a memória). Apenas a título de curiosidade, veja este link - DEBUG ROUTINES. Mas tenha cuidado com o que você faz, atividades como escrita em disco ou BIOS como mostra o artigo, podem ser perigosos - você tem que saber o que está fazendo!!! Abraços
-
Acho que se você colocar as tabelas e os campos envolvidos, pode ficar mais fácil de algum exemplo ser apresentado. Ao que parece, você tem um número de colunas variáveis e de linhas também, não é. Então, parece que talvez tenha que ser montado algum tipo de SQL dinamicamente, se for baseado no exemplo que você postou. Quanto a por no formato de coluna, acho que seria mais ou menos equivalente ao que implementei certa vez, para tentar auxiliar um colega, onde cada coluna era um mês do ano que seria mostrado em um relatório. Para isso utilizei sub-selects. Só que foi para o Firebird, mas se não me engano há recurso similar no SQLServer - veja o post A figura anexa mostra o lay-out de saída.
-
está querendo fazer algum tipo de virus? <_<
-
Já instalou o SP2? A lista de hot-fix é grande, quem sabe inclua seu problema...
-
Ferramentas para modelagem de dados do MySQL - DBDesigne4 (open source) - MySQL Workbench - Ferramenta que deverá ser sua sucessora do DBDesigne4. Possui, no momento, duas versões: Community Edition (OSS) e Standard Edition, sendo a primeira open source e a segunda comercial. Neste link tem um comparativo entre as duas.
-
Neste caso, não. Mas você não pensa em fazer alguns testes com o FireBird? Se não me engano, os dois não podem conviver juntos, mas para teste, talvez você pudesse usar até uma VM (maquina virtual). Há compatibilidade e apenas alguns procedimentos para a "exportação" (backup) dos dados no Interbase e "importação" (restore) dos dados no Firebird. O Interbase 6 (que é versão open source, a partir da 7 não mais) foi ponto de partida do Firebird 1 que agora se encontra na versão 2.0.3, com muito mais recursos e otimizações. Os componentes da paleta IBX também funcionam com o FireBird, porque ao instalar o servidor, você tem a opção de gerar a DLL de compatibilidade - GDS32.DLL (utilizada pelo IB), que na verdade é a FBClient.DLL renomeada (segundo li por aí). Assim, em teoria, você não tem que mudar nada no programa para migrar de um banco IB para FB. Pense a respeito. ;)
-
(Resolvido) Problema ao mostrar valores monetários em edits...
pergunta respondeu ao robinhocne de Micheus em Delphi, Kylix
Mas complementando... sobre o erro: Format '%.2f' invalid or incompatible with argument robinhocne, se você der uma olhada no help sobre format, vai saber que quando você utilizar o %f, significa que no array de valores que você passa a função, o valor correspondente a este "parâmetro" tem que ser um número! E você está passando o quê....? Um string. :blink: -
Se eu perguntar a você se está com HT (HyperThreading) na BIOS habilitada e você responder SIM, então pode estar aí a explicação. Já tinha lido sobre isto ano passado nested post no ActiveDelphi. Aqui no forum também já falou-se sobre o assunto neste tópico Veja o que diz este artigo: Hyperthreading, SMP and InterBase, Firebird, Yaffil 2. Enabling HT on a double-processor computer leads to appearance of four processors (which are 2 physical and 2 virtual). Thus, when all processors are used, the processor bus becomes more loaded. As a result, instead of productivity increase, the system performance would slowdown by 10-15%. Pelo que li recentemente, parece que com a versão 7.5.1 este problema não mais existe. Quem sabe fosse interessante avaliar utilizar o FireBird 2, compatível com Intebase, com mais recurso e Gratuito, já que a versão 7 do Interbase não é. (vesta este post no Firebase-br) Abraços