Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   XpManifest en Tu Aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=58791)

look 31-07-2008 23:04:49

XpManifest en Tu Aplicacion
 
hola compañeros estube pensando en utilizar el componente de XpManifest para darle un estilo xp a mi aplicacion que hice en delphi 7, pero me surgen algunas dudas al utilizar este componente y una de ellas es , ¿ este componente ara mas lenta mi aplicacion?, mi aplicacion corre a una rapidez muy aceptable , me gustarian que basado en su experiencia me digan si es recomendable o no el uso de este componente... :)

egostar 31-07-2008 23:13:05

Hola,

Pues yo no veo que mis aplicaciones tenga algún efecto secundario con ese componente, pero no se si es porque estoy usando Turbo Delphi, desconozco si algo pase en D7 aunque casi estoy seguro que no.

Salud OS

Caro 01-08-2008 00:22:24

Hola look, que vuelva mas lenta a tu aplicación creo que no, por lo menos yo no lo he notado. Pero si he tenido un problema, que una vez que colocas el xpManifest, no puedes cambiarle el color a los Panel que uses, toma el color de tu formulario, pero solo en tiempo de ejecución, en diseño te lo respeta. Eso si me ha traido dolores de cabeza hasta darme cuenta que eso lo causaba el xpManifest.

Saluditos

Khronos 01-08-2008 01:43:09

Cita:

Empezado por Caro (Mensaje 304868)
Hola look, que vuelva mas lenta a tu aplicación creo que no, por lo menos yo no lo he notado. Pero si he tenido un problema, que una vez que colocas el xpManifest, no puedes cambiarle el color a los Panel que uses, toma el color de tu formulario, pero solo en tiempo de ejecución, en diseño te lo respeta. Eso si me ha traido dolores de cabeza hasta darme cuenta que eso lo causaba el xpManifest.

Saluditos

Eso es una tontería, los TPanel tienen una propiedad llamada ParentBackGround, la pones a false y te toma el Color que le hayas asignado.

En cuanto a lo de volver más lenta tu aplicación, sinceramente, lo dudo.
Salu2

Caro 01-08-2008 03:09:00

Cita:

Empezado por Khronos (Mensaje 304884)
Eso es una tontería, los TPanel tienen una propiedad llamada ParentBackGround, la pones a false y te toma el Color que le hayas asignado.

Pues esa tontería como le llamas me ha traido dolores de cabeza, ademas cuando añades un Panel a tu formulario ya viene con la propiedad ParentBackGround=False, no sabía que para que acepte el color tenía que poner en True dicha propiedad y despues nuevamente a False.

Saluditos

dec 01-08-2008 03:33:08

Hola,

No, lo cierto es que no es una tontería. Claro, el que sabe, sabe... pero, personalmente, he tenido algún que otro quebradero de cabeza con el asunto de los colores, los paneles y el "XP Manifiest" de que hablamos. Todavía es el día en que no me queda del todo claro el asunto. :rolleyes:

roman 01-08-2008 17:13:50

Recuerdo que hace no mucho, el compañero cHackAll contestó acertadamente a esta cuestión, pero no encuentro el hilo. Si no me equivoco, consistía en poner un código nada obvio.

Al no encontrar el hilo, busqué en tamaracka y encontré esta sorprendente respuesta:

Cita:

En el IDE, poner la propiedad ParentBackGround, primero en true y luego en false.
Desde luego una broma ¿no?

Pues no. Lo hice, y funcionó. Al parecer, al menos en Delphi 7, se trata de un bug en la forma en que se almacena el valor en el dfm.

// Saludos

dec 01-08-2008 17:32:19

Hola,

He de decir que en Delphi 2007 parece estar solucionado ese problema, puesto que yo lo probé ayer mismo y esa propiedad "ParentBackground" venía en "true", la cambié a "false", y el panel mantuvo el color rojo que le puse, aunque estaba usando el "XP Manifiest". Seguramente en versiones anteriores ocurre lo que dices Román. En mis malos recuerdos alrededor de este asunto aparezco trabajando con Delphi 7, y no con Delphi 2007.

