Pular para o conteúdo principal

Postagens

Mostrando postagens com o rótulo delphi

Limpando objetos dinamicamente (Delphi)

  Muitas vezes nos deparamos com situações onde devemos remover o conteúdo de determinados objetos, como por exemplo Edits ou mesmo Labels e dependendo da complexidade da tela setar manualmente cada campo pode ser trabalhoso.Sendo assim mostraremos hoje como montar um esquema automático e genérico para esse caso:   procedure TForm1.Button1Click(Sender: TObject);  procedure LimparEdits(AControl: TComponent); var    vLoop: Integer; begin     { ComponentCount retorna a qtde de componentes que o parent é o AControl, ou seja, somente os componentes que     estão ligados a ele }     for vLoop := 0 to AControl.ComponentCount-1 do      begin                                                            { Se for um componente do tipo TEdit, }                  { então iremos limpar o conteúdo, caso }             { contrário, iremos rechamar a procedure }             { pois o AControl pode ser um painel e temos }             { que limpar inclusive os

Copiando arquivos (Delphi)

Pelo Delphi copiar arquivos de um lugar para outro é simples, nesse exemplo o usuário indica o caminho de origem o de destino e executa a cópia, baixe o exemplo completo aqui . Para o exemplo precisaremos de dois Labels para identificar a função dos Edits , dois Edits para a entrada dos caminhos de origem e destino e um botão para executar o processo, segue o código do click do botão: var   Dados: TSHFileOpStruct; begin   FillChar(Dados,SizeOf(Dados), 0);   with Dados do   begin     wFunc := FO_COPY;     pFrom := PChar(Edit1.Text);     pTo   := PChar(Edit2.Text);     fFlags:= FOF_ALLOWUNDO;   end;   SHFileOperation(Dados); end;

Pegar informações de uma unidade (Delphi)

Nesse exemplo mostraremos como recuperar informações como setores, bytes por setores e aghrupamentos livres, o exemplo completo pode ser baixado aqui . Insira no formulario um Edit para receber o caminho do diretorio, um memo para mostrar as informações e um botão para iniciar a consulta, segue a codificação do click do botão: var   SetoresPorAgrup, BytesPorSetor, AgrupLivres,   TotalAgrup: DWord; begin   Memo1.Clear;   if GetDiskFreeSpace( pchar(Edit1.Text) , SetoresPorAgrup,       BytesPorSetor, AgrupLivres, TotalAgrup) then   with Memo1.Lines do begin     Add( '------------------------------------------------------------------' );     Add( '----- Informações sobre a unidade [' +Edit1.Text+ '] -----' );     Add( 'Setores por agrupamento: ' + IntToStr(SetoresPorAgrup));     Add( 'Bytes por setor: ' + IntToStr(BytesPorSetor));     Add( 'Agrupamentos l

Alterar cores do PageControl (Delphi)

O padrão Windows todo cinza não é muito atraente, por isso quando nos utilizarmos do PageControl podemos alterar suas cores e fontes da seguinte maneira: Em primeiro lugar devemos alterar a propriedade OwnerDraw para TRUE ; Depois implementar seu método DrawTab da seguinte maneira: //pinta a fonte Control.Canvas.Font.Color:=clBlack; // // pinta a paleta / aba Control.Canvas.brush.Color:=clSkyBlue; PageControl1.Canvas.Rectangle(Rect); Control.Canvas.TextOut(Rect.left+5,Rect.top+3,PageControl1.Pages[tabindex].Caption); // pinta a parte interna (tabsheet) PageControl1.Pages[TabIndex].brush.Color := Control.Canvas.brush.Color; PageControl1.Pages[TabIndex].Repaint; Caso a intenção seja manter cada aba com seu próprio estilo basta adicionar um CASE filtrando o índice das abas: case TabIndex of   0: Control.Canvas.Font.Color:=clBlack;   1: Control.Canvas.Font.Color:=clWindow;   2: Con

Listar arquivos existentes em diretório (Delphi)

Mostraremos uma maneira simples e prática para listar o conteúdo de um diretório com a opção de incluir nessa listagem os arquivos de seus subdiretórios. No exemplo abaixo temos um Edit para receber o diretório a ser pesquisado um CheckBox para indicar se os subdiretórios entrarão na pesquisa um botão para efetuar a pesquisa e um Memo para listar os arquivos encontrados, no final um Edit que receberá o cálculo final (em bytes) da soma do tamanho dos arquivos. procedure TForm1.Button1Click(Sender: TObject); begin   tamanhoTotal := 0;   memLista.Lines.Clear;   ListarArquivos(edtDiretorio.Text, chkSub.Checked);   Edit1.Text := IntToStr( tamanhoTotal ); end; procedure TForm1.ListarArquivos(Diretorio: string; Sub:Boolean); var   F: TSearchRec;   Ret: Integer;   TempNome: string; begin   Ret := FindFirst(Diretorio+'\*.*', faAnyFile, F);   try     while Ret = 0 do       begin         if TemAtributo(F.Attr,

Verificar tamanho de arquivo (Delphi)

Para essa pequena dica construiremos um formulário contendo dois Edits e um botão, o primeiro Edit recebe o caminho e nome do arquivo, o segundo receberá o tamanho em bytes. Segue a cadificação do evento click do botão: procedure TForm1.Button1Click(Sender: TObject); var   SR: TSearchRec;   I: integer; begin   I := FindFirst(Edit1.Text, faArchive, SR);   try     if I = 0 then       Edit2.Text := IntToStr( SR.Size )     else       Edit2.Text := '-1';   finally     FindClose(SR);   end; end; Baixe o exemplo completo aqui .

Texto na Diagonal usando o Canvas (Delphi)

var   lf : TLogFont;   tf : TFont; begin   with Form1.Canvas do     begin       Font.Name := 'Arial';       Font.Size := 24;       tf := TFont.Create;       tf.Assign(Font);       GetObject(tf.Handle, sizeof(lf), @lf);        lf.lfEscapement := 450;       lf.lfOrientation := 450;       tf.Handle := CreateFontIndirect(lf);       Font.Assign(tf);       tf.Free;       TextOut(20, Height div 2, 'Texto Diagonal!');    end; end;

Iniciar e Parar Serviços do Windows (Delphi)

Em certas ocasiões nos deparamos com a necessidade de manipular determinadas atividades do SO, como iniciar ou parar um banco de dados, ou qualquer outro serviço que esteja funcionando no momento. Segue abaixo um código que encontrei na Internet para tal finalidade (não me recordo à fonte, assim que eu a encontrar colocarei). Iniciar Serviço: uses WinSvc; // // start service // // return TRUE if successful // // sMachine: //   machine name, ie: \SERVER //   empty = local machine // // sService //   service name, ie: Alerter // function ServiceStart(   sMachine,   sService : string ) : boolean; var   //   // service control   // manager handle   schm,   //   // service handle   schs   : SC_Handle;   //   // service status   ss     : TServiceStatus;   //   // temp char pointer   psTemp : PChar;   //   // check point   dwChkP : DWord; begin   ss.dwCurrentState := -1;   //

Log de exceções não tratadas (Delphi)

Nem sempre é possível tornar nossa aplicação imune a todos os erros, sempre existe aquele que apenas o usuário conseguirá simular e na maioria das vezes você estará bem longe dali. Para não ficar apenas com a explicação do usuário, que muitas vezes e confusa e inconclusiva podemos criar uma maneira de ao menos rastrear os erros não controlados, isso mesmo podemos construir um "log" de erros, então vamos lá: Adicione em seu formulário principal o componente ApplicationEvents da aba Additional; No evento OnException entre com o seguinte código: var   vl_NomeDoLog : string;   vl_Arquivo   : TextFile; begin   vl_NomeDoLog := ChangeFileExt(Application.Exename, '.log');   AssignFile(vl_Arquivo, vl_NomeDoLog);    IF FileExists(vl_NomeDoLog) THEN     Append(vl_arquivo) { se existir, apenas adiciona linhas }    ELSE     ReWrite(vl_arquivo); { cria um novo se não existir }    TRY     WriteLn(vl_arquivo, 'APLICAÇÃO: ['+Screen.ActiveForm.Caption+'] DATA/HORA: ['+D

Função INSTR do Oracle no Delphi

O Oracle possui uma função chamada INSTR(), ela procura por ocorrências de uma determinada palavra dentro de outra, começando de uma determinada posição, e retorna o índice quando encontrado. Ex.: SELECT INSTR ('EDUARDO TEIXEIRA','ER', 1, 2) "Teste com INSTR" FROM DUAL; Teste com INSTR ---------- 13 No exemplo acima a busca começa no primeiro caracter da frase 'EDUARDO TEIXEIRA' e procura pelo índice da segunda ocorrência da palavra 'ER', e o resultado foi a 13º posição. Existe algo parecido no Delphi, é a função POEX, porém ela não trata ocorrências, trazendo sempre o índice da primeira encontrada, então ai vai uma função para o Delphi que faz o mesmo que o INSTR do Oracle: function INSTR_Delphi(p_busca: string; p_buscado: string; p_inicio: integer; p_incidencia: integer): integer; var v_posi : integer; //guarda última posição encontrada v_inc : integer;   //incidências já encontradas v_i : integer;       //contador para loop b

Colocar imagem em campo do dbGrid

Considerando que minha pasta de ícones esta no mesmo nível da pasta de minha aplicação, e que eu tenho em meu banco de dados o nome do arquivo isso funciona. Procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); var vl_icone : ticon; vl_fixo : TRect; begin vl_fixo := Rect; if (Column.Field = ClientDataSet1cone) and (ClientDataSet1NOME_ICONE.AsString '') then begin vl_icone := Ticon.Create; vl_icone.Height := 10; try vl_icone.LoadFromFile(('..\Icones\'+ClientDataSet1NOME_ICONE.AsString)); DBGrid1.Canvas.StretchDraw(vl_fixo, vl_icone); finally vl_icone.Free; end; end; end;

Como Verificar se um Objeto Existe (Delphi)

Em alguns momentos surge a necessidade de verificar se um determinado objeto existe, ou seja se já foi criado, principalmente quando se trabalha com criação dinâmica em tempo de execução, então vamos ao exemplo: - Vamos criar uma variável, um vetor do tipo caixa de texto: var Minha_caixa : array of TEdit; - Em seguida definir o tamanho desse vetor, no caso será dez: setLength(Minha_caixa, 10) - Agora iremos criar nossa caixa de texto: // lembrando que o vetor inicia em zero // logo o índice final é o tamanho total - 1 for vl_i := 0 to Length(Minha_caixa) -1 do begin Minha_caixa[vl_i] := TEdit.Create(self); with Minha_caixa[vl_i] do begin Parent := Self; Name := 'Caixa_N'+IntToStr(vl_i); Text := 'Esta é a '+IntToStr(vl_i)+' º caixa !'; ReadOnly := true; Height := 21; Width :=

Ler de um arquivo de configuração (.INI no Delphi)

Em muitos casos precisamos tornar nossas aplicações customizáveis, disponibilizando parâmetros que possam ser alterados, sejam eles informações a respeito de uma conexão com o banco de dados, uma senha, ou mesmo possibilitar a alteração do layout do sistema, tudo depende da necessidade e de como o programador pensa em termos de mobilidade para o usuário final. Exemplo de arquivo INI [PARAMETRO] SENHA=12345 Lendo um arquivo INI var // variável que irá conter o arquivo config : TIniFile; // variável que irá armazenar parâmetro a ser lido do arquivo param : string; begin // associa o arquivo de configuração a variável config := TIniFile.Create('C:\Aplicacao\config.ini'); //variável param recebe 12345 param := config.readstring('PARAMETRO','SENHA',''); end;

dbGrid zebrado (Delphi)

Quando utilizamos dbGrid e este recebe muitos registros fica dificil ler toda a linha, principalmente se possuimos um grande número de colunas, um recurso que podemos lançar mão para ao menos amenizar essa situação é o efeito "zebrado", onde temos linhas com cores diferentes, na verdade duas cores diferentes que se intercalam. Então vamos ao exemplo, no evento OnDrawColumnCell: if odd (ClientDataSet4.RecNo) then DBGrid1.Canvas.Brush.Color:= clmenubar else DBGrid1.Canvas.Brush.Color:= clCream; TDbGrid(Sender).Canvas.font.Color:= clBlack; if gdSelected in State then with (Sender as TDBGrid).Canvas do begin Brush.Color := clmoneygreen; FillRect(Rect); Font.Style := [fsbold] end; TDbGrid(Sender).DefaultDrawDataCell(Rect, TDbGrid(Sender).columns[datacol].field, State);

Palavra com a primeira letra em Maiúsculo (Delphi)

Para casos onde temos palavras que são armazenadas todas em maiúsculo, geralmente surge a necessidade de utiliza-la de uma maneira mais elegante, como o título sugere, então vamos lá: function Primeira_Letra_Maiuscula(p_texto: string): string; begin IF p_texto <> '' THEN result := UpperCase(Copy(p_texto,1,1))+LowerCase(Copy(p_texto,2,Length(p_texto))); end;

Centralizar Texto em Edit

Como todos sabemos o Edit mantém todo texto digitado a esquerda, o que não fica bem quando o usamos para a entrada de números, pois bem, o exemplo abaixo apresenta uma alternativa para centralizar um determinado valor dentro de um Edit: procedure EditChange(Sender: TObject); var vl_label : TLabel; //variável do tipo Label begin vl_label := TLabel.Create(self); //criamos um label WITH vl_label DO BEGIN Font.Name := TEdit(sender).Font.Name; //pegamos a fonte usada no edit Caption := TEdit(sender).Text; //pegamos o conteúdo do edit SendMessage(TEdit(sender).Handle, EM_SETMARGINS, EC_LEFTMARGIN, (TEdit(sender).Width-vl_label.Width) div 2); //centraliza no label e retorna para o edit END ; vl_label.Free; end ;

Remover pontos de nome de arquivo (Delphi)

O exemplo a seguir nos mostra como remover pontos de um nome de arquivo, deixando é claro o da extensão: procedure TForm1.Button1Click(Sender: TObject); var vl_a: integer; vl_i: integer; begin //verifica indice do ultimo ponto FOR vl_i:= Length(LabeledEdit1.Text) DOWNTO 1 DO BEGIN IF Copy(LabeledEdit1.Text, vl_i, 1) = '.' THEN BEGIN vl_a := vl_i; Break; END; END; //copia texto ignorando os pontos, exceto quando o ponto estiver no inidice encontrado //anteriormente FOR vl_i:= 1 TO Length(LabeledEdit1.Text) DO BEGIN IF ( Copy(LabeledEdit1.Text, vl_i, 1) <> '.' ) THEN LabeledEdit2.Text := LabeledEdit2.Text + Copy(LabeledEdit1.Text, vl_i, 1) ELSE IF ( vl_i = vl_a ) THEN LabeledEdit2.Text := LabeledEdit2.Text + Copy(LabeledEdit1.Text, vl_i, 1) END; end; Baixe o exemplo aqui .

Mover ponteiro do Mouse automaticamente (Delphi)

Em certas ocasiões desejamos fazer com que o usário veja determinada funcionalidade, ou mesmo tentamos indicar o melhor procedimento a tomar naquele momento, nada melhor como mover o ponteiro do mouse, já que concentramos certa atenção nele, então vamos ao exemplo: var vl_p: TPoint; begin vl_p.X := 315; vl_p.Y := 89; vl_p := ClientToScreen(vl_p); SetCursorPos(vl_p.X, vl_p.Y); end; Baixe o exemplo completo aqui .

Descobrir tipo do Arquivo (Delphi)

Segue um exemplo de como verificar o tipo de um determinado arquivo, digita-se o nome do arquivo juntamente com o caminho no Edit1, e ao clicar no botão o Edit2 recebe o tipo do arquivo: Function TipoArquivo(const p_File: String): String; var v_Inf: TSHFileInfo; begin IF SHGetFileInfo(PChar(p_File),0,v_Inf,Sizeof(v_Inf),SHGFI_TYPENAME) <> 0 THEN Result := StrPas(v_Inf.szTypeName) ELSE BEGIN Result := ExtractFileExt(p_File); Delete(Result,1,1); Result := Result +' File'; END; end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := TipoArquivo(Edit1.Text); end; Baixe o exemplo aqui .

Mudar Cursor de Edit Criado Dinamicamente

Temos o seguite caso, devemos criar Edits em tempo de execução, onde sempre que o ponteiro do mouse passar por um Edit, seja ele qual for, o ponteiro do Mouse deve mudar, apresentando dois tipos distintos, um para o caso do Edit estar vazio e outro quando ele estiver preenchido, além do fato de que quando um certo formulário for aberto o conteúdo do Edit selecionado deve ir para um Edit do novo formulário, segue abaixo o código, ou baixe aqui o exemplo: var Form1 : TForm1; Edt : TEdit; Cont : integer = 1; vLeft : integer = 8; vTop : integer = 40; vWidth : integer = 81; vHeight: integer = 21; vSelect: string; implementation uses Unit2; {$R *.dfm} procedure TForm1.criaEdt(p_left: integer; p_top: integer; p_width: integer; p_nome: string); begin Edt := TEdit.Create(Self); WITH Edt DO BEGIN Parent := Self; Left := p_left; Top := p_top; Width := p_width; Height := 21; Name := 'A'+p_nome; OnMouseMove:= EdtMouseMov