Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-02-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
martonbarbosa,

Cita:
Empezado por martonbarbosa
...como puedo hacer que los numeros contenidos en esta linea...aumenten solos... hasta encontrar el valor "Identifier"...
Revisa este código basado en el código del Msg #2:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
   i, j, k, l : Integer;
   Reg : TRegistry;
   s : string;

begin

   try

      ListBox1.Clear;

      Reg := TRegistry.Create;

      Reg.RootKey := HKEY_LOCAL_MACHINE;

      if Reg.OpenKey('HARDWARE\DEVICEMAP\Scsi',False) then
      begin

         for i := 0 to 255 do
         begin
            Reg.CloseKey;
            if Reg.OpenKey('HARDWARE\DEVICEMAP\Scsi\Scsi Port ' + IntToStr(i),False)
            then
               for j := 0 to 255 do
               begin
                  Reg.CloseKey;
                  if Reg.OpenKey('HARDWARE\DEVICEMAP\Scsi\Scsi Port ' + IntToStr(i)
                                 + '\Scsi Bus ' + IntToStr(j),False)
                  then
                     for k := 0 to 255 do
                     begin
                        Reg.CloseKey;
                        if Reg.OpenKey('HARDWARE\DEVICEMAP\Scsi\Scsi Port ' + IntToStr(i)
                                       + '\Scsi Bus ' + IntToStr(j)
                                       + '\Target Id ' + IntToStr(k),False)
                        then
                           for l := 0 to 255 do
                           begin
                              Reg.CloseKey;
                              if Reg.OpenKey('HARDWARE\DEVICEMAP\Scsi\Scsi Port ' + IntToStr(i)
                                             + '\Scsi Bus ' + IntToStr(j)
                                             + '\Target Id ' + IntToStr(k)
                                             + '\Logical Unit Id ' + IntToStr(l), False)
                              then
                                 begin
                                    s := 'HARDWARE\DEVICEMAP\Scsi\Scsi Port ' + IntToStr(i)
                                         + '\Scsi Bus ' + IntToStr(j)
                                         + '\Target Id ' + IntToStr(k)
                                         + '\Logical Unit Id ' + IntToStr(l);

                                    s := s  + '\Identifier = '
                                         + GetKeyValue(HKEY_LOCAL_MACHINE, s, 'Identifier');

                                    ListBox1.Items.Add(s);
                                   
                                 end;
                           end;
                     end;
               end;
         end;
      end;

   finally
      Reg.Free;
   end;

end;
El código anterior leerá la clave HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi del Registro de Windows y obtendrá el valor Identifier de todas las subclaves predeterminadas que lo contienen almacenando el resultado en un control TListBox hasta 256 niveles por cada subclave leida.

El resultado del código anterior en una Máquina Virtual con Windows XP Professional x32 es el siguiente:



Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 26-02-2013 a las 10:58:34.
Responder Con Cita
  #2  
Antiguo 26-02-2013
martonbarbosa martonbarbosa is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 15
Poder: 0
martonbarbosa Va por buen camino
Hola
Antes que nada, Gracias ecfisa y nlsgarcia!!!

Ni bien llegue a mi casa, pongo a prueba ambos ejemplos y les comento... a simple vista el codigo que ando buscando es el que propone nlsgarcia!

Pero bueno, lo pruebo y les comento!!!

Muchisimas gracias a los 2!

Salu2

M@rton
Responder Con Cita
  #3  
Antiguo 27-02-2013
martonbarbosa martonbarbosa is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 15
Poder: 0
martonbarbosa Va por buen camino
Hola

nlsgarcia...

tu codigo me tiro un error en la siguiente linea ¬¬

"GetKeyValue(HKEY_LOCAL_MACHINE, s, 'Identifier');"

me dice: Undeclarated identifier = GetKeyValue...

raro che...

y con respeto a tu codigo ecfisa, anda... pero el tema es que yo tengo que escribir a mano la ruta entera...
lo que ando buscando es mas o menos lo que hizo nlsgarcia... o quiero recorrer todo y traer todos los identifier encontrados en HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi...

Desde ya muchisimas gracias.
M@rton
Responder Con Cita
  #4  
Antiguo 27-02-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
martonbarbosa,

Cita:
Empezado por martonbarbosa
...tu codigo me tiro un error en la siguiente linea...
El código del Msg #7 está disponible en el siguiente link: http://terawiki.clubdelphi.com/Delph...Registry-1.rar

Este código fue probado en tres Máquinas Virtuales con Windows XP Professional x32, Windows 7 Professional x32 y x64 y una Máquina Física con Windows 7 Professional x32 y en todos los casos funcionó correctamente.

Espero sea útil

Nelson.
Responder Con Cita
  #5  
Antiguo 27-02-2013
martonbarbosa martonbarbosa is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 15
Poder: 0
martonbarbosa Va por buen camino
nlsgarcia! disculpame...

es que me olvide de incluir la funcion GetKeyValue...

Código Delphi [-]
function GetKeyValue(const aRootKey: HKEY; const aKey, aName: string): string;
var
   rd: TRegDataInfo;
   size: Cardinal;
   st: string;