Delphius 01-08-2008 18:07:18

Hola, disculpen que moleste. Hace tiempo yo hice una prueba con algo relacionado con el tema... es posible que esa dichosa propiedad tenga algo que ver con esto?¿O se tratará de algo parecido?:confused:

Saludos,

egostar 01-08-2008 18:32:51

Cita:

Empezado por dec (Mensaje 305017)
Hola,

He de decir que en Delphi 2007 parece estar solucionado ese problema, puesto que yo lo probé ayer mismo y esa propiedad "ParentBackground" venía en "true", la cambié a "false", y el panel mantuvo el color rojo que le puse, aunque estaba usando el "XP Manifiest". Seguramente en versiones anteriores ocurre lo que dices Román. En mis malos recuerdos alrededor de este asunto aparezco trabajando con Delphi 7, y no con Delphi 2007.

También está así en mi Turbo Delphi (versión 2006 de Delphi)

Salud OS

roman 01-08-2008 18:43:59

Cita:

Empezado por Delphius (Mensaje 305031)
Hola, disculpen que moleste. Hace tiempo yo hice una prueba con algo relacionado con el tema... es posible que esa dichosa propiedad tenga algo que ver con esto?¿O se tratará de algo parecido?:confused:

Pues no sé Delphius; acabo de hacer la prueba con Delphi 7 y XP y no noto ese comportamiento que describes.

// Saludos

Delphius 01-08-2008 19:20:18

Se me olvidó mencionar que yo ando con D6, esa propiedad no posee el Panel en D6.

Pues roman, yo si observo ese efecto. Cuando uno redimensiona el form para hacerlo más grande se ve... pero distinto es cuando lo achica, alli se ve que se comporta adecuadamente.:confused:

¿Será algo de D6? Con los otros componentes parece funcionar apropiadamente, al menos yo he probado con muchos controles a ver si detectaba algo raro, y se adaptan bien al tema. Es el TStatusBar el que causa el efecto molesto cuando el form está bsSizeable.

Saludos,

cHackAll 01-08-2008 19:56:04

Cita:

Empezado por roman (Mensaje 305007)
Recuerdo que hace no mucho, el compañero cHackAll contestó acertadamente a esta cuestión, pero no encuentro el hilo. Si no me equivoco, consistía en poner un código nada obvio...

Hola, hablamos de este hilo, post #6?

PD; que significa eso de "un código nada obvio" :rolleyes:

Saludos

roman 01-08-2008 20:09:23

Más bien me refería a este.

Un código nada obvio es aquél que no se me ocurre a mi :D

// Saludos

dec 01-08-2008 20:16:23

Hola,

¿Un código nada obvio? ¡Marchando!

Código PHP:

<?php

class GbDefensio extends GbPlugin 
{  
  private 
$statsCache;
  
  public function 
__construct($pluginData){
    
$this->statsCache = array();
    
parent::__construct($pluginData);
  }
  
  public function 
OnActivatePlugin(){
    if(
$this->PrepareDatabase()){
      
$this->SetOptions($this->GetDefaultOptions(), 1);
    }else{
      return new 
GbError(
        
$this->_rp('Sorry, GbDefensio cannot be install')
      );
    }
  }
  
  public function 
OnDeactivatePlugin(){
    if(!
$this->DeleteDatabase()){
      return new 
GbError(
        
$this->_rp('Sorry, GbDefensio cannot be uninstall')
      );
    }
  }

  public function 
ActionCallback($actionID$args){
    if(
$actionID == GBPLUGINS_ACTION_COMMENT_NEW){
      
$this->CheckNewComment($args);
    }elseif(
$actionID == GBPLUGINS_ACTION_COMMENTS_UPDATE){
      
$this->CheckUpdateComments($args);          
    }
    return 
null;
  }
    
