Ir para conteúdo
Fórum Script Brasil

paulobergo

Membros
  • Total de itens

    295
  • Registro em

  • Última visita

Posts postados por paulobergo

  1. Olá!

    Só agora li o conteúdo e, (dam), acho que o que vocês querem é uma rotina para fazer download de atualizações e comandá-las automaticamente, certo?

    Bom, para fazer isso, eu uso um programa próprio (chamado upgrade), que baixa os arquivos zipados e extrai os aplicativos (dll ou exe)...

    Não automatizei muito o processo... é um programa stankalone, que fica "observando" se há atualizações no site (comparando data e hora dos arquivos zipados no hd local com data e hora dos que estão no site)... daí, pode fazer o download automaticamente ou não (solicitando confirmação do usuário)...

    Ao mesmo tempo, o programa faz atualizações locais (buscando em um servidor na rede)...

    Se houver interesse em partilhar (e melhorar) o programa, posso disponibiliza-lo por completo... uso o Delphi6 e, de diferente, para a rotina de compactação, um componente zip...

    Abraços!

  2. Olá pessoal...

    Quase resolvida a parada... graças a Zeos (digo, graças a Deus)...

    Depois de tentar conectar todo tipo de componente ao MySQL e os servidores IIS e Apache recusarem abrir as queries, consegui, em primeira instância, fazer uma consulta (uma query "readonly") em uma tabela do MySQL, através do componente Zeos (sourceforge)... no primeiro teste, sob o IIS, deu certo... Agora, vou testar em casa, sob o Apache...

    Caso dê certo, posto a mensagem amanhã aqui, com as dicas para quem precisar fazer consultas ou acessar (gravar, alterar, etc.) uma tabela no MySQL através de uma aplicação web no IIS ou Apache (isapi ou cgi)...

    Abraços...

    Uso um aplicativo para consulta e acesso a bancos de dados pela web, funcionando perfeitamente sob o IIS (XP), PWS (Win98) ou Apache (XP)...

    Trata-se principalmente de um programa (exe), rodando como cgi ou o mesmo programa em uma dll, como Isapi (em c:\inetpub\scripts ou

    c:/arquivos de programas/apache.../cgi-bin) .

    Agora experimentei instalar o MySQL e o PHP (ambos 5) para migrar as tabelas xBase para o MySQL e, posteriormente, para um servidor Linux...

    O fato é que as queries nas tabelas dBaseIII+, Paradox 7.0, dBASEIV 2.0, FOX26 e Visual dBASE7 funcionam perfeitamente

    mas as queries nas tabelas MySQL geram este erro:

    sob o Apache:

    Internal Server Error 500

    --------------------------------------------------------------------------------

    Exception: EDBEngineError

    Message: Invalid configuration parameter. Alias: paraiso

    (paraiso é o alias com as tabelas da empresa "paraiso ltda")...

    sob o IIS (XP) ou PWS (win98se):

    Internal Application Error

    General SQL error. [MySQL][ODBC 3.51 Driver]Access denied for user 'ODBC'@'localhost' (using password: NO) Alias: dssomajf

    O código abaixo funciona perfeitamente em uma aplicação normal (standalone), só não funciona nos scripts da web

    If sMySQLUse='1' then
      Begin
        If Database1.Connected then
          Database1.Connected := False;
        {EndIf Database1.Connected}
        Database1.AliasName    := sDbGeral;
        Database1.Databasename := sDbGeral;
        Database1.Params.Values['USERNAME'] := sMySQLUser;
        Database1.Params.Values['PASSWORD'] := sMySQLPass;
        Database1.Connected := True;
        query1.DatabaseName := sDbGeral;
      End;
    {EndIf sMySQLUse='1'}
    
    Observação:
    As variáveis são passadas via forms ou links... por exemplo:
    sMySQLUse := '1'; // indica que a tabela é do MySQL
    sDbGeral  := 'paraiso'; // alias do banco de dados.
    sMySQLUser := 'root';
    sMySQLPass := '1234';

    Mais: o XP está instalado em uma partição fat32... daí não tem restrição nenhuma para usuários não autenticados para acessar tabelas pela Web mas parece que há alguma restrição, já que aparece a mensagem de acesso negado, apesar de serem passados o nome de usuário (root) e senha corretos...

    No caso, como dizer que o usuário 'odbc' pode acessar o banco de dados?

    Alguma idéia?

    Grato por qualquer ajuda!!!

  3. De Volta...

    Uma idéia que encontrei, enviada pelo Marcelo de Matos Soeiro, é esta:

    "Legal, boa idéia, vamos adaptar: você pode entrar com um live CD, editar os arquivos /etc/passwd e /etc/shadow, mudar o uid e gid de um usuário para 0 e, então, mudar a senha do root, o que acha?!?! Depois, após estar tudo certo com o root, pode desfazer a manobra com o usuário comum.

    Fique com Deus."

    Vou tentar isso... estou dando boot com o cd do próprio Kurumin6.1... se der certo, posto aqui!

  4. Olá!

    Vi o post e estou prestes a reinstalar o Kurumin 6.1 porque também perdi a senha do root! isto é, não sei como consegui redefiní-la... toda senha que uso eu anoto na agenda e creio que o problema aconteceu depois que eu, abrindo o gerenciador de arquivos como root, atribui 'a pasta /bin os direitos de escrita, gravação, execução, ou seja, tudo, para todos os grupos e usuários (no caso, so tem o usuario kurumin mesmo)... depois disso, não consegui fazer mais nada como root...

    Meu micro tem dualboot (lilo)...

    Grato por qualquer ajuda!

    Esta é a minha sétima tentativa com o Linux (quatro com o Kurumin) e agora que estava conseguindo a dar meus primerios passos (estava quebrando a cabeça com o MySQL), pintou esta encrenca!

  5. Oi pessoal...

    Comecei há pouco com MySQL5+PHP5+IIS5(XP) e para fazer uma consulta a um bd simples, o seguinte codigo em PHP funciona perfeitamente:

    <html>
    <body bgcolor="lightgreen">
    
    <?php
      // Recebendo as variáveis.
      $nome = $_GET["nome"];
    ?>
    
    Resposta recebida? Veja:<br>
    
    <?php
      echo "Nome recebido= ";
      echo $nome;
      echo ", ok?";
    ?>
    <br>
    Comando "MySQLConnect"<br>
    <?php
      $link = mysql_connect('localhost', 'root', 'gamut600');
      if (!$link)
        {
          die('Could not connect: ' . mysql_error());
        }
      else
        {
          echo 'Connected successfully<br>';
          mysql_select_db('acmebr');
          $sql = 'select * from produtos';
          $resultado = mysql_query($sql)
            or die(mysql_error());
    
          while($linha=mysql_fetch_array($resultado))
            {
              $codigoean = $linha['codigoean'];
              $descricao = $linha['descricao'];
              $unidade = $linha['unidade'];
              $preço = $linha['preço'];
              echo 'Registro ';
              echo $codigoean;
              echo ' ';
              echo $descricao;
              echo ' ';
              echo $unidade;
              echo ' ';
              echo $preço;
              echo '<br>';
            }
          //endwhile
    
          $salvar = 'não';
          If ($salvar == 'sim')
            {
              $sql = 'insert into produtos (idprodutos, codigoean, descricao, unidade, preço) values (5,"7893933340002","CHAPA METALICA PARA GABINETE","UN",1.39)';
              $resultado = mysql_query($sql)
                or die(mysql_error());
              echo 'Registro incluido';
            }
          else
            {
              echo 'Sem inclusao de Registro!';
            }
          //endif
          mysql_close($link);
          echo 'Finalizando tarefas mysql';
        }
      //endif
    ?> 
    <hr>
    <?
      echo "Modo de Tag Simples Ativado!<br>";
    ?>
    </body>
    </html>
    

    Daí, depois de colocar as Três Marias para funcionar sem brigar (PHP+MySQL+IIS), instalei o Dreamweaver. na esperança de converter minhas páginas do IIS feitas sob Frontpage para acesso a bancos de dados pela BDE, através de ISAPIS e CGIS Delphi6 no XP, para páginas em PHP feitas sob o Dreamweaver...

    Porém, não consigo conectar o banco de dados (seguindo todo aquele tutorial do Dreamweaver...) dá a mensagem que está no título...

    Alguma idéia?

    Grato por qualquer ajuda!

  6. Oi Amigo...

    Olha... não é muito fácil não, assim "de cara"...

    Este aí é um exemplo bem simples de como fazer uma consulta em um banco de dados sob MySQL, usando PHP... Este código realmente funciona... mas até chegar aí, foi uma parada federal!

    <html>
    <body bgcolor="lightgreen">
    
    <?php
      // Recebendo as variáveis.
      $nome = $_GET["nome"];
    ?>
    
    Resposta recebida? Veja:<br>
    
    <?php
      echo "Nome recebido= ";
      echo $nome;
      echo ", ok?";
    ?>
    <br>
    Comando "MySQLConnect"<br>
    <?php
      $link = mysql_connect('localhost', 'root', 'jupiter200');
      if (!$link)
        {
          die('Could not connect: ' . mysql_error());
        }
      else
        {
          echo 'Connected successfully<br>';
          mysql_select_db('acmeltda');
          $sql = 'select * from produtos';
          $resultado = mysql_query($sql)
            or die(mysql_error());
    
          while($linha=mysql_fetch_array($resultado))
            {
              $codigoean = $linha['codigoean'];
              $descricao = $linha['descricao'];
              $unidade = $linha['unidade'];
              $preço = $linha['preço'];
              echo 'Registro ';
              echo $codigoean;
              echo ' ';
              echo $descricao;
              echo ' ';
              echo $unidade;
              echo ' ';
              echo $preço;
              echo '<br>';
            }
          //endwhile
    
          $sql = 'insert into produtos (idprodutos, codigoean, descricao, unidade, preço) // values (4,"7893934440002","MOUSE OPTICO GENIUS","UN",19.80)';
           $resultado = mysql_query($sql)
             or die(mysql_error());
           
          mysql_close($link);
          echo 'Finalizando tarefas mysql';
        }
      //endif
    ?> 
    <hr>
    <?
      echo "Modo de Tag Simples Ativado!<br>";
    ?>
    </body>
    </html>
    
    

    Bom... explicando isso aí...

    a) as tags html body e html são as únicas fora de tabulação.

    B) os dois primeiros scripts mostram como se recebe uma variável que tenha sido passada pela url do site, a partir de um formulário simples;

    c) os scripts seguintes servem para conectar o PHP ao MySQL; seguindo, o banco de dados da empresa "acmeltda" é selecionado (isto é, "acmeltda" é tipo um "alias" de BDE-Borland Database Engine- no MySQL, dentre vários databases que se pode ter..., creio eu!);

    d) feita a conexão com o MySQL e selecionado o banco de dados, fazemos uma simples consulta (a query com o comando select) na tabela de produtos;

    e) após a consulta, é criado um novo registro na tabela de produtos (query com o comando insert);

    Para chegar até aí, não foi fácil... até agora, todos os tutoriais que li e usei ou tentei usar e os esquemas de instalação do Apache, MySQL, PHP não são explicitamente claros em determinados pontos... por exemplo, ao instalar o PHP 5.2.0 para junto com o Apache 2.2.4, a instalação das extensões do MySQL e MySQLi foram automáticas... o mesmo não ocorreu com a instalação no IIS 5 do XP...

    Outra coisa, não consegui fazer o PHP funcionar como serviço ou IPSAPI no IIS 5 do XP... só funciona como CGI... mas isso até que não tem importância até agora...

    MySQL é bem diferente de BDE (quero migrar tabelas VisualdBase IV e VII sob a BDE) para o MySQL... e o tratamento para "aliases" na BDE é bem diferente das várias opções no MySQL...

    Agora, felizmente, existem os fóruns... como este aqui, e a gente pode contar com os amigos para "destravarem" algumas coisas que nos emperram...

    Ok?

    Espero ter ajudado em alguma coisa!

  7. Em tempo...

    Se fosse no DB2 (IBM) para Linux, Unix ou Windows:

    "An example of such a function or method is a simple counter function that returns a '1' the first time it is called, and increments the result by one each successive call. Such a function could, in some circumstances, be used to number the rows of a SELECT result:

       SELECT counter(), a, b+c, ...
         FROM tablex
         WHERE ...
    

    The function needs a place to store the current value for the counter between invocations, where the value will be guaranteed to be the same for the following invocation. On each invocation, the value can then be incremented and returned as the result of the function.

    This type of routine is NOT DETERMINISTIC. Its output does not depend solely on the values of its SQL arguments.

    "

    Bom... daí para o MySQL... é com vocês!

  8. Olá!

    Comecei agora com MySQL e estou penando muito... (quero passar do SQL da BDE para o MySQL)...

    Mas vi sua mensagem e me lembrei dessa rotina... não sei se resolve seu problema, pois não sei se ela se aplica ao MySQL... mas o código é esse:

    E' preciso criar uma tabela temporaria em SQL
    com uma coluna que contenha um valor inteiro para incrementar,
    sem dar a essa coluna uma identidade.
    
    Por exemplo, supondo que você queira selecionar um registro de uma tabela de usuários,
    mas adicionado uma coluna que contenha um contador incremental... os dados
    dessa tabela poderiam ser assim:
    
    contador UsuarioID nome            celular ...
    
    0        93988     Zezinho         9102-2002
    1        78829     Ana             8877-9292
    2        65432     SandroPlankton  9582-9399
    ... 
    
    
    Para iniciar, é preciso que você execute a query a seguir,
    para criar a tabela temporária:
    
    select contador = 0, * from usuarios into #us_temp
    
    Isto criara uma tabela com o nome de #us_temp
    onde a coluna "contador" é definida com zero em cada linha ou registro.
    
    Para pedir para atualizar a coluna contador
    para que cada linha (registro) tenha um valor maior do que a linha anterior,
    execute o seguinte:
    
    DECLARE @contador int
    SET @contador = 0
    UPDATE #us_temp
    SET @contador = contador = @contador + 1
    

    Ok?

    Bom... tenho certeza de que o código acima não funciona nas queries no DBExplorer... mas quem sabe funciona no MySQL...

    Abraços!

  9. Olá!

    Estou recebendo esta mensagem no IEx quando tento executar este simples script:

    Client does not support authentication protocol requested by server; consider upgrading MySQL client in c:\inetpub\wwwroot\somaalim\show.php on line 12

    O código do programa é:

    <html>
      Resposta recebida?
      <?php
        $nome = $_GET["nome"];
      ?>
      <?php
        echo "Nome recebido= ";
        echo $nome;
        echo ", ok?";
      ?>
      <?php
        mysql_connect("sialtd","root","tank999");
      ?>
    </html>
    
    Os dados do MySQL rodando são estes:
    Server Status:  MySQL is running
    
    Connected to MySQL instance
    Username: root
    Hostname: sialtd
    Port: 3306
    
    Server Information
    MySQL Version: MySQL 5.0.27-community-nt via TCP/IP
    Network Name: sialtd
    IP: 192.168.0.2
    
    Client information
    Version: MySQL Client Version 5.1.11
    Network Name: sialtd
    IP: 192.168.0.2
    Operation System: WindowsXP
    Hardware: Intel(R) Pentium(R) 4 CPU 1.60GHz, 320 MB RAM
    

    Observação:

    Desde 1997 migrei meus sistemas em Clipper (dbf's padrão dBaseIII com índices ntx) para sistemas em

    Delphi (3, 4 e hoje 6, com dbf's padrão dBASEIV 2.0 e VisualDbase7 com índices MDX, totalmente manipulados via SQL da própria BDE).

    As tabelas nos sistemas são acessadas através de aplicações em rede ou através de aplicações pela Intranet ou Internet, através de CGI e ISAPI rodando sob o IIS em XP ou PWS em Win98se... tudo isso sem problemas de falhas de gravação, índices corruptos, etc. etc....

    Agora, gostaria de passar algumas aplicações para um servidor que funcionasse também com a conexão pela Internet (coisa que não consigo usando a BDE com as tabelas que citei)... e a melhor opção que vislumbrei foi o MySQL, sendo que poderia "hospedar" os bancos de dados em um servidor Linux, podendo trocar alguns programas ISAPI ou CGI por programas PHP...

    Estou no caminho certo?

    Grato por qualquer ajuda!!!

    Observação 2:

    Para desenvolver, uso duas máquinas com XP e uma com LINUX:

    1) XP, Delphi6, IIS, PHP5, MySQL5 (a da mensagem acima);

    2) XP, Delphi6, Apache 2, PHP5, MySQL5

    3) Linux (Kurumin 6.1), Apache 2, PHP 4.4, MySQL 4 (nesta eu estou "sofrendo" mais... já que é a sétima tentativa com o Linux - quarta com o Kurumin - mas agora está indo!)...

    Novamente, grato por qualquer ajuda!

    :(

  10. Perfeito...

    Agora, sem querer explorar e já explorando... não consigo receber variáveis passadas pela explorer...

    Este form:

    ...
      <?php
        $a = "paulo";
      ?>
      <form name="form1" method="get" action="show.php">
        <input type="text" name="nome" value="
          <?php
            echo $a;
          ?>"
        >
        <input type="submit" name="confirma" value="ok">
      </form>
    ...
    
    Ao preencher o campo no form e enviar os dados, a seguinte linha é passada no endereço:
    http://sialtd:81/somaalim/show.php?nome=paulo&confirma=ok
    
    No entanto, o programa "show.php" não "recebe" a variável... O código do programa "show.php" é:
    <html>
      Resposta recebida?
      <?php
        echo "Nome recebido= ";
        echo $nome;
        echo ", ok?";
      ?>
    </html>
    

    Na verdade, recebo a mensagem:

    Notice: Undefined variable: nome in c:\inetpub\wwwroot\somaalim\show.php on line 5

    O que fazer para a variável ser "recebida"?

    Grato por qualquer ajuda!

    ! Só para esclarecer, estou tentando aprender a usar PHP, em troca de usar os CGI e ISAPI que desenvolvi em Delphi6, que só funcionam sob o IIS...

    Simultaneamente, instalei o Apache, PHP e MySQL em um WindowsXP (este, no qual estou dando os primeiros passos) e em um LinuxKurumin (sétima tentativa com o Linux, quarta com o Kurumin)... claro que no XP está sendo tudo muito mais fácil... mas creio que é só falta de tempo mesmo para pegar o jeito no Linux...

    Novamente, grato por qualquer ajuda!!!

  11. Olá.

    No seguinte código:

    <html>
      <body bgcolor="white">
        <h1>It works!</h1><br>
        <hr>
        <?php
          $nomeatual = "Paulo Victor";
          $a = "farinha";
          $b = "fubá";
          echo $nomeatual;
          echo ",&nbsp";
          echo "olá!<br><br>";
          echo "elemento a=";
          echo $a;
          echo " e elemento b=";
          echo $b;
          echo "<br>";
          if ($a == $b) then
            echo "são diferentes<br>";
          endif;
          ?>
          <br>
          <hr>
          <form method=get action="olaphp.php">
            <input type="text" name="nome" maxlength="20" width="30" value="
            <?php
              echo $nomeatual;
            ?>">
            <input type="submit" name="sub" value="Ok">
          </form>
      </body>
    </html>
    

    as Linhas if...endif simplesmente não funcionam (aliás, fazem com que nenhuma parte do código PHP funcione... aí, é só eliminar essas três linhas e esta paginazinha aparece... o que pode haver de errado na sintaxe deste if...endif?

    * O PHP instalado é o PHP/5.2.0 com o Apache 2.2.4 sob o WindowsXP (sem IIS);

    Gratos por qualquer ajuda!

  12. Oi.

    Você não está sendo muito claro... e provavelmente usando a query incorretamente...

    Então:

    O que você quer realmente?

    O total a receber, por data?

    select sum(valor) as soma, dt_venc
    from 'contas.dbf'
    where dt_venc between '12/01/2006' and '12/31/2006'
    group by dt_ven
    
    Um registro para cada data, com o total a receber nesta data, dentro do período indicado O total a receber, por pessoa?
    select sum(valor) as soma, nm_contato
    from 'contas.dbf'
    where dt_venc between '12/01/2006' and '12/31/2006'
    group nm_contato
    

    Um registro para cada pessoa, com o total a receber por pessoa, dentro do período indicado

    Ok?

  13. Oi pessoal...

    Isso é para abrir qualquer unidade pela letra...

    Só funciona com leitores de CD... não sei porque não funciona com os DVDs... quem quiser se arriscar a descobrir...

    Unit Unit1;
    
    Interface
    
    Uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, MMSystem, StdCtrls, MPlayer;
    
    Type
      TForm1 = class(TForm)
        MediaPlayer1: TMediaPlayer;
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    Var
      Form1: TForm1;
    
    Implementation
    
    {$R *.dfm}
    
    {********* Abre qualquer unidade (desde que seja CD), pela letra ********}
    Function OpenCD(Drive: Char): Boolean;
    Var
      Res: MciError;
      OpenParm: TMCI_Open_Parms;
      Flags: DWORD;
      S: string;
      DeviceID: Word;
    Begin
      Result := False;
      S := Drive + ':';
      Flags  := MCI_OPEN_TYPE or MCI_OPEN_ELEMENT;
      With OpenParm do Begin
        dwCallback := 0;
        lpstrDeviceType := 'CDAudio';
        lpstrElementName := PChar(S);
      End;{with OpenParm}
      Res := mciSendCommand(0, MCI_OPEN, Flags, Longint(@OpenParm));
      if Res <> 0 then Exit;
      DeviceID := OpenParm.wDeviceID;
      Try
        Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0);
        if Res = 0 then Exit;
        Result := True;
      Finally
        mciSendCommand(DeviceID, MCI_CLOSE, Flags, Longint(@OpenParm));
      End;
    End;
    
    {********* Fecha qualquer unidade (desde que seja CD), pela letra ********}
    Function CloseCD(Drive: Char): Boolean;
    Var
      Res: MciError;
      OpenParm: TMCI_Open_Parms;
      Flags: DWORD;
      S: string;
      DeviceID: Word;
    Begin
      Result := False;
      S := Drive + ':';
      Flags  := MCI_OPEN_TYPE or MCI_OPEN_ELEMENT;
      With OpenParm do Begin
        dwCallback := 0;
        lpstrDeviceType := 'CDAudio';
        lpstrElementName := PChar(S);
      End;
      Res := mciSendCommand(0, MCI_OPEN, Flags, Longint(@OpenParm));
      if Res <> 0 then Exit;
      DeviceID := OpenParm.wDeviceID;
      Try
        Res := mciSendCommand(DeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
        if Res = 0 then Exit;
        Result := True;
      Finally
        mciSendCommand(DeviceID, MCI_CLOSE, Flags, Longint(@OpenParm));
      End;
    End;
    
    {********** Jeito simples ***********}
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      mciSendstring('SET CDAUDIO DOOR OPEN WAIT', nil, 0, Self.Handle);
    End;
    
    {********** Abrindo com as funções ***********}
    
    Procedure TForm1.Button2Click(Sender: TObject);
    Begin
      // Abre quando os dois são CDs.. quando um é dvd, não abre (o dvd)...
      OpenCD('E');
      OpenCD('F');
    End;
    
    Procedure TForm1.Button3Click(Sender: TObject);
    Begin
      // Fecha quando os dois são CDs.. quando um é dvd, não fecha (o dvd)...
      CloseCD('E');
      CloseCD('F');
    End;
    
    end.
    

    Ok?

  14. Olá...

    Uso o código abaixo para abrir o leitor de gravador de CD no trabalho e também o gravador de CD/leitor de DVD em casa:

    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
      // Adicionar MMSystem;
      With MediaPlayer1 do Begin
        If (MediaPlayer1.Mode=mpOpen) then
          mciSendCommand(MediaPlayer1.DeviceID,MCI_SET,
                         MCI_SET_DOOR_CLOSED,0)
        Else
          mciSendCommand(MediaPlayer1.DeviceID,MCI_SET,
                         MCI_SET_DOOR_OPEN,0);
        {EndIf}
      End;{With MediaPlayer1}
    End;
    

    Funciona para ambos...

    Experimenta....

    Ok?

  15. Que bom que deu certo...

    Quanto à propriedade... acredito que seja necessário apenas porque não foi criada uma propriedade GetIcon em TImage...

    Assim, temos que usar um componente para fazer esta, digamos, transação... mesmo porque o Imagelist é bastante usado com lista de ícones, que transformam-se em ícones animados quando usamos um componente que coloca a aplicação na systray, como o componente "TrayIcons"...

    Acho que foi até a partir deste componente ("TrayIcons") que fiz essa rotina de passar bitmap para icone...

    E quanto à AddMasked, tem alguma coisa ligada à combinação da imagem a ser carregada com uma cor de fundo... e quando não usada com TransparentColor, provoca distorções no ícone...

    Agora... acho que o código não ficou complicado não...

    Mas, pode ser que alguém saiba algum jeitinho mais, digamos, direto!

    OK?

  16. Olá...

    Nem sei se isso vai ser muito complexo...

    Mas, coloca um Image no form, com um botão... carrega uma figura no Image e experimenta o código abaixo...

    Uso sempre isso para converter imagens para icones...

    As vezes o efeito não fica bem o desejado, então, acabo editando a imagem primeiro (usando o efeito blur ou embaçar) antes de converter para icone...

    Unit Bmp2iconUnit;
    
    Interface
    
    Uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;
    
    Type
      TForm1 = class(TForm)
        Button1: TButton;
        Image1: TImage;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    Var
      Form1: TForm1;
    
    Implementation
    
    {$R *.dfm}
    
    Procedure bmp2ico(Image: TImage; FileName: TFilename);
    Var
      Bmp: TBitmap;
      Icon: TIcon;
      ImageList: TImageList;
    Begin
      Bmp  := TBitmap.Create;
      Icon := TIcon.Create;
      Try
        Bmp.Assign(Image.Picture);
        ImageList := TImageList.CreateSize(Bmp.Width, Bmp.Height);
        Try
          ImageList.AddMasked(Bmp, Bmp.TransparentColor);
          ImageList.GetIcon(0, Icon);
          // Salvar isso no arquivo que você quiser...
          // Poderia ter colocado um savedialog lá no Button1click
          // para escolher o nome.
          Icon.SaveToFile(FileName);
        Finally
          ImageList.Free;
        End;
      Finally
        Bmp.Free;
        Icon.Free;
      End;
    End;
    
    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      // Se quiser, inclua um opendialog e Image1.Picture.LoadFromFile
      // aqui, e um save dialog para escolher o nome para salvar.
      bmp2ico(Image1, 'c:\test.ico');
    End;
    
    End.
    

    Ok?

  17. One of the commonly used dialog box components is TOpenDialog. This component is usually invoked by a New or Open menu item under the File option on the main menu bar of a form. The dialog box contains controls that let you select groups of files using a wildcard character and navigate through directories.

    The TOpenDialog component makes an Open dialog box available to your application. The purpose of this dialog box is to let a user specify a file to open. You use the Execute method to display the dialog box.

    When the user chooses OK in the dialog box, the user’s file is stored in the TOpenDialog FileName property, which you can then process as you want.

    The following code snippet can be placed in an Action and linked to the Action property of a TMainMenu subitem or be placed in the subitem’s OnClick event:

    if OpenDialog1.Execute then

    filename := OpenDialog1.FileName;

    This code will show the dialog box and if the user presses the OK button, it will copy the name of the file into a previously declared AnsiString variable named filename.

    Agora, traduzindo:

    Um dos componentes geralmente usados da caixa de diálogo é TOpenDialog.

    Este componente é invocado geralmente por um artigo de menu novo ou aberto sob a opção da lima na barra de menu principal de um formulário.

    A caixa de diálogo contem os controles que o deixam selecionar grupos das limas usando um caráter do wildcard e navigate através dos diretórios.

    O componente de TOpenDialog faz uma caixa de diálogo aberta disponível a sua aplicação.

    A finalidade desta caixa de diálogo é deixou um usuário especificar uma lima para abrir.

    Você usa o método executar indicar a caixa de diálogo.

    Quando o usuário escolhe ESTÁ BEM na caixa de diálogo, a lima do usuário está armazenada na propriedade do nome de arquivo de TOpenDialog, que você pode então processar enquanto você quer.

    O seguinte snippet do código pode ser colocado em uma ação e ser ligado à propriedade da ação de um subitem de TMainMenu ou ser colocado no evento de OnClick dos subitem:

    se OpenDialog1.Execute então

    se OpenDialog1.Execute então nome de arquivo: = OpenDialog1.FileName;

    Este código mostrará a caixa de diálogo e se o usuário pressionar a tecla APROVADA, copí o nome da lima em um nome de arquivo nomeado variável previamente declarado de AnsiString.

    Caro Arckyz.

    O texto em ingles é do próprio Help do Delphi... basta teclar F1 e procurar OpenDialog...

    Se você clicar em Localizar, verá também que o TOpenDialog aparece em inúmeros outros exemplos (de outros componentes e/ou procedures e funções)...

    Caso tenha dificuldades com o ingles, pode usar uma ferramenta de tradução... no caso, simplesmente copiei o texto do help e pedi pro BabelFish traduzir...

    Aqui vai outro exemplo:

    procedure TForm1.Button1Click(Sender: TObject);

    Var

    sArquivo: String;

    Begin

    if OpenDialog1.Execute then

    begin

    sArquivo := OpenDialog1.FileName;

    ShowMessage('Bom... o arquivo escolhido foi o '+sArquivo+' agora, escolha o que vai fazer com ele...');

    end;

    end;

    end.

    Ok?

  18. Olá!

    Curioso como coisas simples e que a gente faz sempre ficam escondidas em alguma fiapo do cérebro e custam a vir à tona!

    Fou só dar uma olhadinha naquele link e ver a soma * 24 para lembrar que no próprio código do programa eu faço a multipiplicação do sobra do valor resultante da função DaySpan por 24 para obter o tempo em horas... então, a query fica assim:

    Assim,

    select sequencial, roteiro,
           saidalocal, saidadatahora,
           chegadalocal, chegadadatahora,
           chegadadatahora-saidadatahora tempo_float,
           Cast((chegadadatahora-saidadatahora) *24 as integer) horas,
           (((chegadadatahora-saidadatahora) *24 ) -
           (Cast((chegadadatahora-saidadatahora) *24 as integer))) * 60 minutos 
    from 'viagens.dbf'
    
    retorna:
    
    .. saidadatahora       chegadadatahora     tempo_float       horas minutos
    .. 22/11/2006 10:00:00 22/11/2006 16:30:00 0,270833333333333 6     30
    .. 23/11/2006 10:10:00 23/11/2006 12:00:00 0,076388888888889 1     50
    
    
    Isso me dá o tempo em horas e minutos, diretamente na query... Antes, usava, dentro do programa, algo parecido com isto:
        dSaidaDataHora := FieldByName('SaidaDataHora').AsDateTime;
        dChegadaDataHora := FieldByName('ChegadaDataHora').AsDateTime;
        vDias    := DaySpan(dChegadaDataHora,dSaidaDataHora);
        iDias    := Trunc(vDias);
        vTempo   := (vDias-iDias);
        vHoras   := vTempo*24;
        iHoras   := Trunc(vHoras);
        vMinutos := ((vHoras-iHoras)*60);
        iMinutos := Trunc(vMinutos);
    
        // iHoras := HoursBetween(dChegadaDataHora,dSaidaDataHora);
        // iMinutos := MinutesBetween(dChegadaDataHora,dSaidaDataHora);
        ShowMessage('Dias   = '+IntToStr(iDias )+cr+
                    'Horas  = '+IntToStr(iHoras)+cr+
                    'Minutos= '+IntToStr(iMinutos)
                   );
    

    Valeu pela Ajuda!

  19. Oi.

    Infelizmente, a comparação entre dois campos timestamp resulta num valor real.

    Por exemplo:

    23/11/2006 12:50:00 - 23/11/2006 12:20:00 = 0,020833333333333

    Então, como converter isso para 30min?

    Grato por qualquer idéia!

    há! não uso o Visual Dbase 7... Uso os Delphi 3, 4, 6.

    As tabelas contendo timestamp (ou outros tipos especiais de campos, como autoinc) são criadas pelo Delphi no formato do Visual dBase7, se o driver padrão na bde estiver "dBase"...

    Já vi algumas serem criadas como dBaseIII+ (tabelas bem simples) e dBaseIV 2.0

  20. Bom... isso vai fazer o formulário ficar "sempre por cima":

    Procedure TForm1.Button1Click(Sender: TObject);
    Begin
      With Form1 do
        SetWindowPos(Handle, // "handle" para a janela
                     HWND_TOPMOST, // controla onde vai ficar a janela  (*¹)
                     Left,  // a posição horizontal
                     Top,   // a posição vertical
                     Width, // a largura
                     Height, // a altura
                     // opções de posicionamento da janela
                     SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE); // (*²)
    End;
    

    *¹ *²

    Existem outras opções, além de HWND_TOPMOST, ou SWP_NOSIZE

    Coloca o cursor antes, por exemplo de SWP_NOMOV e pressiona Control+Espaço e vai digitando S W P...

    O Delphi mostra as outras opções, que você pode testar...

    Ok?

  21. Curioso... aqui no Delphi6 e no Delphi4 não tenho erro nenhum...

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        StaticText1: TStaticText;
        BitBtn1: TBitBtn;
        StaticText2: TStaticText;
        procedure Button1Click(Sender: TObject);
        procedure BitBtn1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    Procedure TForm1.Button1Click(Sender: TObject);
    Var
      iContador: Integer;
    Begin
      StaticText1.Caption := 'algarismos: ';
      iContador := 1;
      while true do begin
        StaticText1.Caption := StaticText1.Caption+IntToStr(iContador)+' ';
        Inc(iContador);
        If iContador=11 then
          Break;
        {EndIf iContador=11}
      End;{while true}
    End;
    
    Procedure TForm1.BitBtn1Click(Sender: TObject);
    Var
      x, y: integer;
    Begin
      x:=200;
      y:=2147483000;
      while true do begin
        y:=y+3;
        StaticText2.Caption := 'y='+IntToStr(y)+' e '+
                               'x='+IntToStr(x)+'!';
        Application.ProcessMessages;
        Sleep(0025);
      End;{while true}
    End;
    
    End.
    

    Estranho esse seu compilador...

  22. Oi pessoal...

    Tenho uma tabela para armazenar roteiros de viagens.

    Alterei alguns campos na tentativa de obter outros calculados, diretamente nas queries que consultam os dados gravados...

    No exemplo a seguir, é criada uma tabela (básica) e, o que se pretende conseguir, é o tempo, em dias e horas, através da comparação da data+hora de um campo com outro...

    
    Query 1. Criando a tabela (Visual dBase7, pelo DBExplorer).
    
    create table 'viagens.dbf'
    (
    sequencial      autoinc,
    roteiro         char(10),
    saidalocal      char(20),
    saidadatahora   timestamp,
    chegadalocal    char(20),
    chegadadatahora timestamp,
    empresa char(20)
    )
    
    Query 2. Inserindo dados, saída de Juiz de Fora, Chegada a Belo Horizonte.
    
    insert into 'viagens.dbf'
    (
    roteiro,
    saidalocal,
    saidadatahora,
    chegadalocal,
    chegadadatahora,
    empresa
    )
    values
    (
    'JDFFOR01',
    'JDF TERM ROD.','11/22/2006 10:00:00',
    'BHZ TERM ROD.','11/22/2006 16:30:00',
    'Atual'
    )
    
    Query 3. Inserindo dados, saída de Belo Horizonte, Chegada a Salvador.
    
    insert into 'viagens.dbf'
    (
    roteiro,
    saidalocal,
    saidadatahora,
    chegadalocal,
    chegadadatahora,
    empresa
    )
    values
    (
    'JDFFOR01',
    'BH CFZ','11/22/2006 23:40:00',
    'SALVADOR SSA','11/23/2006 00:10:00',
    'Gol'
    )
    
    Query 4. Inserindo dados, saída de Salvador, Chegada a Fortaleza.
    
    insert into 'viagens.dbf'
    (
    roteiro,
    saidalocal,
    saidadatahora,
    chegadalocal,
    chegadadatahora,
    empresa
    )
    values
    (
    'JDFFOR01',
    'SALVADOR SSA ','11/23/2006 10:10:00',
    'FORTALEZA FOR','11/23/2006 12:00:00',
    'OceanAir'
    )
    
    Query 5. Inserindo dados, saída do Aeroporto de Fortaleza, Chegada à Praia de Iracema.
    
    insert into 'viagens.dbf'
    (
    roteiro,
    saidalocal,
    saidadatahora,
    chegadalocal,
    chegadadatahora,
    empresa
    )
    values
    (
    'JDFFOR01',
    'FORTELEZA FOR ','11/23/2006 12:20:00',
    'FORTALEZA PRAIA IRACEMA','11/23/2006 12:50:00',
    'mototaxi'
    )
    
    
    Query 6. Inserindo dados, saída da areia, Chegada à boca do Tubarão.
    
    insert into 'viagens.dbf'
    (
    roteiro,
    saidalocal,
    saidadatahora,
    chegadalocal,
    chegadadatahora,
    empresa
    )
    values
    (
    'JDFFOR01',
    'FORTELEZA PRAIA AREIA','11/23/2006 12:50:00',
    'FORTALEZA MAR TUBARAO','11/23/2006 12:55:00',
    'byfoot'
    )
    
    Query 7, para ver todos os dados:
    
    select * from 'viagens.dbf'
    
    
    Query 8, para ver os dados, e tentar calcular o tempo entre uma chegada e a respectiva saída.
    
    select sequencial, roteiro,
           saidalocal, saidadatahora,
           chegadalocal, chegadadatahora,
           (chegadadatahora-saidadatahora) tempo_a,
           Cast(
                Cast('01/01/1980 00:00:00' as date)+
            ((chegadadatahora-saidadatahora)*3600)
            as timestamp
           ) tempo_b,
          
    from 'viagens.dbf'
    

    Como se pode observar, é feito um cálculo entre as colunas ... como converter isso para

    dd/mm/aaaa hh:mm:ss

    Alguma idéia?

    Grato!

    * Aquele "cast" com 01/01/1980 foi só um chute pra ver no que é que dava!

  23. True = Verdadeiro...

    Então

    while true do begin
      // Tarefas... tarefas... tarefas...
      // Quando quiser interromper o "loop", é só dar Break!
    End;
    
    Isto é perfeitamente válido... no meu tempo de MWBasic:
    Rem -1 = True
    ok = -1
    While ok 
      Write "Vou ficar repetindo isto toda vida, até alguém colocar ok=0"
    Wend
    
    o que seria o mesmo que fazer:
    Rem -1 = True
    ok = -1
    While ok = (-1)
      Write "Vou ficar repetindo isto toda vida, até alguém colocar ok=0"
    Wend
    
    ou
    Rem -1 = True
    ok = -1
    While not (ok = 0)
      Print "Vou ficar repetindo isto toda vida, até alguém colocar ok=0"
    Wend
    

    E para quê fazer um loop "sem condição" ou "condição infinita"?

    Tenho programas que "rodam" como serviços (é... dá para transformar seus aplicativos Delphi em serviços executados nos WinXP, NT, 2000, 2003..., no mínimo a partir do Delphi6 - o que eu uso) e estes programas funcionam em um loop infinito...

    Como exemplo, tenho um validador de inscrição estadual que atende a programas antigos em Clipper - rodando em 386's, 486's, etc..., conectados a um servidor (XP) e que precisam verificar se uma I.E. é válida, enviando a requisição desta consulta pela rede, diretamente ao "serviço" sendo executado no servidor.

    Como a DLL de validação fornecida pela SEF-RS não roda sob Win311 ou MsDOS, precisei criar este serviço para isso...

×
×
  • Criar Novo...