Jump to content

Search the Community

Showing results for tags 'lazarus'.

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Comunidade
    • Sugestões, Críticas ou Dúvidas relativas ao P@P
    • Acerca do P@P
  • Comunidade a Trabalhar
    • Apresentação de Projectos de Programação
    • Downloads
    • Revista PROGRAMAR
  • Desenvolvimento Geral
    • C
    • C++
    • Java
    • Pascal
    • Python
    • Bases de Dados
    • Dispositivos Móveis
    • Outras Linguagens
  • Desenvolvimento Orientado para Web
    • PHP
    • HTML
    • CSS
    • Javascript
    • Outras Linguagens de WebDevelopment
    • Desenvolvimento Web
  • Desenvolvimento .NET
    • C#
    • Visual Basic .NET
    • ASP.NET
    • WPF & SilverLight
  • Software e Sistemas Operativos
    • Software de Produtividade
    • Sistemas Operativos
    • Apresentação de Software
  • Informática
    • Interfaces Visuais
    • Computação Gráfica
    • Algoritmia e Lógica
    • Segurança e Redes
    • Hardware
    • Electrónica e Automação Industrial
    • Matemática
    • Software de Contabilidade, Finanças e Admin. Pública
    • Dúvidas e Discussão de Programação
    • Tutoriais
    • Snippets / Armazém de Código
  • Outras Áreas
    • Notícias de Tecnologia
    • Dúvidas Gerais
    • Discussão Geral
    • Eventos
    • Anúncios de Emprego
  • Arquivo Morto
    • Projectos Descontinuados
    • System Empires

Blogs

  • Blog dos Moderadores
  • Eventos
  • Notícias de Tecnologia
  • Blog do Staff
  • Revista PROGRAMAR
  • Projectos
  • Wiki

Categories

  • Revista PROGRAMAR
  • Tutoriais
  • Textos Académicos
  • Exercícios Académicos
    • Exercícios c/ Solução
    • Exercícios s/ Solução
  • Bibliotecas e Aplicações
  • Outros

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website


GitHub


LinkedIn


Twitter


Facebook

Found 25 results

  1. Prezados, Alguém poderia me ajudar solucionar um problema creio de charset/collate? Estou usando Lazarus 226/MariaDB 11.2 via ZEOS 7.2.14-release No TZConnection: conexao.Properties.Add('codepage=UTF8') conexao.Properties.Add('Dialect=3') No MariaDB: utf8mb4_general_ci No entanto os caracteres aparecem como escrevo, corretos e com acentuação, nos DBEdits mas desconfigurados no banco. Já tentei várias combinações e não estou tendo sucesso. Não sou analista ou programador, estou usando a programação como um recurso terapêutico e muito está me ajudando. No entanto estou travado neste problema. Agradeço desde já, e fico feliz por conhecer a pouco este fórum.
  2. Boa tarte a todos, estou criando um componente composto, ele consiste de um painel com 2 botões, 2 rótulos e três shapes. Porém, quando crio ele no inspetor de objetos, aparece somente o o evento onclick refente ao componente como um todo. Gostaria que aparece nos eventos algo tipo: OnClickBotaoEsquerda e OnClickBotaoDireita, tenho o código parcial, se poderem ajudar agradeço. unit PanelEstacaoMotor; {$mode ObjFPC}{$H+} interface uses Classes, SysUtils,extctrls,StdCtrls,Graphics; type { TPanelEstacaoMotor } TPanelEstacaoMotor = Class(TPanel) private Bdesliga : Tbutton; BLiga : Tbutton; FDescriInferior: string; FDescriSuperior: string; LDesligado:Tshape; LLigado :Tshape; LFalha :Tshape; Pisca : Ttimer; Nome : Tlabel; NomeS : Tlabel; procedure SetDescriInferior(AValue: string); procedure SetDescriSuperior(AValue: string); public constructor Create(TheOwner: TComponent); override; destructor Destroy; override; procedure Paint; override; Function Tamanho(Texto:String; Fonte:TFont) : integer; published property DescriSuperior : string read FDescriSuperior write SetDescriSuperior; property DescriInferior : string read FDescriInferior write SetDescriInferior; end; procedure Register; implementation { TPanelEstacaoMotor } procedure Register; begin RegisterComponents('Fabricio', [TPanelEstacaoMotor]); end; Function TPanelEstacaoMotor.Tamanho(Texto:String; Fonte:TFont) : integer; var LBmp: TBitmap; begin LBmp := TBitmap.Create; try LBmp.Canvas.Font := Font; Result := LBmp.Canvas.TextWidth(Texto); finally LBmp.Free; end; end; procedure TPanelEstacaoMotor.SetDescriInferior(AValue: string); begin if FDescriInferior=AValue then Exit; FDescriInferior:=AValue; Nome.Left:=round((120-Tamanho(Avalue,Nome.Font))/2); Nome.Caption:=AValue; end; procedure TPanelEstacaoMotor.SetDescriSuperior(AValue: string); begin if FDescriSuperior=AValue then Exit; FDescriSuperior:=AValue; NomeS.Caption:=AValue; NomeS.Left:=round((120-Tamanho(Avalue,NomeS.Font))/2); NomeS.Caption:=AValue; end; constructor TPanelEstacaoMotor.Create(TheOwner: TComponent); begin inherited Create(TheOwner); Caption:=''; Color:=$00808040; Width:=120; Height:=60; Top:=50;; Left:=50; Bdesliga:= Tbutton.Create(nil); Bdesliga.parent:=self; Bdesliga.Color:=8; Bdesliga.Width:=20; Bdesliga.Height:=20; Bdesliga.Top:=40;; Bdesliga.Left:=0; Bdesliga.Caption:=''; BLiga:= Tbutton.Create(nil); BLiga.parent:=self; BLiga.Color:=8; BLiga.Width:=20; BLiga.Height:=20; BLiga.Top:=40;; BLiga.Left:=99; Bliga.Caption:=''; Nome:= Tlabel.Create(nil); Nome.Parent:=self; Nome.Caption:='Motor'; Nome.Top:=27;; Nome.Left:=4; NomeS:= Tlabel.Create(nil); NomeS.Parent:=self; NomeS.Caption:='Motor'; NomeS.Top:=17;; NomeS.Left:=4; Pisca:=Ttimer.create(nil); LDesligado:=Tshape.create(nil); LDesligado.parent:=self; LDesligado.Color:=8; LDesligado.Width:=18; LDesligado.Height:=18; LDesligado.Top:=1;; LDesligado.Left:=2; LDesligado.Brush.Color:=clGray; LFalha:=Tshape.create(nil); LFalha.parent:=self; LFalha.Color:=8; LFalha.Width:=18; LFalha.Height:=18; LFalha.Top:=1;; LFalha.Left:=50; LFalha.Brush.Color:=clMenuBar; LFalha.Shape:=stCircle; LLigado:=Tshape.create(nil); LLigado.parent:=self; LLigado.Color:=8; LLigado.Width:=18; LLigado.Height:=18; LLigado.Top:=1; LLigado.Left:=101; LLigado.Brush.Color:=clMenuBar; end; destructor TPanelEstacaoMotor.Destroy; begin inherited Destroy; Bdesliga.Destroy; BLiga.Destroy; LLigado.Destroy; LDesligado.Destroy; LFalha.Destroy; Pisca.Destroy; end; procedure TPanelEstacaoMotor.Paint; begin inherited Paint; end; end.
  3. Caros, boa tarde. Tenho feito um relatório que inclui Códigos QR, utilizo o LazReport com frBarCode2d1 e frTNPDFExport1. O assunto é que o relatório na tela e se mando a imprimir diretamente fica todo "ok-ótimo", mas se envio o reporte para PDF não insere os códigos QR, o resto se fica todo bem. Alguma ideia ou dica??
  4. Caros, estou apresentar problemas ao instalar a última versão de Lazarus 2.2. Eu tenha instalada a versão anterior 2.0.12 e trabalhava lindamente, ao instalar anteriormente corria bem todo e iniciava a IDE sem dificuldades. Agora, depois de instalar a versão 2.2 e executo pela primeira vez me pede para configurar o ficheiro fppkg.cfg, se seleciono criar por defeito continuo, mas na hora de compilar aplicações fica bloqueado ou não faz nada. Que solução poderia ter este problema? Alguma dica? Cumprimentos.
  5. Olá amigos, preciso instalar o OnGuard no Lazarus 2.0.6 e não estou conseguindo, se puderem me explicar o passo-a-passo vos agradeço muito. #EternamentePascal
  6. Boa noite comunidade, Preciso do vosso aconselhamento e sugestões. Sou um programador "da velha guarda" iniciei como muitos da minha geração em Cobol, RPGII e claro VB, posteriormente por motivos profissionais migrei para o Delphi quando este ia na versão 5 e desenvolvi sobre o mesmo ate á versão 2005. O Delphi contava com uma comunidade muito limitada em Portugal mas estava amplamente instalado em alguns paises europeus e sobretudo no Brasil. Posteriormente desenvolvi alguns "pequenos projetos" em VB, VB.NET e PHP. Atualmente por necessidades especificas tenho um grande projeto em mãos com base na migração de uma aplicação industrial que corre em DOS e feita em CLIPPER, provavelmente poucos de vos ou nenhuns se recordarão desta linguagem. Concluindo, pensei em retomar o desenvolvimento Delphi mas fiquei surpreendido ao constatar que a comunidade existente praticamente desapareceu ou parou no tempo. Continuo a encontrar alguns desenvolvimentos e forums mas basicamente está tudo parado no Delphi 7 e sem atividade. Vejo que o que está na "moda" atualmente é o C#, mas não sei se justifica entrar numa nova linguagem, que me aconselham? Abraço comuniadade
  7. Olá galera. Estou a apresentar problemas ao tentar abrir a minha gaveta de dinheiro pela aplicação "Lazarus", eu utilizo uma impressora fiscal de talão USB e já tentei abrir de varias formas diferentes e não consigo, alias, para Lazarus em google com porta USB não encontro nada. Já fiz testes colocando diretamente na impressora no comando antes de imprimir e trabalha lindamente abrindo a gaveta mas preciso administrar isso pela aplicação e não mandar aos clientes a ter que mexer na impressora. Alguma dica por favor??? Cumprimentos....
  8. Olá galera. Me esta a acontecer o seguinte. Tenho uma app já desenvolvida e em "produção" desde a versão 1.6 de Lazarus, até lá todo bém. Resulta que a semana anterior fiz upgrade da versão 1.8 para a 2.00 de Lazarus e todo perfeito, mas a principio de semana quando os clientes começarem a explorar o sistema inicio-se a catástrofe. Quando vou a gravar una transacção que inclui mais duna sentencia SQL o sistema compilado com a versão 2.00 me da um erro e antes não, isso sem cambiar uma linha de código. Sublinho que isto não sucedia antes. Fazendo um "debugger" (depurando o sistema) tomo las sentencias SQL para PostgreSQL que dá erro desde o sistema e a modo de exemplo: UPDATE app.a_arbol SET cod='00096',descrip='MTCV' WHERE id=5200; UPDATE app.a_pt SET longitud=-23.491440000000,latitud=14.919906000000,control_ip=0,circuito_comando=True,comentario='', potencianominal=20.0,tipofornecimento=1,estado=True WHERE idarbol=5200; as coloco no analisador de consultas do pgadmin de Postgres e correm perfeitamente mas se executo esta mesma sentencia desde o programa me da o error anterior. E, o erro no sucede solo com estas sentencias, sino sempre que envio para PostgreSQL mas de una como por exemplo quando desejo eliminar registos de tabelas pais e filha, ou também quando desejo INSERTAR mais dum registo numa tabela e assim..... Busque em outros forum mas a única coisa que vi é a sugestão para fazer transacções sentencia a sentencia mas se necessito por exemplo carregar uma tabela com 1000 registo resulta menos custoso em termos de tempo preparar uma query com todas as linhas e depois enviar que não ficar a enviar linha a linha. Assim fazia em versões anteriores a 2.00 de Lazarus sem dificuldades. Alguem sabe si para la versión esta de Lazarus 2.00 y Zeos 7.2.4 existe algum parâmetro o propriedade nova que permita fazer/definir transacciones simples o complexas com múltiplas sentencia?. Cumprimentos. Alfonso Arias Lemas
  9. Bom dia amigos, mais uma vez venho solicitar sua experiência e conhecimento para decifrar um enigma. Estou criando um cadastro em Lazarus 1.8.4 - Firebird 3.5 - FlameRobin 0.9.2, e preciso criar um código automaticamente ao salvar um novo cadastro. Por favor sou estudante e peço a ajuda de quem puder contribuir. Obrigado.
  10. Bom dia Fórum. Trabalho com Lazarus. Estou a precisar abrir uma página web dentro dum formulário. Tentei com alguns componentes mas de jeito nenhum consigo mostrar a URL. Alguma dica por favor..... Cumprimentos, Alfonso Lemas
  11. Boas pessoal. Estou a fazer um trabalho envolvendo o problema do caixeiro viajante. Este problema consiste em determinar a menor rota para percorrer uma série de cidades (visitando uma única vez cada uma delas), retornando à cidade de origem. Primeiro fiz a minha matriz de forma manual e aleatoria. Eu já tenho boa parte do programa feito mas agora falta o mais dificil que é fazer o caminho mais curto, por exemplo temos 5 cidades e partimos da cidade1 voltando à mesma mas fazendo o percurso no menor trajeto possível, ou seja pretendo fazer vários trajetos fazendo swaps e depois identificar qual o mais curto. Será que poderiam dar uma dica para tentar fazer essa parte? Muito obrigado, deixo aqui parte do meu código feito. Program TrabalhoProgramacao; //Nome do Programa Uses Crt; const MAXCID = 25; //Constantes: constante do máximo de cidades type matriz = array[1..MAXCID, 1..MAXCID] of integer; var Opcao, numCidade : Integer; sair : boolean; distancias : matriz; function LerCidades( var n : integer ) : Boolean; // função para a leitura das cidades begin writeln('Indique o numero de cidades ( maximo ', MAXCID, ' cidades:):'); // Indicação do número de cidades readln(n); if (n <= MAXCID) then LerCidades := true // Lê o número introduzido else writeln('Introduziu mais que 25 cidades! Tente novamente!'); LerCidades := false; readln; // Se o número de cidades for maior que 25 não executa end; procedure LimparMatriz( var distMatriz : matriz; nCidades : integer); // procedimento para limpeza da matriz var x, y : integer; begin for x := 1 to nCidades do begin for y := 1 to nCidades do begin distMatriz[x][y] := 0; end; end; end; procedure EscreverMatriz( var distMatriz : matriz; nCidades : integer); // procedimento para a escrita da matriz var x, y : integer; begin for x := 1 to nCidades do begin writeln; for y := 1 to nCidades do begin write( distMatriz[x][y]:2 ); end; end; end; //Introduzir as distâncias procedure PreencherManualMatriz( var distMatriz : matriz; nCidades : integer); // procedimento para preenchimento da matriz de forma MANUAL var x, y : integer; begin writeln(' ************************************************************'); writeln(' Atencao: distancias entre mesmas cidades e 0!'); writeln(' ************************************************************'); for x := 1 to (nCidades - 1) do begin writeln; for y := (x + 1) to nCidades do begin if x <> y then begin writeln('Introduza a distancia entre ', x , ' e ', y); readln(distMatriz[x][y]); distMatriz[y][x] := distMatriz[x][y]; end; end; end; EscreverMatriz(distancias, numCidade); readln; end; procedure PreencherRandomMatriz( var distMatriz : matriz; nCidades : integer); // procedimento para preenchimento da matriz de forma ALEATÓRIA var x, y : integer; begin writeln(' *********************************************'); writeln(' Atencao: distancias entre mesmas cidades e 0!'); writeln(' *********************************************'); for x := 1 to (nCidades - 1) do begin writeln; for y := (x + 1) to nCidades do begin begin distMatriz[x][y] :=random(9); // exemplo ate 9 quilometros de distancia distMatriz[y][x] := distMatriz[x][y]; end; end; end; EscreverMatriz(distancias, numCidade); readln; end; Begin // COMEÇO DO PROGRAMA sair := false; while sair = false do begin clrscr; writeln(' opcao 1 : Ler as cidades');write(''); writeln(' opcao 2 : Escrever matriz'); (' opcao 3 : Preencher matriz manualmente'); writeln(' opcao 4 : Preencher matriz aleatoriamente'); writeln(' opcao 5 : Sair'); readln(opcao); writeln; Case Opcao of 1 : LerCidades(numCidade); 2 : EscreverMatriz(distancias, numCidade); 3 : PreencherManualMatriz(distancias, numCidade); 4 : PreencherRandomMatriz(distancias, numCidade); 5 : sair := true; else begin writeln('Opcao invalida! Tente novamente!'); writeln; readln; end; end; end; end
  12. BHAMF

    Pastas Pascal

    Queria saber como faço para criar pastas em Pascal, alguém aí sabe algo sobre? Estou à espera de respostas. Obrigado desde já 🙂
  13. Olá, conheço o P@P a algum tempo, porém não tinha criado minha conta, sempre quis responder algumas pessoas mas também tenho minhas dúvidas, a minha dúvida é a seguinte, estou criando um Software cujo o nome é Lipïïnn Program ©, nele tem uma procedure chamada, janela1, e nesta janela1 certamente abre uma janela (feita em códigos ASCII claro) e nesta janela tem dois readkeys no caso deveria ter só um, mas se eu colocar só um ele confunde tecla com letra, como faço pra resolver isso? Obrigado desde já! procedure janela1; var ATUAL : INTEGER; Construtor_de_janela : integer; tecla : char; begin gotoxy(20,5); for Construtor_de_janela := 1 to 30 do begin gotoxy(Construtor_de_janela + 20,5); write(#219); end; for Construtor_de_janela := 1 to 10 do begin gotoxy(50,Construtor_de_janela + 5); write(#219); end; for Construtor_de_janela := 1 to 30 do begin gotoxy(Construtor_de_janela + 20,15); write(#219); end; for Construtor_de_janela := 1 to 11 do begin gotoxy(20,Construtor_de_janela + 4); write(#219); end; window(21,6, 49,14); textbackground(blue); //29 colunas, 9 linhas clrscr; gotoxy(2,2); write('Janela de pausa'); gotoxy(2,3); write('Escolha uma opcao'); gotoxy(2,4); write('com as teclas de seta'); gotoxy(2,5); WRITE('Nao aperte outra tecla '); gotoxy(2,6); WRITE('A nao ser as de seta e ENTER (bug) '); cursoroff; window(38,13, 46,13); textbackground(blue); write('Desligar'); gotoxy(3,9); window(25,13, 34,13); textbackground(white); textcolor(red); write('Continuar'); tecla := readkey; tecla := readkey; repeat case tecla of #75 : begin //Seta esquerda //#75 // #37 window(25,13, 34,13); textbackground(white); textcolor(red); write('Continuar'); window(38,13, 46,13); textbackground(blue); write('Desligar'); tecla := readkey; tecla := readkey; atual := 1; cursoroff; end; {else gotoxy(2,6); window(21,6, 49,14); write('Incorrect Information'); delay(500); janela1;} end; {if (tecla = #77) then begin} case tecla of #77 : begin //Seta direita //#77 // #39 window(25,13, 34,13); textbackground(blue); textcolor(red); write('Continuar'); window(38,13, 46,13); textbackground(white); write('Desligar'); tecla := readkey; tecla := readkey; atual := 2; cursoroff; end; {else window(21,6, 49,14); gotoxy(2,6); delay(500); write('Incorrect Information'); janela1;} end; until(tecla = #13); case tecla of #13 : begin if (atual = 1) then begin clrscr; window(1,1, 80,1); textbackground(lightcyan); highvideo; clrscr; window(1,1, 80,25); gotoxy(2,2); textcolor(lightblue); textbackground(black); cursoron; piboaritiboyet3; end; if atual = 2 then begin clrscr; halt; end; end; end; end;
  14. Boas, alguém me consegue explicar como usar Sockets no lazarus, é que estou a dar essa matéria na escola e não consigo arranjar maneira de usar os sockets no lazarus.
  15. Boas people dado a falta de tempo, peço aqui ajuda passo a explicar vou iniciar-me em lazarus Fiquei encantado com o facto de ser em tudo semelhante a VB6 (A minha antiga linguagem de programação) visualmente. em VB6 cada vez que voltava a programar tinha 2 dossiers com os códigos base, tudo estruturado e tal e queria fazer o mesmo com o lazarus Então: 1º Que linguagem o lazarus usa? delphi ou pascal? ainda não entendi bem 2º Links para manuais / tutoriais com o básico do código (if then, while, declarar variaveis, uso de pontuação e afins) O que pretendo é o básico mesmo, não quero manuais que ensinam a trabalhar com a parte gráfica, o que aprendo sozinho em meia hora O meu post original: http://www.portugal-a-programar.pt/topic/64437-apresenta-se-rodrigo-o-noob/ Como podem vir já pedi ajuda à 1 mês mas a trabalhar agora estou mesmo com falta de tempo e tenho que fazer o programa que era para maio até dia 20 do próximo mês... Obrigado desde já UPDATE: http://code-sd.com/startprog/StartProgUsingPascal.pdf Manual com o básico e o essencial
  16. Pessoal, boa tarde! Sou aqui do Brasil e gostaria de saber se alguém pode me ajudar na seguinte questão, preciso enviar e-mails com o Lazarus e não tenho a mínima ideia de como fazer. achei somente em Portugal um site de fórum de Lazarus. Conto com a ajuda de alguém. Abraços Ricardo Bresciani Brasil
  17. Eu tenho que baixar o MYSQL? como acesso ? Com eu conecto este tipo de Banco ao Programa para consulta e alterar um nome de funcionário?
  18. Eu preciso fazer em um form fazer um calculo assim : PreçoLiquido= PreçoBruto- Desconto. Todos os campos estão no mesmo formulario. Onde eu faço essas operações. Se alguem puder dar um esxemplo almenos parecido agradeço.
  19. caros, estou com esta questão - Como deixar um TEdit com formato dd/mm/aa (p/ data de nascimento) em Lazarus. Depois calcular a idade que vai pra um outro formulario...
  20. Boa tarde, Estou com um problema no lazarus 1.0.8 no Ubuntu 13.04 que não dá para guardar os projectos.
  21. “DLL Hell” Uma expressão muito usada, e nada incentivadora para o programador que pensa nas DLL’s (Dynamic Link Librarys) pela primeira vez. Ou se ama ou se odeia, este tipo de recurso. Há quem não abdique, há quem nem queira ouvir falar. No caso destes últimos, é geralmente porque não compreendem como as construir e como as usar. Antes de mais, algumas vantagens das DLL’s, que deverão ser suficientemente apelativas para que se pelo menos pondere o seu uso: - Se tivermos vários programas a correr que usem código partilhado, o uso de DLL’s permite poupar recursos, uma vez que apenas uma instância dessa DLL é necessária para ser usada por todos esses programas. - Como as DLL’s são pré-compiladas, podemos criar código numa linguagem e usá-lo noutra. Logo que os tipos de dados usados existam em ambas as linguagens, não haverá problema. - Há no Delphi dois métodos possíveis de carregar uma DLL: Carregamento Estática ou Dinâmico. No caso do carregamento dinâmico, os recursos ocupados pela DLL só serão usados durante o seu uso efectivo, e não durante toda a execução do programa principal. Como de costume, o Delphi/Lazarus tem a solução simples para que estes úteis recursos possam ser usados por todos. library TesteDLLLazarus; Function Area(Tipo:Byte;a,b:Real):Real; StdCall; Export; const aTrianguloRect=1; aQuadrado=2; begin case Tipo of aTrianguloRect:Result:=a*b/2; aQuadrado:Result:=a*b; end; end; Function Hipotenusa(a,b:Real):Real; StdCall; Export; begin Result:=Sqrt(Sqr(a)+Sqr(b)); end; Exports Area, Hipotenusa index 2; begin end. Começando do topo, a palavra-chave Library indica que se trata de uma DLL. Segue-se o código das funções e procedimentos desejados. Apenas duas particularidades: A palavra-chave Export marca a função como exportável. Isto significa que poderá ser usada externamente, a partir de uma aplicação que use a DLL. Caso se trate de uma função meramente interna, para uso de outras dentro da DLL, não é necessário usar a palavra Export. A palavra StdCall indica qual a Calling Convention (a ordem de passagem dos parâmetros de e para a DLL e a forma como é gerida a memória por eles usada) a usar para a função. Existem várias Calling Conventions, sendo as mais comuns, as seguintes: - Register -> Predefinição do Delphi - StdCall -> Predefinição da API do Windows - CdEcl -> Predefinição do C/C++ Não é por demais importante qual é usada, desde que seja a mesma tanto na DLL como na aplicação que a vai usar. Não é obrigatório definir uma Calling Convention, sendo que se nenhuma for especificada, a Register será usada. A palavra-chave Exports serve para exportar as funções a que queremos permitir acesso externo. Basta indicar à sua frente o nome dessas funções, separados por virgulas. A palavra-chave Index é opcional. Usa-se apenas se quisermos atribuir um índice numérico à função ou procedimento. Para tal, basta coloca-la entre o nome da função e o seu índice, como é mostrado no exemplo. E aí está, simples como é hábito nas linguagens da família Pascal. Falta no entanto, neste pequeno piscar de olho às DLL’s, o método de usar as DLL’s criadas. Como referido, o Delphi apresenta dois métodos distintos para usar as funções existentes em DLL’s: Estático e Dinâmico. O método estático é o mais simples… E mais simples é impossível. Function Area(Tipo:Byte;a,b:Real):Real; External ‘TesteDLLLazarus.dll’; Function Hipotenusa(a,b:Real):Real; StdCall; Export; External ‘TesteDLLLazarus.dll’ index 2; Realmente, nada mais simples do que criar a declaração da função, e colocar à frente o nome da DLL onde a rotina está alojada, através da palavra-chave External. Simples e intuito. Mais uma vez, a palavra Index é opcional, e representa o índice numérico que atribuímos na DLL. Uma vez declaradas desta forma, basta usar as funções e procedimentos, como se de uma rotina local se tratasse. Neste método, a DLL é carregada quando o programa é iniciado e libertada quando o programa termina. O segundo método é efectivamente mais complexo. Serve para carregar a DLL apenas quando alguma função é realmente necessária e libertá-la logo de seguinda, poupando recursos do sistema. Ainda assim, não é de difícil compreensão: interface type Area = Function (Tipo:Byte;a,b:Real):Real; function LArea(Tipo:Byte;a,b:Real):Real; implementation function LArea(Tipo:Byte;a,b:Real):Real; var Handle : THandle; begin Handle:=LoadLibrary (‘TesteDLLLazarus.dll’); if Handle <> 0 then begin @Area:=GetProcAddress (Handle, ‘Area’); if @Area <> nil then Result := Area (Tipo,a,b); FreeLibrary (Handle); end; end; Começa-se por definir uma função dinâmica, na secção Interface. Esta será usada mais à frente, quando chamar-mos a DLL. De seguida, declaramos uma função local. Esta é opcional, o seu conteúdo pode ser inserido directamente na secção de código onde precisamos dos resultados da função da DLL. Para efeitos meramente exemplificativos, foi esta a opção escolhida. Avançando para a secção implementation, fazemos a implementação da função local declarada. Precisamos de uma variável do tipo THandle para lidar com a DLL. A esta variável, vamos atribuir a localização da DLL usando o procedimento LoadLibrary. Se o resultado for 0, não foi possível carregar a DLL. De contrário vamos atribuir à função dinâmica declarada em cima o endereço de memória da função da DLL que queremos usar, e se o resultado não for nil (o que significaria que a função especificada não foi encontrada na DLL), podemos executar a função da DLL simplesmente chamando a nossa função dinâmica. Por fim, chamamos o procedimento FreeLibrary para libertar a DLL da memória. Ainda que um pouco mais complexo do que a chamada estática da DLL, esta chamada dinâmica é, como se vê, ainda assim muito simples. Quanto ao “DLL Hell” de que tanto se fala, basta que se guarde as DLL’s na pasta da aplicação que a vai usar… Para quê complicar? 😉 Outras considerações sobre DLL’s: - O tipo de dados String não é tratado pelo Delphi da mesma forma que a maioria das restantes linguagens. Muitas usam ponteiros para arrays para guardar dados alfanuméricos, outras apenas suportam 256 bytes nas strings. Assim, se houver a intenção de usar a DLL com programas criados noutras linguagens, é recomendado o uso do tipo ShortString ou PChar em vez do tipo String. - Ao criar uma DLL, convém verificar exaustivamente a existência de potenciais erros de programação (como sempre, aliás). Um erro numa DLL não tratado poderá ser um pesadelo de detectar no programa principal.
  22. Estava nas minhas pesquisas sobre pascal e encontrei isto no site do free pascal Galeria de aplicações feitas em pascal e lazarus http://wiki.freepascal.org/Lazarus_Application_Gallery Aplicações, jogos, utilitários, etc feitos em pascal e lazarus http://wiki.freepascal.org/Projects_using_Lazarus http://wiki.freepascal.org/FPC_Applications/Projects_Gallery Se estiverem à procura de algum projecto em pascal, tem nesses sites de tudo. Ps: As pessoas que falam mal do pascal e/ou dizem que o pascal não serve para nada, deem uma vista de olhos nesses sites.
  23. Olá a todos. Instalei o lazarus 1.0.6 no meu ubuntu 12.10 e tudo muito bem. Escrevo o programa e compilo tudo ok, gravo tudo ok mas quando volto a abrir o projecto aparece a seguinte mensagem: Alguem sabe como resolver este problema?
  24. Alguem sabe a maneira mais facil (apesar de ja ser programaçao media-alta) de criar? eu ate pedia para Delphi (ou outra POO Object Pascal , mas ja se arranjarem algo tipo c# ou vb e me explicarem +- talves seja suficiente) Ja encontrei alguns pontos de partida, mas gostava de saber se alguem ja tinha usado isso, e se me podia simplificar e clarificar o codigo... isto é algo que ja andava para tentar a fazer a uns bons tempos, mas nem sequer sabia o termo correcto (ao que parece, deskband) é fazer algo como o windows media player tinha no windows xp e vista, de o controlar pela taskbar... sei que nao é recomendado no windows seven e nas versoes futuras poderá ser efectivamente descontinuado, mas ainda assim queria tentar... do que encontrei de informaçoes sobre isto, foram nestas fontes: http://delphi-notes.blogspot.pt/2005/12/deskbands-with-delphi.html http://social.msdn.microsoft.com/Forums/ar-SA/Vsexpressvb/thread/7b799b8a-888b-47f2-b20f-6f9ab969cfba http://www.codeproject.com/Articles/6741/AppBar-using-C http://www.codeproject.com/Articles/2219/Extending-Explorer-with-Band-Objects-using-NET-and http://codecentral.embarcadero.com/Item/23879 Codigos em vb e c#, ainda talves consiga reimplementar isso em linguagem delphi, se alguem poder dar uma ajuda a entender toda a estrutura, que ficheiros sao necessarios e onde os arrnjar... Uma duvida que eu fiquei, é se seria nessesario algum windows sdk... Aguardo respostas 😄 (ps: nao sei se será o topico mais certo, uma vez que peço algo generico, embora o que eu queira mesmo é algo concebivel em delphi se possivel, mas como disse, se for em c# e vb talves, explicando.me, consiga entender)
  25. Peço a colaboração de interessados em correr o código abaixo para verificar o seu correcto funcionamento. O código deve detectar o tamanho de linha do cache L1 do processador. Interessa-me testar em máquinas com processador de Intel PIII para cima e do AMD Athlon para cima. Basta que compilem o código e postem aqui o resultado da execução, junto com a marca e modelo do processador da máquina. O código deve compilar tanto em Delphi como em Lazarus, tanto em Windows como em Linux. É um programa de consola (para ser executado na linha de comandos). Caso este pedido seja contra as regras, as minhas desculpas. Quem quiser usar este código está à vontade. program Cache_CPUID; {$APPTYPE CONSOLE} uses SysUtils; type Registers = record _eax_ : cardinal; _ebx_ : cardinal; _ecx_ : cardinal; _edx_ : cardinal; end; procedure CPUID(var regs : Registers); begin asm push esi push ebx push ecx push edx mov esi, regs mov eax, Registers(esi).&_eax_ mov ebx, Registers(esi).&_ebx_ mov ecx, Registers(esi).&_ecx_ mov edx, Registers(esi).&_edx_ db $0F,$A2 { CPUID } mov Registers(esi).&_edx_, edx mov Registers(esi).&_ecx_, ecx mov Registers(esi).&_ebx_, ebx mov Registers(esi).&_eax_, eax pop edx pop ecx pop ebx pop esi end; end; const AMDProcessor = 1143; IntelProcessor = 1223; var size : cardinal; regs : Registers; maker : cardinal; begin { Default } size := 64; { Get the manufacturer code (1223 for Intel, 1143 for AMD) } regs._eax_ := 0; CPUID(regs); maker := regs._ebx_ and $000000FF + regs._ecx_ and $000000FF + regs._edx_ and $000000FF; regs._ebx_ := regs._ebx_ shr 8; regs._ecx_ := regs._ecx_ shr 8; regs._edx_ := regs._edx_ shr 8; maker := maker + regs._ebx_ and $000000FF + regs._ecx_ and $000000FF + regs._edx_ and $000000FF; regs._ebx_ := regs._ebx_ shr 8; regs._ecx_ := regs._ecx_ shr 8; regs._edx_ := regs._edx_ shr 8; maker := maker + regs._ebx_ and $000000FF + regs._ecx_ and $000000FF + regs._edx_ and $000000FF; regs._ebx_ := regs._ebx_ shr 8; regs._ecx_ := regs._ecx_ shr 8; regs._edx_ := regs._edx_ shr 8; maker := maker + regs._ebx_ and $000000FF + regs._ecx_ and $000000FF + regs._edx_ and $000000FF; regs._ebx_ := regs._ebx_ shr 8; regs._ecx_ := regs._ecx_ shr 8; regs._edx_ := regs._edx_ shr 8; { For AMD } case maker of AMDProcessor : begin writeln('Processador AMD'); { Check for support of the extended function $5 } regs._eax_ := $80000000; CPUID(regs); if regs._eax_ >= $80000005 then begin writeln('Usando a funcao 8000 0005'); { Call the function } regs._eax_ := $80000005; CPUID(regs); size := regs._ecx_ and $000000FF; end; end; IntelProcessor: begin writeln('Processador Intel'); { Check for support of the extended function $1D } regs._eax_ := $80000000; CPUID(regs); if regs._eax_ >= $8000001D then begin writeln('Usando a funcao 8000 001D'); { Parse through all caches } regs._eax_ := $8000001D; regs._ecx_ := 0; repeat CPUID(regs); { Is this a Level 1 Data/Unified Cache ? } if ((regs._eax_ and $000000FF) = $21) or ((regs._eax_ and $000000FF) = $23) then begin if (regs._ebx_ and $00000FFF) > size then size := (regs._ebx_ and $00000FFF); end; until (regs._eax_ and $0000000F) = 0; end else begin writeln('Usando a funcao 0000 0001'); { Use the standard function 1 } regs._eax_ := 1; CPUID(regs); size := (regs._ebx_ and $0000FF00) shr 5; end; end; end; writeln('Linha de Cache L1: ',size); end.
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.