  public function 
ShowStats(){
    
$stats $this->GetStats();
    if(!empty(
$stats)){
      
$falsePos sprintf(
        
$this->_rp('%s false positives'), 
        
$stats['false-positives']
      );      
      
$falseNeg sprintf(
        
$this->_rp('%s false negatives'), 
        
$stats['false-negatives']
      );      
      
$accuracy sprintf(
        
$this->_rp('%s %% accuracy'), 
        
round($stats['accuracy'] * 1002)
      );
      
$spam sprintf(
        
$this->_rp('%s spam'), $stats['spam']
      );
      
$ham sprintf(
        
$this->_rp('%s innocents'), $stats['ham']
      );
      
$ham StrUtils::SafeHtm($ham);      
      
$spam StrUtils::SafeHtm($spam);
      
$accuracy StrUtils::SafeHtm($accuracy);
      
$falsePos StrUtils::SafeHtm($falsePos);
      
$falseNeg StrUtils::SafeHtm($falseNeg);
      echo
"
       <div class=\"gbdefensiostats\">
        <ul>
         <li class=\"accuracy\">
{$accuracy}</li>
         <li class=\"spam\">
{$spam}</li>
         <li class=\"ham\">
{$ham}</li>
         <li class=\"falsepos\">
{$falsePos}</li>
         <li class=\"falseneg\">
{$falseNeg}</li>
        </ul>                  
       </div>"
;
    }
    return 
true;    
  }
  
  public function 
ShowCounter($args = array()){    
    
$stats $this->GetStats();
    if(!empty(
$stats)){
      
$defaultArgs = array(
        
'skin' => 'light'
      
);
      
$args array_merge($defaultArgs$args);      
      
$imgPath $this->GetDirImagesPath().GBDEFENSIO_COUNTER_IMAGE;
      if(
is_readable($imgPath)){
        
$query http_build_query(array(
          
'skin' => $args['skin'],
          
'number' => $stats['spam']
        ));
        
$imgDir $this->GetDirImagesUrl();
        
$imgUrl $imgDir.GBDEFENSIO_COUNTER_IMAGE.'?'.$query;
        
$imgText StrUtils::SafeHtm(
         
$this->_rp('%s SPAM caught by GbDefensio'));
        
$imgText sprintf($imgText$stats['spam']);
        
printf(
          
'<div class="gbdefensiocounter">
            <a href="http://www.defensio.com/" title="%s"><img 
             src="%s" alt="%s" width="120" height="50" /></a>
           </div>'
$imgText$imgUrl$imgText
        
);
      }
    }
    return 
true;
  }  
  
  public function 
OptionsCallback(){
    
$errors $success = array();
    
$options $this->FillOptions();
    
$apikey $options[GBDEFENSIO_OPT_APIKEY];    
    if(
G::GetVar(INPUT_REQUEST_FORMSUBMIT)){
      
$apikey trim(G::GetVar(GBDEFENSIO_OPT_APIKEY));
      if(
$this->ValidateApikey($apikey)){
        
$options[GBDEFENSIO_OPT_APIKEY] = $apikey;
        
$this->SetOptions($options1);
        
$success[] = $this->_rp('Options saved, API key validated');
      }else{
        
$errors[] = $this->_rp('The API key cannot be validated');
      }
      
XHtmlAdmin::FormResults($errors$successtrue);
    }
    
?>
    <p>
     <?php echo StrUtils::SafeHtm(
      
$this->_rp('Visit the Defensio website to obtain your own API Key')) ?>
     <a href="http://www.defensio.com/" 
      title="<?php echo StrUtils::SafeHtm($this->_rp('click here')) ?>">
       <?php echo StrUtils::SafeHtm($this->_rp('click here')) ?></a>
    </p>
    <p>
     <label>
      <input value="<?php echo StrUtils::SafeHtm($apikey?>
       style="width: 30%" type="text" name="<?php echo GBDEFENSIO_OPT_APIKEY ?>" />
        <?php echo StrUtils::SafeHtm($this->_rp('Your Defensio API Key')) ?>
     </label>
    </p>
    <p>
     <input type="submit" id="submit" name="submit" 
      value="<?php echo StrUtils::SafeHtm($this->_rp('Save options')) ?>" />
    </p>
    <?php
    
return true;
  }
  
