
Thales Pontes Martins
Membros-
Total de itens
453 -
Registro em
-
Última visita
Tudo que Thales Pontes Martins postou
-
Funcionou???????????????????????? Você tem que passar o nome do campo como parametro tipo 'ControleFinanceiro' e não o caminho do arquivo tipo 'C:\arquivos de programas\controle.exe'. O caminho do programa já é retornado por ParamStr(0).
-
procedure revertStr(st : string) : string; var i, l: cardinal; begin l:=length(st); setlength(result,l); for i:=0 to l-1 do result[l-i]:=st[i+1]; end;
-
Tratar Erros De Api Do Windows: Shellapi
pergunta respondeu ao Geovani de Thales Pontes Martins em Delphi, Kylix
Funções CopyDir e CopyArq que mostra progresso em Gauge passado como parametro -> type PProgressData = ^TProgressData; TProgressData = record LastFile, CurFile : Cardinal; Gauge : TGauge; Progress, TotalSize, LastProg : int64; end; function GetFileSizeEx(STFile : String) : int64; var hfile : Cardinal; begin hfile:=FileOpen(STFile,fmopenread or fmShareDenyNone); result:=fileseek(hFile,Int64(0),2); FileClose(hFile); end; function GetDirSize(sc: string) : int64; var res : int64; function vldir(dr : string) : boolean; begin result:=((trim(dr) <> '..') and (trim(dr) <> '.')); end; procedure Search(sor : string); var Rec : TSearchRec; s : string; begin if (FindFirst(sor+'\*.*',faReadOnly or faanyfile or favolumeid or faHidden or faSysFile or faDirectory or faArchive,rec)<>0) then begin FindClose(rec); exit; end; while true do begin if ((rec.Attr and fadirectory)<>0) then begin if vldir(rec.Name) then Search(sor+'\'+rec.name) end else begin s:=sor+'\'+rec.name; res:=res+GetFileSizeEx(s); end; if (FindNext(rec) <> 0) then begin FindClose(rec); break; end; end; end; begin res:=0; if (sc[length(sc)] = '\') then delete(sc,length(sc),1); if not(directoryexists(sc)) then begin result:=0; exit; end; Search(sc); result:=res; end; function CopyProgressRoutine( TotalFileSize : int64; TotalBytesTransferred : int64; StreamSize : int64; StreamBytesTransferred : int64; dwStreamNumber : DWORD; dwCallbackReason : DWORD; hSourceFile : Cardinal; hDestinationFile : Cardinal; lpData : PProgressData ) : DWORD; stdcall; var CBlock : int64; begin if (lpdata^.CurFile <> lpdata^.LastFile) then begin lpdata^.LastProg:=0; lpdata^.LastFile:=lpdata^.CurFile; end; CBlock:=(TotalBytesTransferred-lpdata^.LastProg); lpdata^.LastProg:=TotalBytesTransferred; lpdata^.Progress:=lpdata^.Progress+CBlock; lpdata^.Gauge.Progress:=integer(lpdata^.Progress shr 7); end; function CopyDir(sc, ds : string; Gauge : TGauge) : TStringList; var List : TStringList; dat : TProgressData; function vldir(dr : string) : boolean; begin result:=((trim(dr) <> '..') and (trim(dr) <> '.')); end; procedure Search(sor, des : string); var Rec : TSearchRec; s,d : string; __cancel : BOOL; att : cardinal; begin __Cancel := false; ForceDirectories(des); if (FindFirst(sor+'\*.*',faReadOnly or faanyfile or favolumeid or faHidden or faSysFile or faDirectory or faArchive,rec)<>0) then begin FindClose(rec); exit; end; while true do begin if ((rec.Attr and fadirectory)<>0) then begin if vldir(rec.Name) then Search(sor+'\'+rec.name,des+'\'+rec.Name) end else begin s:=sor+'\'+rec.name; d:=des+'\'+rec.name; inc(dat.CurFile); if (fileexists(d)) then begin att:=filegetattr(d); filesetattr(d,0); end; if (gauge <> nil) then begin if (cardinal(CopyFileEx(PAnsiChar(s),PAnsiChar(d),@CopyProgressRoutine,@dat,@__cancel,0)) = 0) then begin List.Add(s); if (fileexists(d)) then Filesetattr(d,att); end; end else begin if (cardinal(CopyFileEx(PAnsiChar(s),PAnsiChar(d),0,0,@__cancel,0)) = 0) then begin List.Add(s); if (fileexists(d)) then Filesetattr(d,att); end; end; end; if (FindNext(rec) <> 0) then begin FindClose(rec); break; end; end; end; begin if (sc[length(sc)] = '\') then delete(sc,length(sc),1); if (ds[length(ds)] = '\') then delete(ds,length(ds),1); dat.Progress:=0; if (gauge <> nil) then begin dat.TotalSize:=GetDirSize(sc); gauge.MinValue:=0; gauge.MaxValue:=(dat.TotalSize shr 7); end; dat.CurFile:=0; dat.LastFile:=0; dat.Gauge:=gauge; if not(directoryexists(sc)) then begin result:=nil; exit; end; List:=TStringList.Create; Search(sc,ds); result:=list; end; function CopyProgressRoutineArq( TotalFileSize : int64; TotalBytesTransferred : int64; StreamSize : int64; StreamBytesTransferred : int64; dwStreamNumber : DWORD; dwCallbackReason : DWORD; hSourceFile : Cardinal; hDestinationFile : Cardinal; lpData : PProgressData ) : DWORD; stdcall; begin if (lpdata^.LastFile = 1) then begin lpData^.LastFile:=0; lpData^.Gauge.MaxValue:=(TotalFileSize shr 7); lpData^.Gauge.MinValue:=0; end; lpdata^.Gauge.Progress:=integer(TotalBytesTransferred shr 7); end; function CopyArq(sc, ds : string; gauge : TGauge) : BOOL; var Dat : TProgressData; _cancel : BOOL; att : cardinal; begin _Cancel:=false; if (fileexists(ds)) then begin att:=filegetattr(ds); FileSetAttr(ds,0); end; if (Gauge <> nil) then begin Dat.Gauge:=gauge; Dat.LastFile:=1; Result:=CopyFileEx(PAnsiChar(sc),PAnsiChar(ds),@CopyProgressRoutineArq,@Dat,@_cancel,0); end else Result:=CopyFileEx(PAnsiChar(sc),PAnsiChar(ds),0,0,@_cancel,0); if not(result) then begin if (FileExists(ds)) then FileSetAttr(ds,att); end; end; -
Form Secundário Minimizando Na Barra De Tarefas
pergunta respondeu ao Paulo Nobre de Thales Pontes Martins em Delphi, Kylix
Originalmente está em protected para poder ser overriden mas já que o compilador não reclama em override um método na interface errada acho que não faz diferença. -
O procedimaneto tem sentido sim. O que você está passando como parametro pro procedimento? Passe por exemplo CriaStartup('Controle');. De qualquer maneira de uma olhada no seu regedit pra ver se a chave está lá mesmo. Tem. Com o WinExec você pode abrir qualquer programa -> Winexec('c:\programa.exe', SW_SHOWNORMAL);
-
Form Secundário Minimizando Na Barra De Tarefas
pergunta respondeu ao Paulo Nobre de Thales Pontes Martins em Delphi, Kylix
O cara sabe tudo mesmo, muito fera. Eu declarei na interface public, porque achei que fosse mais correto. Declarar desse jeito aí é a mesma coisa que declarar na interface public? Eu sabia que era alguma coisa relacionada ao parent do form e que tinha que dizer ao windows que o form não tinha parent, mas vai saber como. Muito fera. -
Form Secundário Minimizando Na Barra De Tarefas
pergunta respondeu ao Paulo Nobre de Thales Pontes Martins em Delphi, Kylix
Só pra você se divertir. Voce deve ter visto como eu fiz naquele programa de criptografia para abrir um form diferente quando se clica em cima do arquivo, então do mesmo jeito dá pra abrir um form em outra aplicação. Vamos supor que você tenha 3 forms (TForm1, TForm2, TForm3). Aí você coloca no Project->View Source o seguinte-> program Project1; uses Forms, SysUtils, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var formID : cardinal; begin Application.Initialize; if (ParamStr(1) <> '') then begin try formID:=StrToInt(ParamStr(1)); except formId:=0; end; if (formID <> 0) then begin case formID of 1:Application.CreateForm(TForm1, Form1); 2:Application.CreateForm(TForm2, Form2); 3:Application.CreateForm(TForm3, Form3); else Application.CreateForm(TForm1, Form1); end; end else Application.CreateForm(TForm1, Form1); end else Application.CreateForm(TForm1, Form1); Application.Run; end. Aí para abrir um form invés de chamar Form2:=TForm2.create...... você chama assim-> var ComLine : string; begin ComLine:='""'+ParamStr(0)+'"'+' 3'+'"'; WinExec(ComLine, SW_SHOWNORMAL); end; aí a comunicação poderia ser estabelecida por meio de menssagens. Ok? -
Passar Hora De Um Edit Por Extenso.
pergunta respondeu ao Tamires de Thales Pontes Martins em Delphi, Kylix
Pensando melhor, não era exatamente isso que eu ia fazer não rsrsrs. -
Agora acho que está certo -> procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var p : cardinal; _edit :TEdit; begin _edit:=TEdit(sender); if (key = '-') then begin if (length(_edit.Text)>0) and (_edit.text[1] = '-') then begin p:=_edit.SelStart; _edit.text:=copy(_edit.text,2,length(_edit.text)-1); _edit.SelStart:=p-1; end else begin p:=_edit.SelStart; if (length(_edit.Text) > 0) then _edit.text:='-'+_edit.text else _edit.Text:='-';; _edit.SelStart:=p+1; end; end; if not(key in ['0'..'9',#8]) then key:=#0; end;
-
Form Secundário Minimizando Na Barra De Tarefas
pergunta respondeu ao Paulo Nobre de Thales Pontes Martins em Delphi, Kylix
Como você mesmo disse que eu tinha um ás na manga: Eu só sei de um jeito de fazer isso que seria chamar o form em uma nova aplicação, ou seja, cada form na verdade seria uma aplicação diferente. Só que aí não seria possível um form se comunicar com o outro, a não ser que você seja um s3c ou um Micheus da vida, rsrsrs. Na verdade existe um meio como você pode ter reparado no código que o s3c postou pra resolver o seu problema do TrayIcon, que seria alocar memória no espaço da outra aplicação para então se estabelecer a comunicação. -
Passar Hora De Um Edit Por Extenso.
pergunta respondeu ao Tamires de Thales Pontes Martins em Delphi, Kylix
Tá vendo, se eu fosse escrever eu ía perder meu tempo porque era exatamente isso que eu ía escrever. -
Ahh é, é que eu escreví sem testar mas você já deveria saber que tem que ser (sender as TEdit).text. E o acesso de violação é porque você tem que testar pra ver se a string está vazia. Eu vou escrever direitinho e depois eu posto.
-
você tá doidão cara, tá fazendo umas coisas muito erradas. Por que você colocou o caminho do seu programa como identificador de parametro do seu procedimento? Tenta assim-> Procedure TFRacesso.CriaStartup(ControleFinanceiro : String); var Reg : TRegistry; Begin Reg := TRegistry.Create; Reg.RootKey := HKEY_LOCAL_MACHINE; Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run',false); Reg.WriteString(ControleFinanceiro, ParamStr(0)); Reg.CloseKey; Reg.Free; End;
-
Acho que você tá cometendo alguns errinhos aí, tente -> Reg.OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Run', False);
-
Como Minimizar Uma Aplicação Apartir De Outra
uma questão respondeu Thales Pontes Martins em Delphi, Kylix
procedure TForm4.FormShow(Sender: TObject); begin SetWindowPos(self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE+SWP_NOMOVE+SWP_NOSIZE); end;No OnShow do seu form ou qualquer outro evento, isso fará com que fique em cima. Lembre-se de colocar a propriedade FormStyle para fsStayOnTop. E se for ShowModal também ajuda. Abraço. -
Passar Hora De Um Edit Por Extenso.
pergunta respondeu ao Tamires de Thales Pontes Martins em Delphi, Kylix
É fácil fazer essa função porém um pouco demorado, então se ninguém estiver disposto a escreve-la eu posso escrever. -
100% certo.
-
Já que só tem eu aqui mesmo então vamo lá-> Você pode colocar no evento OnKeyPress da edit esse comando para que não aceite letras-> if not(key in ['0'..'9']) then key:=0; e se você quiser que aceite número negativo você coloca antes desse comando o seguinte-> if (key = '-') then begin if (sender.text[1] = '-') then begin sender.text:=copy(sender.text,2,length(sender.text)-1); end else sender.text:='-'+sender.text; end;
-
Não uso Skype nem MSN. Só bato papo no GameDesire.com Pool 8 [new] primeira sala da polônia. Aparece por lá.
-
Vamos filosofar. É claro que existem cálculos que não se pode recuperar, os que cortam dados obviamente não se podem recuperar já que tiveram algums dados jogados fora, como somar ou XORear vários valores em uma única variável(Hashing). O shifting bit a bit também é irrecuperável pois jogas os bits pra fora da variável, então não tem como recuperar. O AND lógico também não porque podem existir 3 combinações diferentes que resultariam no mesmo resultado, então como você poderia adivinhar qual é a correta, não dá. A soma, subtração e XOR são reversíveis, sabendo um operando e o resultado pode-se saber o outro operando, ou seja não esconde dados como o AND. Mais não era nada disso que eu me referia. Eu quis dizer que eu cheguei a um código que faz a encriptação preservando o mesmo tamanho, sem esconder ou cortar nenhum dado, deixando todas as informações intactas, mas sendo impossível existir um procedimento que recupere os dados para o original. Não vou explicar que procedimento é esse porque além de ser muito difícil explicar, as pessoas podem entender da maneira errada. O que acontece comigo sempre é o seguinte: Quando estou trabalhando em um código e acontece um erro, eu fico sentado na frente do computador analizando exaustivamente o código tentando descrobrir o erro. Depois que eu passei o dia todo olhando pro código e não conseguí descobrir nada, eu desisto e vou tomar banho. No banho eu ainda continuo tentando descobrir o erro vizualizando o código na minha mente, e lá pra metade do banho eu costumo achar o erro(Só unit de 500 linhas pra cima). 90% das vezes eu acho os erros no banho ou dormindo (nos sonhos). Só 10% eu acho na frente do computador olhando para o código. Acreditem se quiser. :P A propósito, conseguí fazer a desencriptação aqui 100%, agora estou com problemas com a validação de senhas. Sabe como é, nesse tipo de código sempre ocorre pelo menos uns 40 erros, e é o que está previsto pra acontecer. Quem sabe no banho. hehe.
-
Putz, isso tudo pra pegar um número serial, putz! Tá bom, digamos que eu te forneça essa contra senha, o que você faz depois?
-
Explica melhor a proteção que você quer implementar e poste a função que pega o serial do hd, por favor.
-
É porque só copia o texto selecionado da Edit, você não acha? Então faça assim -> Edit1.SelStart:=0; Edit1.SelLength:=length(edit1.text); Edit1.CopyToClipBoard;
-
Boa Gray. Inclusive eu já usei hashing pra fazer tabela de transposição. O hashing é perfeito para identificar dados conhecidos em uma tabela por ter menor valor do que o dado, por isso não é reversível. Toda encriptação que resulta em tamanho menor (hashing) corre o risco de identificar 2 ou mais dados diferentes. Encriptações de tamanho igual nunca identificam dados diferentes mais sempre são iguais para o mesmo dado e mesma senha, e são reversíveis na maioria das vezes. E encriptações de tamanho maior sempre identificam os mesmos dados mas podem ser randomicas para o mesmo dado e mesma senha, e são reversíveis. Cálculos que deixam os dados irreversíveis são por exemplo o AND lógico. Se você fizer um AND lógico em dois números, conhecendo o resultado e um operando não é possível conhecer o outro operando. Ao contrário do XOR lógico.
-
Tenho minhas dúvidas, as vezes depois de um cálculo, os dados resultantes, ou seja, a senha e o arquivo criptografado, não são suficientes para se recuperar os dados originais. Cheguei a essa conclusão depois de pensar em vários calculos, na tentativa de torná-los o máximo complexos dentro de minhas possibilidades, e me deparar com resultados que não são reversíveis. Ou pelo menos eu não conseguí pensar em um calculo para reverte-los. Não tenho conhecimento de que isso possa ocorrer. Ainda mais quando o algorítmo usa muita aritmética de ponteiro, qualquer errinho é pelo menos uma ano pra descobrir. :lol: