
s3c
Membros-
Total de itens
817 -
Registro em
-
Última visita
Tudo que s3c postou
-
Se não for mantido o endereço inicial do buffer alocado, ao final, você não conseguirá liberar corretamente esta área de memória, visto que este será o endereço que você passará para o Freemem.você pode notar que foi dado um Inc após a alocação de memória e antes do FreeMem é dado um Dec, restaurando assim o ponteiro original.
-
try StrToTime(Campo.Text); // Hora ok except // Hora inválida end;
-
procedure TForm1.Button1Click(Sender: TObject); Const Fim_do_Mes_12 :Byte = 31; var b32 :^Byte; begin b32 := @Fim_do_Mes_12; b32^ := 32; Sim, é a mesma coisa; só declarei um PChar para melhor entendimento.GetMem(InfoBuf, SizeOf(TInfo) *2); // aloca espaço para dois registros PtrInfo := InfoBuf; // inicializa apontador PtrInfo^.Nome := 'Nome 1'; Inc(PtrInfo); PtrInfo^.Nome := 'Nome 2'; StrMsg := ''; PtrInfo := InfoBuf; StrMsg := 'Nome: '+ PtrInfo^.Nome +#10; Inc(PtrInfo); StrMsg := StrMsg +'Nome: '+ PtrInfo^.Nome; FreeMem(InfoBuf); ShowMessage(StrMsg); Neste caso, acho que InfoBuf é desnecessário, podendo-se alocar memória diretamente em PtrIfo:GetMem(PtrInfo, SizeOf(TInfo) *2); // aloca espaço para dois registros PtrInfo^.Nome := 'Nome 1'; StrMsg := 'Nome: '+ PtrInfo^.Nome +#10; Inc(PtrInfo); PtrInfo^.Nome := 'Nome 2'; StrMsg := StrMsg +'Nome: '+ PtrInfo^.Nome; Dec(PtrInfo); FreeMem(PtrInfo); ShowMessage(StrMsg);Quanto a ponteiros para estrturas, são muito úteis na passagem de parâmetros onde não é necessária a cópia de toda a estrutura, mas somente o ponteiro dela(4bytes) e com isso o parãmetro se torna var naturalmente. Já a utilização de ponteiros de type record dentro de um método são úteis quando a estrutura não é conhecida e tem que ser preenchida através de um array de informações dos tipos de campos; neste caso é melhor declarar um type packed record onde a utilização de memória se dá exatamente conforme os tipos dos campos.
-
Acredito que "ponteiros" nessa parte da apostila se referia aos endereços de memória de variáveis e não objetos(embora sejam ponteiros também). Por ex, teoricamente você não pode alterar o valor de uma constprocedure TForm1.Button1Click(Sender: TObject); Const Fim_do_Mes_12:Byte = 31; begin Fim_do_Mes_12 := 32; // Gera erro de compilação end; Mas se fizer assim:procedure TForm1.Button1Click(Sender: TObject); Const Fim_do_Mes_12:Byte = 31; var p:PChar; b32:Byte; begin p := @Fim_do_Mes_12; b32 := 32; Move(b32, p^, 1); ShowMessage(IntToStr(Fim_do_Mes_12)); end;você alterou o valor de uma const sem o Delphi saber, utilizando o endereço de memória(ponteiro) da constante.
-
Ponteiros são referências a endereços de memória; por ex, quando você instancia um objeto, na realidade o nome desse objeto é um ponteiro ou um endereço de memória. Os Windows 98/Me/2000/2003/XP são sistemas de 32 bits, então os endereços de memória também são 32 bits e é por isso que você pode armazenar ponteiros nas propriedades Tag dos componentes: procedure TForm1.Button1Click(Sender: TObject); var SL:TStringList; begin SL := TStringList.Create; Form1.Tag := Integer(SL); end; procedure TForm1.FormDestroy(Sender: TObject); begin if Form1.Tag <> 0 then TStringList(Form1.Tag).Free; end;Nesse exemplo Form1.Tag armazena o endereço de um objeto.
-
Vale lembrar que não necessariamente se coloca números em Tag; você também pode colocar ponteiros para referenciar objetos.
-
Tag é uma propriedade integer(4 bytes) que os componentes disponibilizam para armazenar informações. É uma propriedade segura que eles nunca a utilizam; então você pode colocar nela qualquer informação de 32 bits.
-
Sugiro que você utilize uma Query: Query.SQL.Text := 'Alter Table Nome_da_Tabela Alter Column Nome_do_Campo Type Varchar (60)'; Query.ExecSQL;
-
Certo, mas tudo o que você faz com Paradox, pode fazer com Interbase sem exceções, além do que Paradox é extremamente inferior ao Interbase.
-
Paradox é famoso por bugs e constantes perdas de índices. Sugiro que você mude para o Interbase6 Open Source; pode baixá-lo em: ftp://ftpc.borland.com/pub/interbase/devs....0.1-server.ZIP
-
Se não tiver outra maneira, a dll de funções hook poderia estar no .exe como um arquivo de recursos.
-
WinExec('cmd /k ipconfig /All > teste.txt', SW_Hide);
-
Acho que o primeiro problema não é capturar o mouse fora da aplicação e sim capturar a tecla F3 fora da aplicação.Particularmente só conheço uma maneira de se fazer; com funções Hook (SetWindowsHookEx com idHook = WH_KeyBoard, CallNextHookEx e UnhookWindowsHookEx). Essas hooks devem ser globais e portanto precisam estar rodando numa dll. Espero que algum colega do fórum conheça uma maneira mais simples de capturar teclas fora da aplicação.
-
Eu solucionaria dessa forma: s := extractfilepath(application.exename); While s[Length(s)] <> '\' do SetLength(s, Length(s)-1);Talvez possa existir alguma função que já volte um nível, mas eu não conheço.
-
Tente utilizar uma variável boolean: var bF3:Boolean; procedure TForm1.FormCreate(Sender: TObject); begin bF3 := false; end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key = VK_F3) and not bF3 then begin bF3 := true; SetSystemCursor(LoadCursor(0, IDC_Cross), OCR_Normal); end; end; procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin if (key = VK_F3) and bF3 then begin bF3 := false; SetSystemCursor(LoadCursor(0, IDC_Cross), OCR_Normal); end; end;Mas o formulário tem que estar em foco no onKeyDown e onKeyUp
-
você pode utilizar a função RoundTo: uses Math; var f:Double; begin f := RoundTo(35.95 * 0.85, -2); end;
-
Pode parecer estranho mas para voltar o cursor é o mesmo comando. Não conseguí entender muito bem, mas pelo que ví, a função SetSystemCursor destroi o cursor que ela ativa e quando você aplica o mesmo comando, como o cursor não existe mais, ela volta ao cursor anterior.
-
Tente utilizar: SetSystemCursor(LoadCursor(0, IDC_Cross), OCR_Normal);Para mudar e voltar o cursor.
-
Clicando com o botão direito do mouse na unit, existe a opção Read Only, mas é só clicar nela novamente que ele destrava. Já se você for mudar a propriedade do arquivo para Read Only pelo Explorer, você consegue mexer no código mas não consegue salvar.
-
Olá Paulo, acho que é por ordem alfabética. Tente colocar seu programa antes do Winkey.
-
Seria bom você postar o código.
-
Como é o Windows quem registra a tecla, o primeiro processo que registrou tem a prioridade; os outros processos não podem registrar uma tecla já registrada. Vale ressaltar que quando você registra uma tecla, ela fica sem efeito nos outros aplicativos; por ex, se você registra a tecla 'a'($41) e abre o bloco de notas e digita 'a', ela não vai aparecer.
-
Esse erro quer dizer que ele não achou UfrmConsProcCrianca2.dcu. Coloque o caminho de UfrmConsProcCrianca2.pas no path do projeto p/ gerar o .dcu
-
Bom, você deve estar com um problema no seu Delphi, porque o ShowMessage só é dado na posição 1.000.001; ou seja; todos os caracteres de 1 a 1.000.000 estão na string com a letra 'a'. E a posição 1.000.001 contém o caracter #0(null terminated string).
-
Acho que não. veja este código:var i:Integer; s:string; begin s := ''; for i := 1 to 1000000 do s := s + 'a'; for i := 1 to 1000001 do if s[i] <> 'a' then ShowMessage(inttostr(i)); end;O primeiro for preenche uma string 1.000.000 de vezes com a letra 'a'. O segundo for checa a letra 'a' 1.000.001 vezes e só dá o ShowMessage no elemento 1.000.001 que é o #0(término da string).