  private function 
GetStats(){
    if(empty(
$this->statsCache)){
      
$options $this->FillOptions();
      
$apikey $options[GBDEFENSIO_OPT_APIKEY];
      if(
$this->ValidateApikey($apikey)){
        
$blogUrl GbUrls::GetBlogRootUrl();
        
$params = array('owner-url' => $blogUrl);      
        
$defensio = new Defensio($apikey$blogUrl);
        
$response $defensio->get_stats($params); 
        if(
$this->IsDefensioSuccessResponse($response)){
          
$this->statsCache $response;
          return 
$response;
        }
      }
      return 
null;
    }else{
      return 
$this->statsCache;  
    }
  }
  
  private function 
GetComments($commentIDs){
    global 
$gbdb;
    
$idsToSql '';
    
$sqlLimit count($commentIDs);
    foreach(
$commentIDs as $commentID){
      
$commentID $gbdb->Escape($commentID);
      if(
$idsToSql == ''){
        
$idsToSql .= sprintf('"%s"'$commentID);
      }else{
        
$idsToSql .= sprintf(',"%s"'$commentID);
      }
    }
    return 
$gbdb->GetResults(sprintf(
      
GBDEFENSIO_SQL_GET_COMMENTS
      
$idsToSql$gbdb->Escape($sqlLimit)
    ));
  }
  
  private function 
CheckNewComment($comment){
    
$options $this->FillOptions();
    
$apikey $options[GBDEFENSIO_OPT_APIKEY];
    if((
trim($apikey) != '') && $this->ValidateApikey($apikey)){
      
$blogUrl GbUrls::GetBlogRootUrl();
      
$params = array(
        
'owner-url' => $blogUrl,
        
'article-date' => date('Y/m/d'),
        
'user-ip' => G::GetVar('REMOTE_ADDR'),
        
'comment-type' => $comment['commenttype'],
        
'trusted-user' => G::UserIsAuthenticated(),
        
'comment-content' => $comment['commentcontent'],
        
'comment-author' => $comment['commentauthorname'],
        
'comment-author-url' => $comment['commentauthorurl'],
        
'comment-author-email' => $comment['commentauthoremail']
      );
      
$defensio = new Defensio($apikey$blogUrl);
      
$response $defensio->audit_comment($params);
      if(
$this->IsDefensioSuccessResponse($response)){
        
$this->UpdateComment($comment['commentid'],$response);
      }
    }
    return 
true;  
  }
  
