Ir para conteúdo
Fórum Script Brasil

Churc

Veteranos
  • Total de itens

    1.198
  • Registro em

  • Última visita

Tudo que Churc postou

  1. Opa Maravilha brother :D mas seguinte, repare que ainda algumas partes do código está "not safe" pois você está chamando o form (VCL) sem o synchronize(); exemplo procedure TDownloadThread.OnFTPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string); begin FrmPrincipal.Memo1.Lines.Add(AStatusText); end; o correto seria voce criar uma procedure chamada exemplo FTPStatus(); e na base da Thread adiciona a variavel pra poder usá-la type TDownloadThread = class(TThread) private { Private declarations } szStatus: String; protected procedure FTPStatus; ... procedure TDownloadThread.FTPStatus; begin FrmPrincipal.Memo1.Lines.Add(szStatus); end; ai voce trocaria a chamada no OnFTPStatus por procedure TDownloadThread.OnFTPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string); begin szStatus := AStatusText; Synchronize(FTPStatus); end; Enfim, se está funcionando tudo ok e o programa não é nada importante do tipo pesado que faça muita coisa então deixa assim, agora caso contrário, se tiver problemas, aconselho você a pensar em fazer dessa forma rs abrxxx
  2. Opa Tenta isto... http://forum.devmedia.com.br/viewtopic.php?p=304670#304670 Talvez não seja o que você precisa, mas eu nunca usei o Rave Reports então não faço a menor idéia :/ espero que você consiga ou que alguém saiba te ajudar... boa sorte ai abrs
  3. Opa Posta a parte do seu código que faz essa chamada pra gente dar uma olhada... abrs
  4. Opa Da uma olhada nestes tópicos http://scriptbrasil.com.br/forum/index.php?showtopic=115358 http://scriptbrasil.com.br/forum/index.php?showtopic=100260 http://scriptbrasil.com.br/forum/index.php...mp;#entry404246 abrs
  5. Opa Então o que você tem a fazer é, colocar o código que usa o Form (frmPrincipal) dentro de uma procedure e ao invés de voce chamar por exemplo procedure TDownloadThread.Execute; begin ... FrmPrincipal.Memo1.Clear; FrmPrincipal.Memo2.Clear; ... voce cria uma procedure pra isso na base do TDownloadThread exemplo type TDownloadThread = class(TThread) private { Private declarations } protected procedure ClearMemos; //---------------------- procedure Execute; override; procedure EnumFiles(szPath, szAllowedExt: String; iAttributes: Integer; Buffer: TStrings; bClear, bIncludePath: Boolean); StdCall; procedure DownloadFTP(Host, Username, Password, RemoteDir, LocalDir: string); procedure OnFTPStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string); procedure ApagaPasta(pasta: string); end; ... procedure TDownloadThread.ClearMemos; begin FrmPrincipal.Memo1.Clear; FrmPrincipal.Memo2.Clear; end; ... procedure TDownloadThread.Execute; begin ... Synchronize(ClearMemos); ... Basicamente isso... o mais díficil é você adaptar seu código nessa estrutura... vai dar trabalho mas fazer o que né rs então voce teria que criar sua própria estrutura e cada vez que voce for chamar o Form usar o Synchronize() com uma procedure pra isso... Detalhe, se precisar passar variaveis voce pode declará-las em private na base da Thread... boa sorte ai abrs
  6. Opa No menu "Project > Options" é para dar sim pra você alterar infos de ícone e versão... Agora se mesmo assim não der, vai na pasta do projeto, Selecione "Todos" os arquivos do projeto, clique com o botão direito neles, vai em Propriedades, desmarque o campo "Somente leitura" e clique em "Aplicar", se perguntar se deseja fazer isto pra todos os arquivos e pastas inclusive sub-pastas coloque que sim... Depois ainda na pasta do projeto, delete os arquivos do tipo *.dof, *.res depois no Delphi volte ao menu que falei e deverá dar pra mudar tranquilo... abrss
  7. Opa Seguinte, você não pode chamar o Form diretamente na Thread, voce deve sincronizar usando o Synchronize(); Isso chamam de "Thread Safe" e "Thread not safe", ou seja, o modo que você está fazendo não é o certo, não é seguro no caso "Not Safe" Você teria que colocar toda a parte do código que chama o Form em uma Procedure e sincronizar com o Syncronize exemplo nos sites *em inglês http://greatis.com/delphicb/tips/lib/appli...ynchthread.html http://www.drbob42.com/uk-bug/hood-04.htm http://delphi.about.com/od/kbthread/a/thread-gui.htm abrss
  8. Churc

    DLL

    Opa Da forma em que você quer fazer não é possível rs bom se fosse :) Infelizmente voce terá que definir todas na seção exports mesmo O que voce pode fazer é, vai andando todas as procedures e functions e colando o nome no bloco de notas com virgula, exemplo Testando, Testando1, Testando2, depois copia e cola em exports rs abrs
  9. Opa Tente da Seguinte forma type TPacket = record cmd: PChar; //ou //cmd: array [0..1024] of Char; //Buffer de 1024 caracteres, diminua se for muito ou aumente se não for suficiente end; //Pra compatibilidade com C voce deve usar BOOL não Boolean function get3DGSPacket(tmpData: TPacket): BOOL; cdecl; begin showmessage('get3DGSPacket - OK'); // só para debugar a aplicação. with tmpData do showmessage(PChar(tmpData.cmd)); // teria que exibir 'login' result := true; end; Qualquer coisa, cola um código em C que rode chamando essa funcao na DLL que eu testo aqui certinho... tenho o Visuall C++ porém não sei importar funcoes de DLLs em C rs abrs
  10. Opa Você se refere ao Logoff no Windows? abrs
  11. Opa... Só uma citação... Você está retornando um ponteiro como uma variável... PChars "não são" strings, PChars são ponteiros de Char (^Char), nada mais que isto e nesse caso requer um cuidado especial... Uma função em uma DLL jamais deve retornar funções do tipo PChar... Da forma em que está fazendo, quem está alocando o Result é a DLL mas quem está "limpando" da memória? Quando a DLL é descarregada, seja você chamando em tempo de execução (Run-Time) ou internamente da forma que está fazendo, no FreeLibrary(handle da DLL) a DLL não faz o trabalho de remover da memória o que foi alocado e no mínimo você terá um Access Violation, talvez não agora, talvez algumas vezes, vai variar de acordo como a memória está sendo processada Por isso existe, New(), AllocMem(), FreeMem(), StrDispose()... etc quando se chama um PChar internamente em um .exe Um artigo muito bom, só que em inglês... http://rvelthuis.de/articles/articles-pchars.html Sinceramente, você está tendo sorte que não está tendo Access Violation, mas como disse, com certeza ele vai aparecer bonito pra você hehe O que você pode fazer é, usar ShortStrings ou fazer como o Windows faz, primeiro saber o tamanho da memória que precisa ser alocada (Buffer), alocar memória suficiente e depois preencher o Buffer como exemplo no seu caso... (* DLL *) uses Windows, SysUtils, function Chave(lpBuffer: PChar; var iBuffSize: Integer): BOOL; StdCall; var szBuff: String; begin Result := False; //Se a variavel para armazenarmos o tamanho do buffer não foi passada //então paramos por aqui if @iBuffSize = nil then Exit; //aqui voce armazena o resultado szBuff := 'Delphi'; //se a variavel para alocar o buffer não foi passada ou o tamanho do //buffer que o caller alocou não for suficiente, então if (lpBuffer = nil) or (iBuffSize <= Length(szBuff)) then //retorna o tamanho do buffer necessario iBuffSize := Length(szBuff) + 1 else //caso contrario, preenche o buffer com o resultado StrLCopy(lpBuffer, PChar(szBuff), iBuffSize - 1); Result := True; end; exports Chave name 'Chave'; (* EXE *) function Chave: String; type TChaveFunc = record hLib: THandle; Func: function (lpBuffer: PChar; var iBuffSize: Integer): BOOL; StdCall; end; var ChaveFunc: TChaveFunc; iLen: Integer; begin Result := ''; with ChaveFunc do begin //carrega a DLL hLib := LoadLibrary('NOME_DA_DLL.dll'); //se foi carregada então if (hLib <> 0) then begin //procura a funcao Chave @Func := GetProcAddress(hLib, 'Chave'); //se encontrou então if Assigned(Func) then //pegamos primeiro o tamanho do buffer necessario, que será retornado //na variável: iLen if Func(nil, iLen) then begin //se tudo ok, armazenamos internamente a alocação necessária - 1 referente //ao delimitador #0 SetLength(Result, iLen - 1); //com o tamanho do buffer já correto e a alocação feita, buscamos o //resultado Func(PChar(Result), iLen); end; //trata o resultado corretamente, pode se usar também StrPas(); Result := PChar(Result); //Liberamos a DLL da memória FreeLibrary(hLib); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(Chave); end; é bem mais complicado, mas te garanto, nesse caso é a maneira correta... Procure em Windows.pas ou qualquer código fonte que manipule PChar em DLL, você não vai ver uma função na DLL retornar PChar Já tive muitosss problemas com isso e depois de apanhar muitooo e tal que aprendi hehe abrs
  12. Opa Na instalação tente apenas instalar o Delphi sem o C++ Builder e adicionais, talvez resolva! abraços
  13. Churc

    CreateMutex

    Opa Faça assim que é mais fácil... ao invés de você "enviar msg" e ter que processar a mesma... No Source do Programa, menu Project -> View Source coloque o seguinte código no começo de tudo var hMutex: THandle; begin hMutex := CreateMutex(nil, True, 'TFL'); if (hMutex <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then begin ShowWindow(FindWindow('Classe do seu form principal', nil), SW_SHOW); CloseHandle(hMutex); Exit; end; Application.Initilize; .... // e lá embaixo na última linha antes do end. CloseHandle(hMutex); //Pra liberar esse Mutex ou seja, o programa foi fechado e pode abrir um outro Bom fiz sem o Delphi aqui masss acredito que esteja tudo ok hehe A Classe do seu form principal é assim, vamos supor que seu form principal se chame frmTFL então a classe é 'TfrmTFL' O Delphi sempre coloca um T na frente, única maneira de colocar classe própria é dando um override no CreateParams... abrs
  14. Opa Fora que também é um componente que voce poderia utilizar em outros sistemas, ao menos acredito eu pois ao comprar a licença do componente voce tem direito de usá-la quantas vezes quiser... Sendo assim, maiores são as vantagens mesmo... abrs
  15. Opa Para preencher os documentos que você quer no Combobox da uma olhada neste tópico depois no clique no Combobox você pode usar tanto WinExec como ShellExecute, da uma olhada neste tópico. abraços
  16. Churc

    inputbox

    Opa Acho que o ideal é voce criar um form, ou melhor, uma janela que voce possa simular um InputBox mas ainda melhor, onde voce possa resolver todos estes problemas... Saberia como fazer isto? abraço
  17. Opa Faz o Seguinte, edite a imagem no Photoshop por exemplo e apague o fundo, deixe o fundo da imagem transparente... 0,0,0 depois coloque a propriedade do TImage para Transparent := True e pronto problema resolvido pois o fundo da imagem não dependerá mais da cor do form... Lembrando que, o form se voce deixar o fundo na cor clBtnFace o Delphi vai fazer com que o fundo do Form seja pego automaticamente pela cor de fundo no tema do Windows... então o que voce poderia fazer também é trocar a cor de fundo do form para o mesmo da imagem... mass a primeira opção acho mais conveniente hehe abraços
  18. Opa Maravilha :D nunca passei por isso mas espero que ajude aos que estao passando... abraçs
  19. Opa Seguinte, isto é possível sim e a maioria dos Servidores de hospedagem permitem o acesso ao Banco remotamente, como exemplo lá na empresa usamos o sistema de gerenciamento assim, o banco de dados é MySQL e fica no servidor de hospedagem, o que faz com que, tendo o programa cliente de gerenciamento não importa aonde voce esteja no mundo que voce conseguirá ter acesso, basta ter uma conexão com a Internet rs Exemplo de BD MySQL em um servidor: xmysql.dominio.com Agora seguinte, primeiro de tudo voce vai precisar de um componente para acesso ao BD e um BD em um servidor que permita acesso remoto, exemplo, Hostnet, Minas Online. Como componente eu recomendo o pacote Zeos, é freeware, é completo e tem muito conteúdo na web pra você aprender a mexer e é muito simples e fácil de usar, depois só basta saber SQL. Bom, conectando ao BD no Servidor, o resto é com você no SQL, normal como se você estivesse fazendo o mesmo no PC local. Procure no Google por algo como Delphi Zeos você vai encontrar tudo que precisa e ah o site oficial do componente é Zeoslib Faça download do ZeosDBO (Zeos Database Objects) abraços
  20. Opa Baseado na função que o Jhonas lhe passou ficaria assim... function FormatMinToHMS(Minutos: LongInt): string; // Converte um certo número de minutos em horas // já formatada var Hrs, Min: Word; dtTime: TTime; begin Hrs := Minutos div 60; Min := Minutos mod 60; dtTime := EncodeTime(Hrs, Min, 0, 0); Result := FormatDateTime('hh:mm', dtTime); end; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := FormatMinToHMS(strtoint(Edit1.Text)); end; abraços
  21. Opa Como assim ponteiro de método? Ah várias maneiras de interpretar isso rs O que voce está querendo fazer, ou melhor, ao que você se refere... abrs
  22. esse é o cara!

    haha

    :D

  23. Opa Seguinte, falta o Delimitador de Caminho de arquivos "\" Então a função está retornando assim exemplo "C:\WINDOWS" Quando voce chama a função CopyFile, você está passando a ela isso "C:\WINDOWSMinhaAplicacao.exe Ou seja, faltou a "\", resumindo o que eu sempre uso, é uma rotina que fica em SysUtils que "insere" a barra caso não haja então ficaria assim function ExtractWindowsDir : string; var Buffer : array[0..144] of Char; begin GetWindowsDirectory(Buffer,144); Result := IncludeTrailingPathDelimiter(StrPas(Buffer)); end; Então ao chamar a funcao ExtractWindowsDir agora vai retornar "C:\WINDOWS\" E na função CopyFile você deve passar os 2 caminhos completos, e não apenas parte deles exceto se o arquivo a ser copiado está no mesmo caminho do qual está fazendo a cópia... exemplo CopyFile(a, b, c); a = Caminho e nome do arquivo b = Caminho e nome para onde ele vai c = Se voce colocar False, então se o arquivo já existir ele sobreescreve, se voce colocar True, ele não vai sobreescrever.... Então ficaria... somente como exemplo, adapte as suas necessidades... procedure TForm1.Button1Click(Sender: TObject); begin if CopyFile(Pchar(Application.ExeName), Pchar(ExtractWindowsDir + Application.ExeName), False) then Showmessage('copiado') else Showmessage('não copiou'); end; abraço
  24. Churc

    Keylooger

    Opa Olha seu tópico é muito suspeito (: então vou fechar, acho que se você quer mesmo construir isso, então una tudo que você precisa e aprenda a fazer ao menos você vai ser digno do que está fazendo falouu
  25. Opa Eu costumo utilizar o Firebird e MySQL... MySQL normalmente quando uso servidores de hospedagem online para armazenar os dados e Firebird quando usado localmente ou em rede... Mas muito raro mesmo eu usar banco de dados, de vez em nunca... chego até esquecer rs Quanto a conexão utilizo a Zeoslib... abraço
×
×
  • Criar Novo...