
Thales Pontes Martins
Membros-
Total de itens
453 -
Registro em
-
Última visita
Tudo que Thales Pontes Martins postou
-
Salve programadores! É o seguinte: Eu fui solicitado a criar um sistema de banco de dados em TURBO PASCAL!, eu sei que é ridículo, mas o cara tá pagando né? fazer oque? Mas eu acho que a minha dúvida vale tanto para Delphi quanto para Pascal: Por exemplo, eu quero substituir uma tupla de uma tabela do meu banco por uma tupla que tenha tamanho maior, que contenha um texto de tamanho maior, por exemplo, que esteja lá pro meio do arquivo. Tem jeito de eu abrir esse espaço no meio do arquivo sem ter que deslocar todo o restante da tabela pra frente, oque tornaria o banco mais lento, obviamente. Tipo usando um artifício do próprio sistema de indexação do disco rígido, tipo quando não tem espaço consecutivo ele fragmenta o arquivo e põe em outro lugar, mas mantendo a perfeita ordem do arquivo internamente, somente fragmentando a nível de disco rígido. O mesmo ocorre quando eu quero colocar uma tupla de tamanho menor no lugar de outra, eu teria que deslocar todo o restante do arquivo para trás para economizar o espaço que irá vagar. alguém sabe se existe alguma maneira de fazer isso que eu disse, ou se alguém sabe como é que os bancos existentes fazem para resolver esse problema? Muito obrigado.
-
Eu estou colocando o caminho completo do index.htm, E de qualquer pasta que ele esteja no hd funciona, mesnos no cd! :(
-
Mas alguém sabe o motivo pelo qual não está abrindo a página?
-
É o seguinte gente, me pediram para fazer um autorun em um cd, que ao ser inserido devará mostrar uma página html com o internet explorer. aí no auto run do cd estava escrito assim -> open = index.html Não estava funcionando. Então eu imaginei que o autorum devesse obrigatóriamente chamar um executável. Então eu escreví um programa no delphi que procura o caminho do explorer no registro do windows e faz um winexec para ele passsando como parâmetro o arquivo html, que está no diretório raiz do cd junto com o meu programa. Só que o que que aconteceu: Quando eu montei a estrutura do cd numa pasta no hd, o meu programa abre o explorer e exibe a pasta perfeitamente, mais quando eu gravo os mesmo arquivos dessa pasta no cd e rodo o meu programa, ele mostra um erro, dizendo que o explorer não conseguiu abrir a página. Como isso é possível? Eu sei que pode não ter muito a ver com o delphi, mas não custa tentar? Muito obrigado a todos que responderem.
-
Qual a finalidade disso? Qual é o caso de uso? Mas adiantando, acho que não seria possível.
-
É o seguinte cara: você tá lá com a sua aplicação, beleza! Aí você coloca um novo form: File -> New -> Form. Dê o nome do form de fsenha. Nesse form você vai colocar uma edit pro cara digitar a senha, um label para informar 'Digite a sua senha' e um butão. Aí você vai na propriedade do form BorderStyle e muda para BsDialog, procara não dimensionar o form. Aí você vai na propriedade do form BorderIcons e deixa tudo false, pra não aparecer o botão de fechar no canto do form. Aí você coloca no evento OnKeyPress da edit o segunite procedimento: procedure TFSenha.Edit1KeyPress(Sender: TObject; var Key: Char); begin if (key = #13) then begin if (edit1.text = senha) then close else ShowMessage('SenhaIncorreta'); end; end; Aí você coloca o Caption do butão = 'Cancelar'. Aí você coloca no evento OnClick do butão o seguinte procedimento: procedure TSenha.Button1Click(Sender: TObject); begin Halt; end; Aí você coloca no evento OnClose do form o seguinte procedimento: procedure TFSenha.FormClose(Sender: TObject; var Action: TCloseAction); begin if not(edit1.text = senha) then halt; end; Aí você vai no menu Project -> View Source. Será exibido o código do programa. Aí você retira a linha -> Application.CreateForm(TFsenha,Fsenha); O código deverá ficar mais ou menos assim -> program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pas' {FSenha}; {$R *.res} begin FSenha:=TFSenha.Create(Application); FSenha.ShowModal; FSenha.Free; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. Acho que é só isso. Sendo que senha tem que ser uma variavel ou contante do tipo string. Para maior proteção você pode encriptar a senha pra niguem abrir o exe com hex editor e descobrir. Isso se faz fácilmente escrevendo-se uma função que retorna a senha, ou seja: a função vai executar cálculos matemáticos em cima de constantes do programa de forma a retornar a senha correta, não ficando protanto armazenada no exe. Isso só depende de sua criatividade. Espere ter ajudado. Abraço.
-
Cara, você foi bastante confuso na sua pergunta e não entendi muito bem a sua dúvida. mas eu acho que seria -> Type Tclasse = class (TObject) private fNome: String; function getNome: String; procedure setNome(const Value: String); public {ou published se for componente} property tNome: String read getNome write setNome; end; implementation procedure TClasse.SetNome(const Value: String); begin {Códigos e mais códigos} fNome:=Value; end; Function TClasse.GetNome : String; begin {Códigos e mais códigos} Result:=fNome; end; Explique-se melhor e poderemos ajudar de maneira melhor.
-
Isso aí é só você fazer a mesma coisa, só que au invés de fazer num exe faça num arquivo vazio. É o seguinte, eu tenho aqui em casa um livro de rotinas para turbo pascal 6: 'Ferramentas avançadas em Turbo Pascal, Por Alvaro Luis Santos de Almeida'. Lá tem uma rotina que serve para proteger o arquivo executável contra execução por mais de n vezes. Ou seja, ele incrementa uma constante que existe no arquivo exe a cada vez que ele é executado, e pode-se saber quantas vezes foi executado, para uma proteção no caso de programas shareware. Então devo supor que no DOS é permitido a modificação do próprio exe durante sua execução, e no Windows não? <_< Qualquer coisa -> thalespo@terra.com.br
-
Realmente quando alguém está reclamando de algum erro é preciso ver o código para poder indentificá-lo. Eu só quis dizer que para se explicar uma idéia sobre um algoritmo, é muito mais fácil de entender por uma explicação do que só vendo o código. Desculpa aí cara, não quis ofender.
-
Pois é, Micheus. O que você tem que entender é que o intúito da troca de códigos neste fórum é de se aprender a utilização das funções do delphi, não da lógica do algorítmo, porque cada um entende apenas o próprio código. Se você explicando o sistema passo a passo eu já não entendí, imagina eu olhando o código. Eu conheço todos os comandos utilizados no programa, o problema é o entendimento do relacionamento deles para a estruturação e utilidade do código. O que está em questão é a forma como os dados são armazenados no arquivo e a versatilidade do método utilizado, não tem nada a ver com a linguagem. Mas esquece isso. Quem você tem que convencer é o juniorboll. D4n1l0d, eu vou mandar pra você os programas. São escritos em Delphi 6, hein. O nome do cara é tão difícil que tem que copiar e colar :lol: .
-
Posta o seu código aí pra gente criticar, p****. Porque eu não tenho nenhum código para escrever strings em arquivos exe. Só se eu inventasse agora. Mas se você quiser eu posso enviar por email o código de alguns programas que eu escreví que envolvem manipulação de arquivos. Eu escreví um programa para concatenar vários arquivos em um só, que eu precisei para juntar arquivos vob de um dvd. Escreví um programa que mostra um form com um joguinho mas antes ele copia um programa de brincadeira pra pasta inicializar do pc, que vai fechando todas as janelas, e escreví um jogo de xadrez muito ruim e está incompleto, mais permite savar e abrir jogos em arquivos. E também escreví um programa que serve pra apagar arquivos que foram gravados em um cd, de uma pasta no hd. Acho que é só isso. abraço.
-
Eu disse Mas eu escreví em outro arquivo, no próprio exe eu nunca tinha escrito. Eu iniciei um novo tópico recentemente neste fórum com o título 'Arquivo auto extraível'. O que eu fiz foi compilar um programa, e no mesmo arquivo eu juntei um outro programa que eu queria que o primeiro programa extraísse, e separando os arquivos tinha uma string id. funcionou pra cacete, só que eu abrí o exe no modo leitura, ele aceitou perfeitamente, aí quando eu rodava o programa ele gerava um outro arquivo exe no computador do cara, como se fosse um instalador. Certo? Se tiver mais alguma coisa em que eu possa ajudar, terei o maior prazer. Não deixe de postar, e avise se conseguir ou não.
-
O que o Micheus falou: Está certo. A quebra de linha se dá pelos bytes #13 e #10 nesse ordem. Já que o Micheus falou que um arquivo exe não pode ser modificado durante sua execução, vamos considerar que ele esteja certo e desistir dessa idéia. Pode até ser que haja uma maneira, mas até alguém descobrir...... Quanto a essa maneira que o Micheus descreveu para savar a variaveis, eu não entendi muito bem. E também não sei se voces entenderam a minha maneira. Mas de qualquer jeito ainda acho que a minha maneira é mais versátil. A minha sugestão para você é que seu programa rode dentro de uma pasta isolado e que alí se criem os arquivos que o programa utiliza, sejam eles tabelas sql ou arquivos simples que você mesmo gravou utilizando os métodos apresentados por mim e pelo Micheus. Desse jeito toda vez que o seu programa for copiado para outro lugar, terá que ser copiada toda a pasta que contém o programa e seus arquivos. Assim nunca serão perdidos os dados quando ouver cópia ou mudança de versão. Eu particularmente prefiro esse. Ou ainda Fazer um sistema de abrir, salvar. Que assim os usuários poderão salvar diferentes dados em diversos arquivos de maneira mais livre, e poderão abrir o que desejarem. Ou a sugestão do arquivo na pasta do windows, podendo ser ini ou binário, mas com a desvantagem que você quando quiser copiar pra outra máquina, você terá que achar ele lá no windows, colocar junto com o programa, depois copiar o programa na outra máquina e jogar o arquivo pro windows de novo. Se voce quiser me mandar o seu código fonte pra eu tentar fazer o sistema de gravação pra você, o meu email é -> thalespo@terra.com.br. Abraço
-
Pois é cara, o que você viu lá no bloco de notas foi as constantes do programa. As variaveis mesmo não foram gravadas, porque está dando erro na abertura do exe no modo de escrita. Elas tem que ficar no final de tudo no arquivo. Eu aqui consegui abrir qualquer arquivo e escrever normalmente nele, menos o próprio exe. Eu estou tentando resolver aqui, mas pode demorar um tempo.... Quanto ao tamanho da string, não tem problema não. O que que você vai fazer(quando você conseguir abrir o exe, claro) -> No final você vai colocar uma string de identificação de início das variáveis tipo -> '$&*(8^-+=', só pra você saber onde começa as variaveis. Aí você compila o programa e vê o tamanho dele, por que aí você vai pular esse tanto de bytes e vai começar a procurar essa string id a partir dalí, para não perder tempo. Porque você sabe que dali pra traz só tem o programa. Dá uma toleranciazinha, começa a procurar um pouco antes, digamos uns 40 bytes, porque não há muito risco de erro porque a tendencia do programa é só crescer. Então vai estar gravado essa string e depois as variaveis, sendo que pra cada variável vai ter -> >> Um byte que indentifica de que se trata o valor, pra você poder colocar ela na variavel certa depois. >> Um byte que indica o tamanho em bytes da variável, pra no caso de ser string você saber até onde você tem que ler ela, use length() para gravar o tamanho em bytes de uma string, e sizeof se for outra variavel qualquer alocada estaticamente. >> E a váriavel mesmo. Desse jeito, quando você achar a string id, você começa a ler depois dela -> >>primeiro o identificador, pode-se usar um case para lê-la na variável correspondente ou um sistema de indexação >>depois o tamanho da variavel >>depois você lê a variavel pelo tamanho indicado. Quando você lê uma variavel, digamos de 4 bytes de tamanho, o pointer do arquivo desloca-se automáticamente 4 bytes para frente, então depois que você ler uma variavel até o tamanho indicado, a próxima coisa que segue é o byte de identificação da próxima variável, assim você tem total controle. Quando você terminar de gravar as variáveis você coloca uma outra string, dizendo que terminou e não há mais nada a ser lido. Eu já usei esse sitema num jogo de xadrez que escreví, só que eu não salvava no próprio exe, tinha um menu arquivo -> salvar... aí o programa salva todas as variáveis do programa no arquivo, pro usuário poder abrir o jogo posteriormente. Aí eu podia salvar as variáveis em qualquer ordem, deixar de salvar algumas ou salvar a mais que não tinha problema. se fosse versão diferente e o programa não reconhecesse umas das variáveis(byte identificador) ele simplesmente descartava e pulava prá próxima. Ou se ele não encontrasse uma variável ele só não colocava nada nela..... Funcionou muito bem. O único problema é que eu não estou conseguindo abrir e escrever no arquivo exe. Abraço
-
Quando você declara uma variável desse jeito-> var st : string[10]; Voce estará alocando estaticamente, não é possível mudar o comprimento dela, então você pode escreve-la no arquivo diretamente, assim -> FileWrite(f,st,length(st)+1) Agora......., quando é uma string dinamica -> var st : string; Na verdade no endereço dela não tem texto nenhun, só um ponteiro para o texto, então faça isso-> var st : string; ch : ^char absolute st; begin st := 'Vamos ver se grava'; FileWrite(f,ch^,length(st)); end; Só que eu estou apanhando aqui para abrir o próprio executável em modo de escrita. Quando eu mando abrir a função retorna um código de erro. Eu estou conseguindo abrir normal em modo de leitura, mas aí não grava nada. Voce tem certeza que você abriu o arquivo exe no bloco de notas e as variáveis estavam lá no final????? Eu vou ficar tentando aqui, e assim que eu conseguir eu posto aqui. Talvez esses caras mais fodas saibam oque está acontecendo, tipo o Micheus, o Churc e o Graymalkin. Os caras que nunca perguntam nada, só respondem. Abraço.
-
Pois é. Voce pode fazer o seu programa procurar um arquivo .ini na pasta do windows, caso não encontre, quer dizer que é a primeira vez que o programa é executado naquele computador, então ele cria o arquivo. Mas a desvantagen é que se você colocar o programa em outro computador as variaveis seram perdidas. E no caso de colocalas no executável, não interessa para onde você leve o programa que as variaveis estarão sempre lá. O problema das novas versões e dos novos campos são resolvíveis. você pode colocar no final do arquivo executável um identificador que pode ser uma string, que indicará o término do exe e o inicio dos dados. Aí, antes de cada variável você coloca um numero inteiro que irá identificar do que se trata a variável, tipo: 1 é a data de ocorrencia de não sei oque, 2 é a data de não sei oque lá........... Desse jeito você pode colocar as variáveis em qualquer ordem que não tem problema. E poderá inserir novos campos sem interfirir nos outros..... Aí, toda vez que o seu programa rodar ele checa a existencia dessas variáveis no final do arquivo.... se não existirem é porque o programa foi recompilado, então ele mesmo já coloca as variáveis no final..... Agora se o programa for executado e já existirem as variaveis, ele recupera os seus valores. Em certa ocasião eu usei estes artifícios, e funcionou perfeitamente. Agora......, você pode fazer um sistema de abrir e salvar. Que aí o cara salva o estado do programa em um arquivo de escolha dele, e depois ele tem que ter esse arquivo para o seu programa abrir. Voce escolhe qual método te atende melhor. Desculpe não ter respondido antes, é que eu to trabalhando o dia todo e final de semana também. Abrasss
-
Pois é, essas funções colocan as váriaveis no final do arquivo. você vai estar abrindo o próprio arquivo executável e gravando e lendo os valores no final. Se não funcionar, é porque tem algum erro no código, então tente: para aumentar o tamanho do arquivo executável para caber as variáveis: Var f : integer; aux : array[1..3] of TDateTime; begin f:=fileopen(paramstr(0),$42); fileseek(f,0,2); FileWrite(f,aux,sizeof(aux)); FileClose(f); end; Depois para gravar as variáveis: Var f, tam: integer; begin f:=filopen(paramstr(0),$42); tam:=fileseek(f,0,2); fileseek(f,tam-(sizeof(TDateTime)*3),0); Filewrite(f,var1,Sizeof(TDateTime)); Filewrite(f,var2,Sizeof(TDateTime)); Filewrite(f,var3,Sizeof(TDateTime)); end; Depois para ler as variáveis do arquivo: Var f, tam: integer; begin f:=filopen(paramstr(0),0); tam:=fileseek(f,0,2); fileseek(f,tam-(sizeof(TDateTime)*3),0); Fileread(f,var1,Sizeof(TDateTime)); Fileread(f,var2,Sizeof(TDateTime)); Fileread(f,var3,Sizeof(TDateTime)); end; :o Lembre-se de colocar um FileClose(f); antes de fechar o programa, ou se for função, no final de cada função. ;) Só mais uma coisa, você está colocando a data em forma de string ou em variavel TDateTime? Porque eu sugiro que use TDateTime, porque corre menos riscos de erro. acho que pode-se usar a funcao StrToDate para converter. Qualquer problema, não deixe de perguntar. abrasssss
-
Instalar Componente
pergunta respondeu ao Thales Pontes Martins de Thales Pontes Martins em Delphi, Kylix
É isso mesmo, cara! Como não pensei nisso antes? Eu acho que é porque tem que ser inteligente mesmo :lol: . O negócio do ComponentState não tem problema, porque o legal do componente é ele já ir marcando a hora no form antes de rodar. Mas então, quer diser que a unit que contém o componente ancestral não pode ser QStdCtrls, QControls, QExtCtrls? tem que ser sem o "que"? Eu também não sei muito bem a diferença de aplicação vcl e clx........ mas não fui eu que coloquei aqueles que's lá não :huh: . Eu não consigo escrever a letra "que" nesta p****! -
Instalar Componente
pergunta respondeu ao Thales Pontes Martins de Thales Pontes Martins em Delphi, Kylix
Meu código está aí cara, a coisa mais simples do mundo: unit ULabelTime; interface uses Windows, Messages, SysUtils, Classes, QControls, QStdCtrls, QExtCtrls; type TLabelTime = class(TLabel) private { Private declarations } protected { Protected declarations } public { Public declarations } Timer : TTimer; constructor create(aowner : TComponent); override; procedure refresh(sender : tobject); published { Published declarations } end; procedure Register; implementation procedure Register; begin RegisterComponents('Standard', [TLabelTime]); end; constructor TLabelTime.create(aowner : TComponent); begin inherited create(aowner); Timer:=Timer.Create(Aowner); Timer.Enabled:=true; Timer.interval:=1000; Timer.OnTimer:=refresh; refresh(self); end; procedure TLabelTime.refresh(sender : tobject); begin Caption:=TimeToStr(now); invalidate; end; end. No configure palatte ele aparece assim E na paleta aparece assim: Se é que é possivel inserir imagens do meu computador aí, elas vão aparecer. -
Copia e cola esse seu código aqui pra eu dar uma analizada.
-
Instalar Componente
pergunta respondeu ao Thales Pontes Martins de Thales Pontes Martins em Delphi, Kylix
Pois é, eu vejo em qual paleta está lá no 'configure palette', mas quando eu vou lá na paleta ele não está lá... De vez em quando ele aparece na paleta, mas somente quando não tem nehum projeto aberto, quando eu abro um ele some na hora. Acho que ele está querendo evitar que eu use o componente :lol: . Deve ser algum bug no meu delphi 6. -
Transparencia Em Forms
pergunta respondeu ao Luiz Guilherme de Thales Pontes Martins em Delphi, Kylix
o form tem uma propriedade booleana alphablend... Coloca para true e depois ajuste a transparencia na prop. alphablendvalue.... Ou então: coloque a prop. TransparentColor para true, Coloque a cor do form para preta e ajuste a prop. transparentcolorvalue para preto também..... desse jeito tu pode colocar uma imagem TImage bitmap e ajustar a prop. Transparent dela para true....Aí se ela tiver o fundo de uma cor só, vai ficar transparente...... abrassssss Esquecí de dizer que só funciona no Windows XP..... -
Não precisa mais responder não gente. num tem nada de errado com extrair dados do próprio executável não. Eu é que estava colocando um comando errado mesmo -> FileSeek(sor,0,point); Ao invés de FileSeek(sor,point,0); Desculpem :D .
-
Instalar Componente
pergunta respondeu ao Thales Pontes Martins de Thales Pontes Martins em Delphi, Kylix
Com certeza, Micheus. Estou registrando o componente, aí quando eu instalo, ele diz que o componente foi adicionado com sucesso no pacote user def...bla, bla, bla... Só que não aparece na paleta de componetes de jeito nenhum :angry: . -
Você foi completamente claro, Micheus. Entendi a sua explicação. Só resta uma dúvida: Praquê serve o tipo interface? <_<