begin vXMLDoc := TXMLDocument.Create(self); // le os dados do arquivo salvo vXMLDoc.LoadFromFile('c:\tempo\navcom\nfe\retConsLote_001c.xml'); // ou simplesmente pega a string retWS que contem o XML retorno // vXMLDoc.xml.Add(retWS); // vXMLDoc.active = true; // ou para ler o arquivo do recibo da NFe motivo := vXMLDoc.DocumentElement.ChildNodes['xMotivo'].text; NodePai := vXMLDoc.DocumentElement.ChildNodes.FindNode('protNFe'); // posiciona no primeiro item (o velho first); NodePai.ChildNodes.First; // repeat....until (como o velho while condicao) // repete enquanto encontrar dados de protocolo no arquivo. repeat NodeSec := NodePai.ChildNodes.FindNode('infProt'); chaveacesso := NodeSec.ChildNodes['chNFe'].text; protocolo := NodeSec.ChildNodes['nProt'].text; datahora := NodeSec.ChildNodes['dhRecbto'].text; motivo := NodeSec.ChildNodes['xMotivo'].text; // inserido aqui apenas para testar mostrando os dados no MEMO. //if protocolo '' then Memo4.Lines.Add( chaveacesso+'-> '+protocolo+' ---- '+datahora+' - '+motivo ); // esse seria o Next NodePai := NodePai.NextSibling; until NodePai = nil; end;
Mostrando postagens com marcador Delphi. Mostrar todas as postagens
Mostrando postagens com marcador Delphi. Mostrar todas as postagens
terça-feira, 28 de dezembro de 2010
Lendo o XML com o TXMLDocument
quarta-feira, 10 de novembro de 2010
Conferência Delphi 2010
Nesse ultima dia 26 de Outubro aconteceu em São Paulo-SP, mais uma Delphi Conferência; realizada pela Embarcadero; contando com a presença dos seus mais renomados colaboradores (David I, Andreano Lanusse,etc). Estive lá para conferir e, embora tenha participado das conferências on-line, ao vivo é sempre melhor e, o conteúdo é sempre variado; além de poder encontrar alguns amigos. Foram 08-09 horas de muita informação. Palestras interessantes; mostrando várias aplicações para o nosso Delphi.
Muitas novidades com o lançamento do novo Delphi XE. Veja o vídeo do Andreano Lanusse em destaque aqui no site; entre outros disponíveis também no YouTube. Não vou entrar aqui em detalhes, mas, posso dizer que estou cada vez mais convencido que o Delphi tem se tornado cada vez mais, a melhor IDE de desenvolvimento; tendo como estrela agora, o novo DataSnap. Criar e consumir serviços Web virou brinquedo de criança.
terça-feira, 23 de dezembro de 2008
Como definir seu próprio hotkey (Tecla Quente) com Delphi
Como definir seu próprio hotkey (Tecla Quente):
Primeiro fixe a propriedade KeyPreview do Form para TRUE:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (chr(Key) in ['A', 'a']) then
ShowMessage('Ctrl-A');
end;
Impedir que o seu programa seja executado mais de uma vez com Delphi
Para impedir que o seu programa seja executado mais de uma vez, use a rotina abaixo. Se o
usuário tentar rodar o programa mais de uma vez, você tem a opção de fechar o programa, e o
programa já aberto será exibido.
function IsWindowInMemory (WndTitle : String) : Boolean;
var
hSem : THandle;
hWndMe : HWnd;
begin
Result := False;
hSem := CreateSemaphore (nil, 0, 1, 'NomeDoSemaforo');
if (hSem <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS) then
begin
CloseHandle (hSem);
hWndMe := FindWindow (nil, PChar (WndTitle));
SetWindowText (hWndMe, 'ii7it89lihtf');
hWndMe := FindWindow (nil, PChar (WndTitle));
if hWndMe <> 0 then
begin
if IsIconic (hWndMe) then
ShowWindow (hWndMe, SW_SHOWNORMAL)
else
SetForegroundWindow (hWndMe);
end;
Result := True;
end;
end;
E, no evento OnCreate do form principal, coloque as seguintes linhas:
if IsWindowInMemory (Self.Caption) then
Halt;
Apagando pastas com tudo dentro com Delphi
Para apagar uma pasta com todas as suas subpastas e arquivos, utilize a rotina abaixo
procedure ProcuraEApaga (Arq, Dir : String);
var
F : TSearchRec;
S : String;
begin
if Dir [length (Dir)] <> '\' then
Dir := Dir + '\';
S := Dir + '*.*';
if FindFirst (S, faAnyFile, F) = 0 then
if (F.Attr = faDirectory) then
begin
if (F.Name <> '.') and (F.Name <> '..') then
Procura (Arq, Dir + F.Name)
end
else
if (F.Name = Arq) then
DeleteFile (Dir + Arq);
end;
Alterando a Data do windows com Delphi
function SystemDateTime (tDate: TDateTime; tTime: TDateTime): Boolean;
var
tSetDate: TDateTime;
vDateBias: Variant;
tSetTime: TDateTime;
vTimeBias: Variant;
tTZI: TTimeZoneInformation;
tST: TSystemTime;
begin
GetTimeZoneInformation(tTZI);
vDateBias := tTZI.Bias / 1440;
tSetDate := tDate + vDateBias;
vTimeBias := tTZI.Bias / 1440;
tSetTime := tTime + vTimeBias;
with tST do
begin
wYear := StrToInt(FormatDateTime('yyyy', tSetDate));
wMonth := StrToInt(FormatDateTime('mm', tSetDate));
wDay := StrToInt(FormatDateTime('dd', tSetDate));
wHour := StrToInt(FormatDateTime('hh', tSettime));
wMinute := StrToInt(FormatDateTime('nn', tSettime));
wSecond := StrToInt(FormatDateTime('ss', tSettime));
wMilliseconds := 0;
end;
SystemDateTime := SetSystemTime(tST);
end;
Adicionar barra de rolagem horizontal no ListBox com Delphi
Adicionar barra de rolagem horizontal no ListBox
{ - Coloque um ListBox no form;
- Altere o OnCreate do Form conforme abaixo:
}
procedure TForm1.FormCreate(Sender: TObject);
var
I, Temp, MaxTextWidth: integer;
begin
{ Adiciona algumas linhas no ListBox }
Listbox1.Items.Add('Linha 1');
Listbox1.Items.Add('Linha 2, longa para que seja necessária a barra de rolagem horizontal');
Listbox1.Items.Add('Linha 3');
if Listbox1.Items.Count > 1 then begin
{ Obtém o comprimento, em pixels, da linha mais longa }
MaxTextWidth := 0;
for I := 0 to Listbox1.Items.Count - 1 do begin
Temp := ListBox1.Canvas.TextWidth(ListBox1.Items[I]);
if Temp > MaxTextWidth then
MaxTextWidth := Temp;
end;
{ Acrescenta a largura de um "W" }
MaxTextWidth := MaxTextWidth + Listbox1.Canvas.TextWidth('W');
{ Envia uma mensagem ao ListBox }
SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxTextWidth, 0);
end;
end;
{ Para ocultar use a instrução abaixo: }
SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, 0, 0);
Obtendo versão de um .exe com Delphi
Obtendo as informações de versão dos arquivos
Um dos recursos disponibilizados pelo Delphi é a customização das informações de versão a serem "anexadas" na linkagem.
Pouco utilizado, este recurso é muito interessante, pois possibilita o cadastro de diversas informações sobre o arquivo gerado, como: número de versão, nome do produto, nome interno do arquivo, nome da empresa, etc.
Podemos alterar as informações na página "Version Info", da página "Project Options":
Atenção com o item "Auto-increment build number": ele só será incrementado automaticamente quando for executada a opção "Build All" para compilar o projeto.
Porém, não existem rotinas "prontas" para obtermos estas informações. É necessário fazermos chamadas diretamente a API Win32, mais espeficamente, para as funções como a "GetFileVersionInfo" e a "VerQueryValue".
A função, a "FileVerInfo", que exemplifica o processo de obtenção das informações. Ela irá retornar "True" caso o arquivo informado no parâmetro "FileName" possuir as informações de versão, e devolverá por referência um "TStringList" contendo as informações.
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function FileVerInfo(const FileName: string;
var FileInfo: TStringList): Boolean;
const
Key: array[1..9] of string =('CompanyName', 'FileDescription',
'FileVersion',
'InternalName', 'LegalCopyright',
'OriginalFilename', 'ProductName',
'ProductVersion', 'Comments');
KeyBr: array [1..9] of string = ('Empresa',
'Descricao', 'Versao do Arquivo',
'Nome Interno', 'Copyright',
'Nome Original do Arquivo', 'Produto',
'Versao do Produto', 'Comentarios');
var
Dummy : THandle;
BufferSize, Len : Integer;
Buffer : PChar;
LoCharSet, HiCharSet : Word;
Translate, Return : Pointer;
StrFileInfo, Flags : string;
TargetOS, TypeArq : string;
FixedFileInfo : Pointer;
i : Byte;
begin
Result := False;
{ Obtemos o tamanho em bytes do "version information" }
BufferSize := GetFileVersionInfoSize(PChar(FileName), Dummy);
if BufferSize <> 0 then
begin
GetMem(Buffer, Succ(BufferSize));
try
if GetFileVersionInfo(PChar(FileName), 0, BufferSize,
Buffer) then
{ Executamos a funcao "VerQueryValue" e conseguimos
informacoes sobre o idioma/character-set }
if VerQueryValue(Buffer, '\VarFileInfo\Translation',
Translate, UINT(Len)) then
begin
LoCharSet := LoWord(Longint(Translate^));
HiCharSet := HiWord(Longint(Translate^));
for i := 1 to 9 do
begin
{ Montamos a string de pesquisa }
StrFileInfo := Format('\StringFileInfo\0%x0%x\%s',
[LoCharSet, HiCharSet, Key[i]]);
{ Adicionamos cada key pré-definido }
if VerQueryValue(Buffer,PChar(StrFileInfo), Return,
UINT(Len)) then
FileInfo.Add(KeyBr[i] + ': ' + PChar(Return));
end;
if VerQueryValue(Buffer,'\',FixedFileInfo, UINT(Len))
then
with TVSFixedFileInfo(FixedFileInfo^) do
begin
Flags := '';
{Efetuamos um bitmask e obtemos os "flags" do arquivo}
if (dwFileFlags and VS_FF_DEBUG) = VS_FF_DEBUG then
Flags := Concat(Flags,'*Debug* ');
if (dwFileFlags and VS_FF_SPECIALBUILD) =
VS_FF_SPECIALBUILD then
Flags := Concat(Flags, '*Special Build* ');
if (dwFileFlags and VS_FF_PRIVATEBUILD) =
VS_FF_PRIVATEBUILD then
Flags := Concat(Flags, '*Private Build* ');
if (dwFileFlags and VS_FF_PRERELEASE) =
VS_FF_PRERELEASE then
Flags := Concat(Flags, '*Pre-Release Build* ');
if (dwFileFlags and VS_FF_PATCHED) = VS_FF_PATCHED then
Flags := Concat(Flags, '*Patched* ');
if Flags <> '' then FileInfo.Add('Atributos: ' + Flags);
TargetOS := 'Plataforma (OS): ';
{ Plataforma }
case dwFileOS of
VOS_UNKNOWN :
TargetOS := Concat(TargetOS, 'Desconhecido');
VOS_DOS :
TargetOS := Concat(TargetOS, 'MS-DOS');
VOS_OS216 :
TargetOS := Concat(TargetOS, '16-bit OS/2');
VOS_OS232 :
TargetOS := Concat(TargetOS, '32-bit OS/2');
VOS_NT :
TargetOS := Concat(TargetOS, 'Windows NT');
VOS_NT_WINDOWS32, 4:
TargetOS := Concat(TargetOS, 'Win32 API');
VOS_DOS_WINDOWS16:
TargetOS := Concat(TargetOS, '16-bit Windows ',
'sob MS-DOS');
else
TargetOS := Concat(TargetOS, 'Fora do Padrão.
Código: ', IntToStr(dwFileOS));
end;
FileInfo.Add(TargetOS);
TypeArq := 'Tipo de Arquivo: ';
{ Tipo de Arquivo }
case dwFileType of
VFT_UNKNOWN :
TypeArq := Concat(TypeArq,'Desconhecido');
VFT_APP : TypeArq := Concat(TypeArq,'Aplicacao');
VFT_DLL :
TypeArq := Concat(TypeArq,'Dynamic-Link Lib.');
VFT_DRV : begin
TypeArq := Concat(TypeArq,'Device driver - Driver ');
case dwFileSubtype of
VFT2_UNKNOWN
: TypeArq := Concat(TypeArq,'Desconhecido');
VFT2_DRV_PRINTER
: TypeArq := Concat(TypeArq,'de Impressao');
VFT2_DRV_KEYBOARD
: TypeArq := Concat(TypeArq,'de Teclado');
VFT2_DRV_LANGUAGE
: TypeArq := Concat(TypeArq,'de Idioma');
VFT2_DRV_DISPLAY
: TypeArq := Concat(TypeArq,'de Vídeo');
VFT2_DRV_MOUSE
: TypeArq := Concat(TypeArq,'de Mouse');
VFT2_DRV_NETWORK
: TypeArq := Concat(TypeArq,'de Rede');
VFT2_DRV_SYSTEM
: TypeArq := Concat(TypeArq,'de Sistema');
VFT2_DRV_INSTALLABLE
: TypeArq := Concat(TypeArq,'Instalavel');
VFT2_DRV_SOUND
: TypeArq := Concat(TypeArq,'Multimida');
end;
end;
VFT_FONT : begin
TypeArq := Concat(TypeArq,'Fonte - Fonte ');
case dwFileSubtype of
VFT2_UNKNOWN
: TypeArq := Concat(TypeArq, 'Desconhecida');
VFT2_FONT_RASTER
: TypeArq := Concat(TypeArq,'Raster');
VFT2_FONT_VECTOR
: TypeArq := Concat(TypeArq,'Vetorial');
VFT2_FONT_TRUETYPE
: TypeArq := Concat(TypeArq,'TrueType');
end;
end;
VFT_VXD : TypeArq := Concat(TypeArq,'Virtual Device');
VFT_STATIC_LIB
: TypeArq := Concat(TypeArq,'Static-Link Lib.');
end;
FileInfo.Add(TypeArq);
end;
end;
finally
FreeMem(Buffer, Succ(BufferSize));
Result := FileInfo.Text <> '';
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
StrLst: TStringList;
begin
StrLst := TStringList.Create;
try
FileVerInfo('C:\WINDOWS\SYSTEM\TAPI.DLL', StrLst);
Memo1.Lines.Assign(StrLst);
finally
StrLst.Free;
end;
end;
Verificar se um diretório existe com Delphi
Verificar se um diretório existe
Inclua na seção uses: FileCtrl, Dialogs
if DirectoryExists('C:\MEUSDOCS') then
ShowMessage('O diretório existe')
else
ShowMessage('O diretório não existe');
Verificar se um arquivo existe com Delphi
Verificar se um arquivo existe
Inclua na seção uses: SysUtils, Dialogs
if FileExists('c:\carta.doc') then
ShowMessage('O arquivo existe')
else
ShowMessage('O arquivo não existe');
Colocar zero a esquerda em Delphi
function RetZeroEsquerda(ZEROS:string;QUANT: integer):String;
var
I,Tamanho: integer;
aux: string;
begin
aux:=zeros;
Tamanho:=length(ZEROS);
ZEROS:='';
for I:=1 to quant-tamanho do
ZEROS:=ZEROS+'0';
aux:=zeros+aux;
RetZeroEsquerda:=aux;
end;
Função para retirar somente números de uma string em Delphi
Declare na Seção.
private
Function SoNumero(Texto : String) : String;
Function IsDigit(Texto : string) : Boolean;
Depois da directiva de compilação.
{$R *.dfm}
Function TFrmExportacaoContabilidade.SoNumero(Texto : String) : String;
var
Ind : Integer;
TmpRet : String;
begin
TmpRet := '';
for Ind := 1 to Length(Texto) do
begin
if IsDigit(Copy(Texto,Ind,1)) then
begin
TmpRet := TmpRet + Copy(Texto, Ind, 1);
end;
end;
Result := TmpRet;
end;
function TFrmExportacaoContabilidade.IsDigit(Texto: string): boolean;
begin
result := true;
try
StrToInt(Texto);
except
result := false;
end;
end;
Trocar vírgula por ponto em Delphi
function TrocaVirgPPto(Valor: string): String;
var i:integer;
begin
if Valor <> '' then begin
for i := 0 to Length(Valor) do begin
if Valor[i]='.' then begin
Valor[i]:=',';
end
else if Valor[i] = ',' then begin
Valor[i]:='.';
end;
end;
end;
Result := valor;
end;
Assinar:
Postagens (Atom)