begin
   with TRegistry.Create do
   try

      RootKey:= aRootKey;

      st := '';

      if OpenKey(aKey, False) then
      begin
         if GetDataInfo(aName, rd) then
         case rd.RegData of
            rdUnknown : Result := '';
            rdInteger : Result := IntToStr(ReadInteger(aName));
            rdString , rdExpandString : Result := ReadString(aName);
            rdBinary : begin
                          size:= GetDataSize(aName);
                          SetLength(st, size);
                          ReadBinaryData(aName, PChar(st)^, size);
                          Result:= st;
                       end;
         end;
         CloseKey;
      end

   finally
      Free;
   end;
end;

ahora si anda... jajaja bueno muchisimas gracias!

ahora solo me queda adaptarlo a mis necesidades!

Desde ya muchisimas gracias.
los mantengo al tanto!

Salu2
M@rton
Responder Con Cita
  #6  
Antiguo 28-02-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Marton.
Cita:
Empezado por martonbarbosa Ver Mensaje
y con respeto a tu codigo ecfisa, anda... pero el tema es que yo tengo que escribir a mano la ruta entera...
Si, eso es lo que había entendido que deseabas hacer...

Aunque nlsgarcia ya te dió una muy buena solución, otra opción para lograrlo es:
Código Delphi [-]
uses Registry;

procedure TForm1.FindValueName(aRootKey: HKEY; aKeyName, aValueName: string;
  StResult: TStrings);
var
  Registry: TRegistry;
  RegDataType: TRegDataType;
  SKeys: TStringList;
  SValues: TStringList;
  i, size: integer;
  st: string;
begin
  with TRegistry.Create do
  try
    RootKey := aRootKey;
    if OpenKeyReadOnly(aKeyName) then
    begin
      SValues := TStringList.Create;
      try
        GetValueNames(SValues);
        for i := 0 to SValues.count - 1 do
        begin
          RegDataType :=  GetDataType(SValues[i]);
          case RegDataType of
            rdUnknown : st := 'Desconocido';
            rdInteger : st := IntToStr(ReadInteger(SValues[i]));
            rdString , rdExpandString : st := ReadString(SValues[i]);
            rdBinary  : begin
                          size:= GetDataSize(SValues[i]);
                          SetLength(st, size);
                          ReadBinaryData(SValues[i], PChar(st)^, size);
                        end;
          end;
          if SValues[i] = aValueName  then
            StResult.Add(aKeyName + '\' + SValues[i] + ' = ' + st)
        end;
      finally
        SValues.Free
      end;
    end;
    SKeys := TStringList.Create;
    try
      GetKeyNames(SKeys);
      for i := 0 to SKeys.count - 1 do
        FindValueName(aRootKey, aKeyName + '\' + SKeys[i], aValueName, StResult);
    finally
      SKeys.Free;
    end;
  finally
    Free;
  end;
end;

Llamada ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  FindValueName(HKEY_LOCAL_MACHINE,
               'HARDWARE\DESCRIPTION\System',
               'Identifier',
               ListBox1.Items);
end;
Al parámetro aKeyName podés especificarle cualquier ruta. Lógicamente cuando más próxima al valor la especifiques más rápidamente realizará la búsqueda, pero será menos amplia.

Con una pequeña modificación también podes buscar en el registro completo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
  HKEYCONST : array[0..6] of HKEY = (HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,
    HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_PERFORMANCE_DATA,HKEY_CURRENT_CONFIG,
    HKEY_DYN_DATA);
var
  i: Integer;
begin
  for i:= Low(HKEYCONST) to High(HKEYCONST) do
    FindValueName(HKEYCONST[i],
                  '',
                  'Profile',
                  ListBox1.Items);
end;
Pero debes armarte de paciencia...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 28-02-2013
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
ecfisa,

Excelente código

Quizás esta variante mejore un poco el tiempo:
Código Delphi [-]
for i := 0 to SValues.count - 1 do
   if SValues[i] = aValueName  then
   begin
      RegDataType :=  GetDataType(SValues[i]);
      case RegDataType of
         rdUnknown : st := 'Desconocido';
         rdInteger : st := IntToStr(ReadInteger(SValues[i]));
         rdString , rdExpandString : st := ReadString(SValues[i]);
         rdBinary  : begin
                        size:= GetDataSize(SValues[i]);
                        SetLength(st, size);
                        ReadBinaryData(SValues[i], PChar(st)^, size);
                     end;
      end;
      StResult.Add(aKeyName + '\' + SValues[i] + ' = ' + st)
   end;
Sin embargo me queda la duda de como un programa como O&O RegEditor hace las búsquedas de forma tan rápida en el Registro de Windows.

Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 28-02-2013 a las 07:02:36.
Responder Con Cita
  #8  
Antiguo 28-02-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por nlsgarcia Ver Mensaje
Sin embargo me queda la duda de como un programa como O&O RegEditor hace las búsquedas de forma tan rápida en el Registro de Windows.
Somos dos

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 28-02-2013
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.682
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
No conozco ese programa, pero lo mismo lee todo el registro y lo almacena en una tabla de sqlite, por ejemplo, luego trabaja con esa tabla, por lo que la búsqueda (campos indexados) es instantánea.
Por decir algo
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Registro de Windows Khronos Varios 2 07-12-2008 23:23:28
registro de windows JULIPO Varios 4 26-07-2007 08:17:01
Uso de registro de Windows Alcolea Windows 3 05-06-2006 21:47:35
registro de Windows ebeltete API de Windows 1 17-06-2003 17:00:14
Registro de Windows Periyo Varios 3 08-05-2003 17:51:51


La franja horaria es GMT +2. Ahora son las 23:09:01.


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