  public function 
CheckUpdateComments($commentsIDs){
    
$options $this->FillOptions();    
    
$apikey $options[GBDEFENSIO_OPT_APIKEY];
    if((
trim($apikey) != '') && $this->ValidateApikey($apikey)){    
      
$falsePositives $falseNegatives = array();
      
$commentsData $this->GetComments($commentsIDs);
      if(!empty(
$commentsData)){
        foreach(
$commentsData as $comment){
          if(!empty(
$comment->comment_defensio)){
            
$commentType $comment->comment_type;            
            
$defensioData unserialize($comment->comment_defensio);
            
$defensioSign $defensioData['signature'];
            
$isDefensioSpam = ($defensioData['spam'] == 'true');
            
$isCommentSpam = ($commentType == GBDB_COMMENT_TYPE_SPAM);
            if(!
$isCommentSpam && $isDefensioSpam){
              
$falsePositives[] = $defensioSign;
            }elseif(
$isCommentSpam && !$isDefensioSpam){
              
$falseNegatives[] = $defensioSign;
            }
          }
        }
        if(!empty(
$falsePositives
         || !empty(
$falseNegatives)){
           
$this->ReportUpdates(array(
             
$falsePositives
             
$falseNegatives
           
));          
        }
      }
    }
    return 
true;
  }
  
  private function 
ReportUpdates($reportData){
    
$options $this->FillOptions();
    
$blogUrl GbUrls::GetBlogRootUrl();
    
$apikey $options[GBDEFENSIO_OPT_APIKEY];
    
$defensio = new Defensio($apikey$blogUrl);
    if(!empty(
$reportData[0])){
      
$signatures $this->PrepareSignatures(
       
$reportData[0]);
      
$defensio->report_false_positives(
       array(
'signatures' => $signatures));
    }
    if(!empty(
$reportData[1])){
      
$signatures $this->PrepareSignatures(
       
$reportData[1]);            
      
$defensio->report_false_negatives(
       array(
'signatures' => $signatures));           
    }
    return 
true;    
  }

  private function 
PrepareSignatures($signatures){
    
$result '';
    foreach(
$signatures as $signature){
      if(
$result ''){
        
$result .= $signature;
      }else{
        
$result .= sprintf(',%s'$signature);
      }
    }
    return 
$result;
  }
  
  
  private function 
UpdateComment($commentID$defensioData){
    global 
$gbdb;
    
$storeData serialize(array(
      
'spam' => $defensioData['spam'],
      
'spaminess' => $defensioData['spaminess'],
      
'signature' => $defensioData['signature']
    ));
    if(
$defensioData['spam'] == 'true'){
      
$affectedRow $gbdb->Execute(sprintf(
        
GBDEFENSIO_SQL_UPDATE_COMMENT,
        
GBDB_COMMENT_TYPE_SPAM,
        
$gbdb->Escape($storeData), 
        
$gbdb->Escape($commentID)
      ));
    }else{
      
$affectedRow $gbdb->Execute(sprintf(
        
GBDEFENSIO_SQL_UPDATE_DEFENSIO,
        
$gbdb->Escape($storeData), 
        
$gbdb->Escape($commentID)
      ));
    }
    return (
$affectedRow == 1);
  }
  
  private function 
ValidateApikey($apikey){
    if(
$this->RequireDefensioClass()){
      
$blogUrl GbUrls::GetBlogRootUrl();
      
$defensio = new Defensio($apikey$blogUrl);
      
$params = array('owner-url' => $blogUrl);
      
$response $defensio->validate_key($params);
      return 
$this->IsDefensioSuccessResponse($response);
    }else{
      return 
false;  
    }
  }
  
  private function 
IsDefensioSuccessResponse($response){
    return 
is_array($response
     && isset(
$response['status']) 
      && (
$response['status'] == 'success');  
  }
  
  private function 
RequireDefensioClass(){
    
$script $this->GetDirPScriptsPath()
               .
GBDEFENSIO_CLASS_SCRIPT;
    if(
is_readable($script)){
      require_once(
$script);
      return 
true;
    }else{
      return 
false;  
    }
  }  
  
  private function 
FillOptions(){
    
$options $this->GetOptions();
    if(
is_array($options)){
      return 
$options;
    }else{
      return 
$this->GetDefaultOptions();
    }    
  }
  
  private function 
GetDefaultOptions(){
    return array(
      
GBDEFENSIO_OPT_APIKEY => ''
    
);    
  }

  private function 
PrepareDatabase(){
    if(
$this->DatabaseExists()){
      if(
$this->DeleteDatabase()){
        return 
$this->CreateDatabase();  
      }else{
        return 
false;  
      }
    }else{
      return 
$this->CreateDatabase();
    }
  }
  
  private function 
CreateDatabase(){
    
$GLOBALS['gbdb']->Execute(
     
GBDEFENSIO_SQL_INSTALL_DEFENSIO);
    return 
$this->DatabaseExists();
  }
  
  private function 
DeleteDatabase(){
    
$GLOBALS['gbdb']->Execute(
     
GBDEFENSIO_SQL_DELETE_DEFENSIO);
    return !
$this->DatabaseExists();
  }
  
  private function 
DatabaseExists(){
    global 
$gbdb;
    
$usingCache $gbdb->IsQueriesCacheOn();
    if(
$usingCache){
      
$gbdb->SetQueriesCacheOff();  
    }
    
$fields $gbdb->GetResults(
      
GBDEFENSIO_SQL_DESCRIBE_COMMENTS);
    if(
$usingCache){
      
$gbdb->SetQueriesCacheOn();    
    }
    if(!empty(
$fields)){
      foreach(
$fields as $field){
        if(
$field->Field 
         
== GBDEFENSIO_TABLE_FIELD_NAME){
           return 
true;
        }
      }
      return 
false;
    }else{
      return 
false;
    }
  }  
}

?>

No lo quería poner, por lo de no desvirtuar los hilos... :rolleyes: :) :D ;)

cHackAll 01-08-2008 20:19:07

Cita:

Empezado por roman (Mensaje 305081)
Más bien me refería a este.

Un código nada obvio es aquél que no se me ocurre a mi :D

// Saludos

Ahhh :D

Saludos

roman 01-08-2008 20:36:30

Nada, nada. Indiscutiblemente el código menos obvio que se ha visto jamás en estos foros es éste.

// Saludos

dec 01-08-2008 20:39:11

Je je je... ;) :D

Hum... ¡no puedo evitar copiar aquí este otro!

Código PHP:

<?php

class GbMarkdown extends GbPlugin 
{  
  public function 
OnActivatePlugin(){}
  public function 
OnDeactivatePlugin(){}
  
  public function 
FilterCallback($filterID$content){
    if((
$filterID == GBPLUGINS_FILTER_POST_CONTENT
     && 
is_readable($this->GetDirPScriptsPath().GBMARKDOWN_MAIN_SCRIPT)){
       require_once(
$this->GetDirPScriptsPath().GBMARKDOWN_MAIN_SCRIPT);
       return 
Markdown(html_entity_decode($content));
    }
    return 
$content;
  }
}

?>

Total, el hilo ya se ha desvirtuado. :D :D

cHackAll 01-08-2008 20:59:34

Cita:

Empezado por roman (Mensaje 305094)
Nada, nada. Indiscutiblemente el código menos obvio que se ha visto jamás en estos foros es éste...

El menos obvio no, pero si muy curioso!

Cita:

Empezado por dec (Mensaje 305096)
...Hum... ¡no puedo evitar copiar aquí este otro!
... Total, el hilo ya se ha desvirtuado. :D :D

hey Dec; eso es GesBit mania?

Y ya que mis conflictos anti-postear se han desvaneciendo temporalmente, cuelo el siguiente codigo que, hace que un proceso no sea finalizable... claro que es una version "lite", pero mejor asi ;)

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
 Acl: TACL; hSC: cardinal;
 SecurityDescriptor: TSecurityDescriptor;
begin
 InitializeACL(Acl, SizeOf(Acl), 2);
 InitializeSecurityDescriptor(@SecurityDescriptor, 1);
 SetSecurityDescriptorDACL(@SecurityDescriptor, True, @Acl, False);
 SetKernelObjectSecurity(DWORD(-1), DACL_SECURITY_INFORMATION, @SecurityDescriptor);
end;

PD; si, creo que me pico el mismo bicho que a Dec. :D :rolleyes::rolleyes::rolleyes:

Saludos

Delphius 01-08-2008 21:04:09

Disculpen que desvirtue nuevamente el tema.

¡Funciona!:):eek::)
Ahora el StatusBar no muestra el molesto efecto visual del "Grip" al redimensionar.
No se porque funciona ahora, sabiendo que ya antes lo había probado. La solución: establecer el valor TRUE a la propiedad DoubleBuffered del StatusBar.

Listo, por fin aquella duda vieja que tenía queda solucionada! Para el que tenga D6, use StatusBar y Manifest... recuerde: DoubleBuffered!

Saludos,


La franja horaria es GMT +2. Ahora son las 11:42:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi