PDA

Ver la Versión Completa : Editar Regedit de windows con Delphi 7.0


BuRtOn
15-08-2008, 02:13:57
Saludos amigos, mire lo que sucede es que necesito editar el regedit de windows y cambiar valores....por ejemplo, necesito cambiar el siguiente registro:

HEY_CURRENT_USER ---> Desktop ---> MenuShowDelay , cambiar el valor de MenuShowDelay que es por defecto 400 cambiarlo a 0, eso es lo que necesito hacer, y pude conseguir el siguiente codigo:


procedure DisableTaskMgr(bTF: Boolean);
var
reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Software', True);
reg.OpenKey('Microsoft', True);
reg.OpenKey('Windows', True);
reg.OpenKey('CurrentVersion', True);
reg.OpenKey('Policies', True);
reg.OpenKey('System', True);
if bTF = True then
begin
reg.WriteString('DisableTaskMgr', '1');
end
else if bTF = False then
begin
reg.DeleteValue('DisableTaskMgr');
end;
reg.CloseKey;
end;


No entiendo por que declaran ahi la variable bTF ??, si bien la puedo declarar en el uses, colocando var bTF :Bloean, bueno el hecho es que no se como modificar ese codigo para que me haga lo que yo deseo, alguien que me pueda colaborar por favor, pero que me colaboren al ejemplo que mensione anteriormente, Gracias.

FGarcia
15-08-2008, 02:37:03
Hola!

bTF es una variable que debe recibir el procedimiento. Ese valor lo estan enviando cuando se llama a ese procedimiento desde otro punto de la aplicacion. ¿Recuerdas la estructura de arbol del registro? Bueno, pues si te fijas en el codigo que muestras recorren esa estructura y se posicionan donde necesitan cambiar el dato segun sea el valor de btF. Asi tu deberas recorrer la estructura hasta encontrar la clave que quieres cambiar. probablemente no sea necesario usar una variable como aqui pero eso lo deberas determinar tu en tu aplicacion.

BuRtOn
15-08-2008, 02:47:36
Saludos, gracias por responder, bueno la prgeunta es, si declaro la variable como dije anteriormente si me funcionara ??, es que si la coloco en el procedure me enviara error de una vez, y pues ese es todo el codigo que tengo, se que tambien tengo que incluir el Ragistry en el uses...pero como hago para cambiar el valor de 1 a 0, como lo mencione en el ejemplo ???, por favor si me puedes especificar un poco mas, es que nunca he hecho esto, y solo quiero aprenderlo...Gracias amigo..

BuRtOn
15-08-2008, 02:49:22
Oh lo olvidaba, tengo que colocar el codigo en algun evento en especial de la forma ?, o puedo colocar un boton y poner el codigo en el evento onclick del boton, para realizar la operacion cuando yo lo desee ???


Gracias por tu tiempo

Delphius
15-08-2008, 02:56:37
Hola BuRtOn,
Aclarame una pregunta ¿Entiendes lo que es un parámetro?

BTF es el parámetro que espera dicho procedimiento para saber como y/o que hacer en base al valor suministrado. La forma en que se invoca al procedimiento es simple:


DisableTaskMgr(True); // O puede ser False

Con respecto a Tregistry sugiero que hagas una lectura de la ayuda. Para hacer el cambio que buscas se emplea el método WriteString. El segundo parámetro representa el valor a guardar (o cambiar), mientras que el primero es la clave a modificar. Y para ello necesariamente debe estar abierta dicha clave del registro. Lo cual se consigue invocando al método OpenKey.

Saludos,

BuRtOn
15-08-2008, 03:02:10
Hola dlphius....pues mira esta es la primera vez que voy a hacer esto, y pues lo que basicamente quiero hacer es:

HEY_CURRENT_USER ---> Desktop ---> MenuShowDelay , cambiar el valor de MenuShowDelay que es por defecto 400 cambiarlo a 0, eso es lo que necesito hacer.


Pero no se donde ubicarme en el valor que trae por defecto ese registro, en este caso seria 400, y no se donde le coloco el nuevo valor que seria 0, eso es basicamente lo que no entiendo, no se donde colocar el valor por defecto y el valor que le voy a dar que seria 0...eso es basicamente lo que no entiendo, el resto de codigo si lo entiendo un poco mas...bueno gracias por tu ayuda, espero que me colabores..

Delphius
15-08-2008, 03:22:18
A ver BuRtOn, por algo digo que leas la ayuda sobre TRegistry.

Tienes la clave de registro

HEY_CURRENT_USER\Desktop\MenuShowDelay

Bueno, empecemos a desarmar esta clave para que comprendas el porqué de cada método que ves en el código.

HEY_CURRENT_USER corresponde al ROOT. El directorio principal de la clave.

Luego le siguen los subdirectorios de la clave. En este caso es uno sólo: Desktop.

Y por último viene la variable, MenuShowDelay.

Cuando uno desea modificar una clave del registro debe abrir primero dicha clave. Esto se consigue con los siguientes pasos:

1. Establecer el root.

Reg.Rootkey := ....;

2. Abrir el/los directorio/s.

Aqui hay dos maneras, Si el subdirectorio tiene muchos subdirectorios debemos ir abriendolos uno por uno, o directamente los abrimos todos de una vez.

Por ejemplo,

Reg.OpenKey('software',True);
Reg.OpenKey('Microsoft',True);
Reg.OpenKey('Windows',True);

es equivalente a hacer:

Reg.OpenKey('software\Microsoft\Windows',True);

El segundo parámetro, que corresponde a un tipo boolean, es para indicar si debe crear el directorio en caso de no existir dicho directorio.

Una vez que todos los directorios han sido abiertos, ya podemos modificar la clave o variable que buscamos. Aqui dependerá si lo que guarda es string, integer, etc. Por ejemplo, supongamos que se guarda un string:

Reg.WriteString('DisableTaskMgr','1');

En el ejemplo, se cambia la variable DisableTaskMgr con el valor 1 pero en string.

Una vez hecho los cambios, hay que cerrar la clave.

Reg.CloseKey;

¿Se entiende ahora?

Es necesario que conozcas el registro de Windows. Al menos, lo que vas a modificar y/o leer.

Con respecto a cuando y donde hacer esto, dependerá de lo que se necesite. Puede ser en la primera vez que se va a usar el programa, y de allí en mas no debería hacer falta volver a hacerlo. Dije debería puesto que si se cambia el registro, en forma externa a tu aplicativo ya suenan las sirenas.

Puede ser ante la pulsación de un botón, en el evento OnCreate del form principal... esto ya es una cuestión de requisitos, de diseño del sistema y/o de implementación.

Saludos,

BuRtOn
15-08-2008, 04:56:18
procedure DisableTaskMgr(bTF: Boolean);
var reg: TRegistry;
begin
reg := TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Desktop', True);
reg.OpenKey('MenuShowDelay ', True);
if bTF = True then begin
reg.WriteXXX(En las XXX va Int osea quedaria WriteInt)
('DisableTaskMgr', 1);
end else if bTF = False then begin
reg.DeleteValue('DisableTaskMgr');
end;
reg.CloseKey;end;


que pena, aki esta el codigo es que me salio a lo Ancho...

Delphius
15-08-2008, 09:59:18
Hola BuRtOn,

Tengo para ti cuatro observaciones:
1. En el segundo OpenKey, estás pasando el texto con un espacio al final. Deberías quitar ese espacio.
2. Dudo que encuentres el directorio Desktop en HKEY_CURRENT_USER. Yo más bien diría que es HKEY_CURRENT_USER\Control Panel\Desktop.
3. El valor que se almacena en MenuShowDelay es un string.
4. ¿Tiene algún significado para ti el parámetro BTF? ¿Sabes lo que hace DeleteValue?

Esto te lo pregunto porque se me hace que copiaste código sin entender el porqué y de donde sale el parámetro BTF. Ese parámetro que ves en el procedimiento está para controlar alguna acción dentro del procedimiento del cual copiaste. Ahora, para ti, ¿que es ese BTF? Te sirve de algo? Porque si haces esto:

DisableTaskMgr(False);

Lo que conseguirás es eliminar dicha clave del registro (si existiese). ¿Deseas brindar la posibilidad de que se elimine y/o se escriba en el registro con un parámetro?

BuRtOn, Al menos hubieras dado un nombre adecuado al procedimiento, Para que no sea tan evidente que copiaste y solo lo editaste según lo que yo te dije:mad:.

Antes te pregunté si comprendías lo que es un parámetro. Di por entendido de que así era y que comprenderías que ese parámetro sólo es de interés para el que ha diseñado ese código. Que quieres te diga... a mi me huele a un simple Copy-Paste:(.

¿Leiste un poco la ayuda sobre el TRegistry? ¿Te fijaste si la clave en el registro está y de que tipo es? ¿O simplemente porque es un "número" intuías que verdaderamente se almacena un número?

Si ejecutaras el código que expusiste, conseguirías crear una clave DisableTaskMgr (en el caso de que BTF sea True) en HKEY_CURRENT_USER\Desktop\MenuShowDelay \ con un valor entero (si tu WriteXXX fuera WriteInteger) y no estarías modificando la clave adecuada.

Menos mal que antes te dije que conocieras la parte del registro con la que vas a trabajar:rolleyes:

En definitiva:

1. Establecer el root correcto.
2. Abrir el directorio Control Panel
3. Abrir el directorio Desktop
4. Escribir en MenuShowDelay el valor '0' (o el que se desee. ¡Poner antención al tipo por favor!)
5. Cerrar

Ahora si, espero que se entienda.
Saludos,

BuRtOn
15-08-2008, 16:22:10
Hola delphius, Bueno como primer punto, no tengo por que disimular que copie el codigo, por que si no te diste cuenta yo recalque al principio de este hilo que el codigo me lo habia pasado un amigo, para que analisara las cosas, algo muy diferente a que me pusiera a mentir de que el codigo lo habia hecho yo.

Como segundo punto, no sabia a un 100% como se comportaria ese codigo en el Regedit de windows, por algo pregunte.

Tercer punto: Lamentablemente no tengo mucho tiempo que si diga para leer las cosas que a mi me interesan y deseo aprender, por mi estudio, y no solo eso, ahora nos enfocan a visual Basic 5.0, y tambien me toca estudiar.

Cuarto punto: Estudio Delphi aun por que me gusta y lo aprecio mucho, pero aveces no me queda tiempo.

Quinto punto: De igual forma te agradesco que me allas ayudado, va ser muy util tu ayuda, pero enserio, ya relajate un poco delphius y no me condenes a cadena perpetua sin antes leer bien lo que yo expongo en mis hilos, lo digo en cuanto a lo que dijiste que ubira disimulado que el codigo es copiado, a mi me gusta decir las cosas como son, no puedo aparentar que ese codigo es mio, por que por algo estoy preguntndo, no es apenas obvio ???..

Bueno Gracias, voy a intentar lo que me dijiste delphius, y sin broncas, gracias.:)

BuRtOn
15-08-2008, 17:37:31
Saludos, Ok delphius gracias tus aportes fueron de gran ayuda, repase bien el codigo y pude lograr lo que queria, aqui esta el codigo como lo hice:


unit ufrmAumentarVelocidadMenu;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Registry, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Control Panel\Desktop\', True);
reg.WriteString('MenuShowDelay','0');
reg.CloseKey;
MessageDlg('Su Menu Ha Sido Optimizado',mtInformation,[mbOK],0);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Application.Terminate;
end;
end.



Espero que a alguien le sea util...Bueno delphius ahora va esta pregunta, como hago el condicional, para que me haga lo siguiente:

* Por ejemplo voy a ejecutar la aplicacion para que me aumente la velocidad de mi menu de inicio de windows, que es basicamente cambiar el valor de 400 a 0, como esta en mi codigo, pero si alguien ejecuta mi aplicacion y ya han modificado el registro, osea ya no esta en 400 si no en 0, en pocas palabras necesito que me determine si el menu ya ha sido optimizado oh no, osea al ejecutar mi aplicacion que me determine si el valor 400 ya ha sido modificado a 0, para enviar un mensaje que me diga: "su equipo ya habia sido optimizado", espero que me puedas colaborar, y grcias ante mano.

Delphius
15-08-2008, 17:51:48
Saludos, Ok delphius gracias tus aportes fueron de gran ayuda, repase bien el codigo y pude lograr lo que queria, aqui esta el codigo como lo hice:

Código Delphi [-] (http://www.clubdelphi.com/foros/#)unit ufrmAumentarVelocidadMenu; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; Label2: TLabel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var reg: TRegistry; begin reg:= TRegistry.Create; reg.RootKey := HKEY_CURRENT_USER; reg.OpenKey('Control Panel\Desktop\', True); reg.WriteString('MenuShowDelay','0'); reg.CloseKey; MessageDlg('Su Menu Ha Sido Optimizado',mtInformation,[mbOK],0); end; procedure TForm1.Button2Click(Sender: TObject); begin Application.Terminate; end; end.


Espero que a alguien le sea util...Bueno delphius ahora va esta pregunta, como hago el condicional, para que me haga lo siguiente:

* Por ejemplo voy a ejecutar la aplicacion para que me aumente la velocidad de mi menu de inicio de windows, que es basicamente cambiar el valor de 400 a 0, como esta en mi codigo, pero si alguien ejecuta mi aplicacion y ya han modificado el registro, osea ya no esta en 400 si no en 0, en pocas palabras necesito que me determine si el menu ya ha sido optimizado oh no, osea al ejecutar mi aplicacion que me determine si el valor 400 ya ha sido modificado a 0, para enviar un mensaje que me diga: "su equipo ya habia sido optimizado", espero que me puedas colaborar, y grcias ante mano.

Una manera de hacerlo es leyendo dicha clave. Para eso en vez de WriteString, debes emplear ReadString. Tu aplición entonces, lo que puede hacer es el OnCreate de tu forma principal, leer el valor del registro y si no es igual a 400, lo cambia.

TRegistry cuenta con los métodos necesarios para leer, guardar, eliminar claves, para saber si existe alguna clave en particular o no... En estos momentos no tengo Delphi a mano, pero estoy seguro de que para leer el valor es ReadString.

El procedimiento es el mismo:
1. Establecer el root
2. Abrir directorios
3. Leer clave
4. Si el valor de clave leida es distinto a '0'
4.1. escribir en clave el valor '0'

Una vez que el TRegistry se ubica en una clave, se puede trabajar con ella. De modo que con solo abrir los directorios para leerlos ya no te haría falta volver a abrirlos para modificarlo. ¿Se entiende?

Sugiero que leas la ayuda sobre TRegistry. En serio, es preferible tomarse unos minutos para leer un poco y comprender mejor que intentar a ciegas.
Recuerda que el registro de Windows es un tanto sencible, una metedita de pata y ¡PUM! estallan pantallitas azules.

Saludos,

egostar
15-08-2008, 17:53:36
Tendrias que preguntar por el valor de la clave,


procedure TForm1.Button1Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_CURRENT_USER;
reg.OpenKey('Control Panel\Desktop\', True);
if reg.ReadString('MenuShowDelay') = '400' then begin
reg.WriteString('MenuShowDelay','0');
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtInformation,[mbOK],0);
reg.CloseKey;
end;


Salud OS

BuRtOn
15-08-2008, 18:04:15
Saludos, ok entendi, pero ahora tengo un problema, jejeje, como se si mi registro es string o binary, o lo que sea es que no puedo editar esta clave:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\PrefetchParameters.
Una vez alli aumentaremos el contenido del valor EnablePrefetcher del predeterminado "3" al recomendado "5".


Gracias por su ayuda...muy amables.

Delphius
15-08-2008, 18:15:10
Si te fijas, al costado izquierdo muestra una pequeña imagen que dependiendo del tipo de dato muestra ab, numero binario, etc. Si vez binario es que el valor que se guarda es hexadecimal, binario o decimal; si vez un ab es un string, etc...

La tercera columna, muestra el tipo... es mejor mirar alli;)

Esto dice la ayuda:

REG_BINARY
Datos binarios sin procesar. La mayor parte de la información de los componentes de hardware se almacena en forma de datos binarios y se presenta en el Editor del Registro en formato hexadecimal.
REG_DWORD
Datos representados por un número de 4 bytes de longitud. Muchos parámetros de controladores de dispositivo y de servicios son de este tipo, y se presentan en el Editor del Registro en formato binario, hexadecimal o decimal.
REG_EXPAND_SZ
Cadena de datos de longitud variable. Este tipo de datos incluye variables que se resuelven cuando un programa o un servicio utiliza los datos.
REG_MULTI_SZ
Una cadena múltiple. Los valores que contienen listas o valores múltiples legibles suelen ser de este tipo. Las entradas están separadas mediante espacios, comas u otras marcas.
REG_SZ
Cadena de texto de longitud fija.
REG_FULL_RESOURCE_DESCRIPTOR
Serie de tablas anidadas, diseñadas para almacenar una lista de recursos para un componente de hardware o un controlador.

Un poquito de F1 no hace mal a nadie. Sino fíjate, ¿porque crees que Schumacher se retiró? ¿Porqué me estaba metiendo demasiado en la F1?;):D

Saludos,

BuRtOn
15-08-2008, 18:36:00
Ok, pero donde consigo ejemplos de como editar cada uno, pues fijate el ejemplo que te di, la clave que no pude editar....Gracias delphius....es que no se como van los parametros paa editar un Integer, o un Boolean o Binary...el string ya lo se...Gracias de nuevo...

egostar
15-08-2008, 18:37:53
Hola

Un poquito de F1 no hace mal a nadie.

Salud OS

BuRtOn
15-08-2008, 19:03:19
OK Ok, solo que no soy bueno para el ingles....pero enserio les agradezco ejemplos, o un hilo donde esten los ejemplos, gracias...

Posdata: Conste que no estoy pidiendo que me hagan lo que quiero...gracias de nuevo..

egostar
15-08-2008, 19:11:29
OK Ok, solo que no soy bueno para el ingles....pero enserio les agradezco ejemplos, o un hilo donde esten los ejemplos, gracias...

Posdata: Conste que no estoy pidiendo que me hagan lo que quiero...gracias de nuevo..

Vaya pues si que es dificil tu situación, de cualquier forma trata de traducir esta página.

http://www.swissdelphicenter.ch/torry/showcode.php?id=1665

Salud OS

Delphius
15-08-2008, 19:18:46
OK Ok, solo que no soy bueno para el ingles....pero enserio les agradezco ejemplos, o un hilo donde esten los ejemplos, gracias...

Posdata: Conste que no estoy pidiendo que me hagan lo que quiero...gracias de nuevo..

BuRtOn, yo tampoco soy un experto, me cuesta un poco. Pero eso no es motivo para huirle. En esta profesión nos guste o no, hay que aprenderlo. Unas cuantas lecturas , escuchar el inglés y tratar de decir unas cuantas oraciones por día es un ejercicio recomendable. Al menos yo de vez en cuando lo hago: me siento a hacer mis diagramas en papel, prendo la TV,escojo algún canal en que estén hablando en inglés y evitando leer los créditos practico el odio y traducirlo mentalmente. Muchas veces la pifeo en la traducción, pero es algo.

Bueno, volvamos al tema: en la ayuda viene algunos ejemplos. Y si buscas sobre TRegistry en los foros encontrarás más. Allí verás, que al final en la "cabecera" sobre la ayuda en algunos métodos y/o propiedades del TRegistry aparece un "see also" y/o "example"

Saludos,

BuRtOn
16-08-2008, 04:14:08
Saludos, bueno me voy a calmar haaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, no encuentro absolutamente nadaaaaaaa de editar las cadenas a binario, solo he encontrado esto:


Ayuda delphi:

reg.ReadBinaryData(const Name: String; var Buffer; BufSize: Integer): Integer;

reg.WriteBinaryData(const Name: String; var Buffer; BufSize: Integer);



pero no entiendo que parametros son los que me piden....he planteado asi el codigo:


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\', True);
if reg.ReadBinaryData('EnablePrefetcher') = '3' [No se como va esta linea de codigo, por que no se los parametros] then
Begin
reg.WriteBinaryData('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
end;



Lo que voy a hacer es cambiar la siguiente clave asi :


HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\PrefetchParameters.
Una vez alli aumentaremos el contenido del valor EnablePrefetcher del predeterminado "3" al recomendado "5".


Se que escribi bestialidades, pero no tengo ni ideaaaaaa como va esos parametros, por favor alguien que me de un buen ejemplo....por que ni ejemplos hay que es lo peor....gracias a todos por ayudarmen....

Delphius
16-08-2008, 04:47:16
Hola BuRtOn,

Primero te agradecería que editaras el mensaje, que te salió bastante horizontal.

Si puedes borrar esas [ FONT ] que aparecen sería mejor ya que hace dificil su lectura.

Para guardar el dato, debes tener una variable auxiliar del tipo string y almacenar el valor temporalmente en ella. Por ejemplo digamos que la variable string se llama "valor" y que queremos modificar una clave (es un ejemplo) GrabarAqui (el directorio es lo de menos)

Lo que hacemos es:
1. Guardar en "valor" lo que deseamos guardar en el registro.
2. Guardar valor como un dato binario.

en código:
valor := '3'; // un ejemplo
Reg.WriteBinaryData('GrabarAqui',PChar(valor)^,Length(valor));

PChar()^ nos permite tener acceso al buffer directo de los datos, Length() nos obtendrá el tamaño del buffer. Si te fijas, la función espera un Buffer o el puntero de la dirección de memoria donde están los datos. No me mires a mi, asi es como funciona y está implementado el método.

Espero que se entienda:o

Saludos,

BuRtOn
16-08-2008, 05:14:25
Saludos Delphius, haber si te entiendo, seria algo asi:


procedure TForm1.btnOptimizar3Click(Sender: TObject);var reg: TRegistry;var Valor : String;begin reg:= TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\', True); if reg.ReadBinaryData('EnablePrefetcher'PChar('3')^,length('3')) = '3'then Begin reg.WriteBinaryData('EnablePrefetcher'PChar('5')^,length('5')); MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0); end else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0); reg.CloseKey;end;Lo que esta en negrita azul son los valores que tiene por defecto el registro que es 3 y necesito cambiarlo a 5, si estara bien asi el procedimiento ?, teniendo en cuenta que en la linea de ReadBinaryData tengo que hacer un condicional If para verificar que ese registro no este modificado, para proceder a modificarlo....y de nuevo gracias Delphius, y te agradeceria saber de donde aprendiste tanto de registros en delphi....

BuRtOn
16-08-2008, 05:15:03
haaa, no se por que me salen los codigos de lado ????...perdon, pero no es mi culpa...

Delphius
16-08-2008, 05:23:55
Me tienes que enseñar a escribir todo horizontal:D.

Lo que te sucede es que tal vez no das enter o retorno de carro. Pues la verdad no entiendo como le haces para que te salga así.

Acabo de ver que el registro completo que estás buscando es del tipo REG_DWORD y por lo poco que se, es preferible hacerlo con WriteInteger. Ya que se trata de un decimal de 4 bytes. Que el editor de registros lo muestre de dicha manera es una cosa...

Si fuera REG_BINARY si optaría por WriteBinaryData.

Se aprende tocando y leyendo... si está en inglés... se lee igual. Por algo existen los traductores.

Saludos,

BuRtOn
16-08-2008, 05:37:03
:eek::eek:, jajajaja, hay Dios esto si cambia, pero bueno que todo sea por el saber, entonces como es la estructura del integer ??, tengo que hacer todo exactamente como el BinaryData, pero con Integer ??, tengo que crear la variable o como tengo que hacer, mira aqui esta el codigo como lo plantee:

procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\', True);
if reg.ReadInteger('EnablePrefetcher',3) = '3' then
Begin
reg.WriteInteger('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
end;


se hace igual que el string ? tengo que hacer el mismo metodo que el binary ?

Delphius
16-08-2008, 05:52:25
:eek::eek:, jajajaja, hay Dios esto si cambia, pero bueno que todo sea por el saber, entonces como es la estructura del integer ??, tengo que hacer todo exactamente como el BinaryData, pero con Integer ??, tengo que crear la variable o como tengo que hacer, mira aqui esta el codigo como lo plantee:


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\',True);
if reg.ReadInteger('EnablePrefetcher',3) = '3'
then Begin
reg.WriteInteger('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
end;


se hace igual que el string ? tengo que hacer el mismo metodo que el binary ?

Se procede igual que el ReadString y WriteString.
BuRtOn no te enojes, pero presiona F1 y fíjate los parámetros que reciben estos métodos.

El ReadInteger recibe como parámetro la variable o clave a consultar y regresa el valor guardado, mientras que el Write recibe la clave y el valor a guardar.

algo := Reg.ReadInteger('que se yo');
Reg.WriteInteger('que se yo',3);

Se ve la diferencia. Uno regresa, el otro escribe. Uno tiene un solo parámetro, el otro dos.

Eso está en la ayuda bien explicado.

Saludos,

BuRtOn
16-08-2008, 06:11:49
Ok, ya te voy entendiendo, pero aqui va esto:

1.) "algo" que tipo de variable es ?

no se si quede algo asi :


var algo : Integer;algo := Reg.ReadInteger('EnablePrefetcher');Reg.WriteInteger('EnablePrefetcher',5);

pero igual se generaria un error por que estoy manejando un condiconal en el ReadInteger , para saber que esa clave no se ha movido para proceder con la aplicacion y si ya se modifico que me envie el mensaje de information diciendo esta clave ya fue modificada...


bueno hice esto, pero me salio un error:


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
var valor :integer;
begin
valor := 3;
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\', True);
if reg.ReadInteger('EnablePrefetcher') = valor then
Begin
reg.WriteInteger('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
end;



El error me dice lo siguiente:

Failed to get data for 'EnablePrefetcher'

no se en donde estoy fallando, y no se como ubicar la variable algo que tu me dijiste...en fin gracias Delphius y perdon por las molestias...:(

Forest
17-08-2008, 01:03:56
Bueno, no tengo ni idea la verdad de muchas cosas, pero para mi que es eso de:
reg.OpenKey('SYSTEM\CurrentControlSet\Control \SessionManager\MemoryManagement\', True);

Si te fijas volviste a dejar un espacio en la ruta, especificamente en 'Control '

Checa, tal vez es eso...

BuRtOn
17-08-2008, 01:18:27
Gracias amigo, pero ya mire y no era ese espacio :(, Dios esto me va a volver loco, no se que es lo que estoy haciendo mal, bueno por si alguien me quiere hechar una manito, aqui esta el codigo de lo que tengo, y tratare de explicarlo:


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
var valor :integer;
begin
valor := 3;
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\', True);
if reg.ReadInteger('EnablePrefetcher') = valor then
Begin
reg.WriteInteger('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
end;


Bueno ahora si explico lo que trate de hacer, como se pueden dar cuenta lo que esta en rojo es lo que voy a cambiar y las variables que utilizo...valor lo asigne como un valor entero, por que ?, por que necesito hacer la comparacion que si el valor que esta en el registro de EnablePrefetcher es 3 que a su vez es el valor que trae por defecto es igual a valor que es tambien 3 , procede a cambiar ese valor del registro 3 a 5, entonces el EnablePrefetcher , ya no sera 3 por defecto si no 5. y de lo contratio osea si 3 es diferente, pues emite el mensje diciendo que su registro ya habia sido modificado anteriormente.

Bueno, creo que ya lo explique super bien, lo que hice y lo que trate de hacer, pero me depura bien la aplicacion, pero a la hora de ejecutarla, como mencione anteriormente me sale el siguiente erro:

"Failed to get data for 'EnablePrefetcher' "

No se que pase sinceramente, y ya lo intente de una forma u otra, y mire la ayuda y me dicen la sintaxis, pero no la se interpretar, o a veces no se que valores o que parametros son los que exigen....Bueno en fin si alguien me puede ayudar se lo agradezco, muchas gracias por su tiempo prestado.

BuRtOn
17-08-2008, 01:43:28
Bueno aqui esta otro codigo que equivale a otro intento, tratando de seguir el modelo que me dijo Delphius, pero aun no me sale.


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
var valor :Integer;
begin
valor:=5;
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\', True);
valor:=reg.ReadInteger('EnablePrefetcher');
Begin
reg.WriteInteger('EnablePrefetcher',valor);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end;

end;



Bueno aqui segui tu modelo Delphius pero aun me arroja el mismo error....y si es una bobada el erro, aun no me sentiria satisfecho, por que a ese codigo como le agrego mi condiiconal If, para poder averiguar si el registro ya habia sido antes modificado, o si aun esta sin modificar, para que mi aplicacion entre y proceda..Bueno si pueden ayudarmen gracias y si no, pues me tocara seguir buscando....

Forest
17-08-2008, 02:57:38
(esto es lo que ya habías puesto solo que no se porque no lo pude copiar bien jaja)
procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
var valor :Integer; begin valor:=5; reg:= TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\', True);
valor:=reg.ReadInteger('EnablePrefetcher'); Begin reg.WriteInteger('EnablePrefetcher',valor); MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end;

end;

Pues primero que nada ahí no tienes ningun IF y si tienes begin y end o_O...
Además ese código no sirve porque si estás intentando guardar el valor del registro a la variable, y después, quieres guardarle el valor de la variable al registro... pues no estas haciendo nada...

La verdad no tengo ni idea como dije antes xD, pero... estás seguro de que EnablePrefetcher es de tipo entero?

Para mi que debe ser algo así:

procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\', True);
if reg.Read[verdadero tipo]('EnablePrefetcher') = 3; // ó '3' si fuese String
Begin
reg.Write[verdadero tipo]('EnablePrefetcher',5); // ó '5' si fuese String
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else
MessageDlg('Su Menu ya estaba optimizado ò_ó',mtInformation,[mbOK],0);
end;
Se que no es mucha ayuda, pero es lo que puedo hacer jeje

BuRtOn
17-08-2008, 03:08:20
Tranquilo Forest, pero si notas, mas arriba, tengo este codigo, que es similar al tuyo si es que no es igual:


procedure TForm1.btnOptimizar3Click(Sender: TObject);var reg: TRegistry;var valor :integer;beginvalor := 3; reg:= TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\', True); if reg.ReadInteger('EnablePrefetcher') = valor then Begin reg.WriteInteger('EnablePrefetcher',5); MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0); end else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0); reg.CloseKey;end;

Delphius
17-08-2008, 03:13:12
BuRtOn,
Tengo entendido que la clave de registro que buscas es esta:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters

Pero veo en tu código que intentas abrir esta:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\MemoryManagement\

Hay un espacio en el medio, te olvidas de abrir un directorio más y además añades una barra al final que no debe ir.

Te recuerdo que el método OpenKey recibe dos parámetros. El segundo, que es de tipo booleano permite crear el directorio en caso de no existir si el valor que se pasa es TRUE.

Estás creando esa clave de registro! Cuidado!

Debe funcionarte. He podido leer sin problemas el valor de EnablePrefetcher aplicando tu código con una variante:

reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters', False); //false por las dudas.


valor:=reg.ReadInteger('EnablePrefetcher');
ShowMessage(IntToStr(valor));
reg.CloseKey;
reg.Free;

Recuerda que estás creando un objeto Reg al comienzo, por tanto al final debes liberarlo con Free y que una vez que trabajas con la clave debes cerrarla con CloseKey.

Saludos,

BuRtOn
17-08-2008, 03:24:49
Saludos Delphius, mira modifique el codigo, con lo que me dijiste y aun me ejecuta ese error, y si tenias mucha razon, mire el regedit, y tenia creados unos registros, pero mira dime que erro vez:


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
var valor :integer;
begin
valor := 3;
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\MemoryManagement\PrefetchParameters ', False);
if reg.ReadInteger('EnablePrefetcher') = valor then
Begin
reg.WriteInteger('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
reg.Free;
end;


Gracias por tu tiempo...

BuRtOn
17-08-2008, 03:35:38
Ok, estoy analizando bien, y pues no se que tipo de variable es valor, como tu lo colocas...yo coloque valor como Integer, para poder colocarlo en mi condicional, para que me determine si lo que hay en esa clave de registro es igual a 3 me ejecute mi aplicacion y la cambie a 5, de lo controraio emite el mensaje...pero estoy aun confundido con tu variable en el ReadInteger, por que si coloco esa variable como me quedaria el condicional??, Y de nuevo mil gracias delphius---

BuRtOn
17-08-2008, 03:37:15
Ha tengo en cuenta que habia dejado un espacio al final de :


reg.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\MemoryManagement\PrefetchParameters ', False);


ya lo corregi y nada me sigue dando el mismo error....

Delphius
17-08-2008, 03:47:05
Pues en tu último código veo que te sobre un espacio al final y te falta en otra parte. Por lo demás debería funcionarte.

La variable valor tuya te sobra. Con hacer

if Reg.ReadInteger(...) = 3
then ....

Debería funcionarte, si notas. Valor no lo usas para nada más.

Lo que yo expongo es un ejemplo, y al igual que tu, mi variable valor es integer. El método ReadInteger devuelve un integer. Lo único que hago yo es guardar el resultado en la variable y lo muestro.

Es lo mismo hacer esto:
valor := Reg.ReadInteger(....); // guardar el valor leído
if valor = 3
then ...

Que esto:

if Reg.ReadInteger(...) = 3
then ....

En el primer caso lo único que hago es previamente guardar el valor. En el segundo directamente leo, no me interesa tener en una variable el valor leído.

¿Se entiende la diferencia?

Saludos,

BuRtOn
17-08-2008, 04:01:17
Jajajajaja, ya Delphius te entendi perfectamente, y ya me salio, sabes que me estaba pasando, jajajaja Dios casi me mato la cabeza por eso, mira el codigo que yo tenia antes.

Este codigo es el que esta mal.

procedure TForm1.btnOptimizar3Click(Sender: TObject);var reg: TRegistry;var valor :integer; ---> Estas variables sobranbegin valor := 3; reg:= TRegistry.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\MemoryManagement\PrefetchParameters ', False); if reg.ReadInteger('EnablePrefetcher') = valor then Begin reg.WriteInteger('EnablePrefetcher',5); MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0); end else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0); reg.CloseKey; reg.Free;end;

y ahora mira el que esta bien:


procedure TForm1.btnOptimizar3Click(Sender: TObject);
var reg: TRegistry;
begin
reg:= TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters', False);
if reg.ReadInteger('EnablePrefetcher') = 3 then
Begin
reg.WriteInteger('EnablePrefetcher',5);
MessageDlg('Su Menu ha sido optimizado',mtInformation,[mbOK],0);
end
else MessageDlg('Su Menu ya estaba optimizado',mtWarning,[mbOK],0);
reg.CloseKey;
reg.Free;
end;


compara el codigo Delphius, y trata de descubrir mi error, jajajaja, Dios...pero enserio que me ayudaste muchisimo....espero que notes cual fue el error, jejeje....Gracias delphius..

Delphius
17-08-2008, 06:25:44
Pues claro que lo vi. Duerme un poquito, y saca el dedo de la barra espaciadora de vez de cuando y presiona en otras;):D

Te agradecería que antes de copiar aqui, leas de nuevo el código. Asi te evitas mas golpes ¿si?

Por cierto, ¡no escribas horizontal!:eek: Cuando copies el código desde Delphi hacia aquí haz esto:

1. Abre notepad, pégalo.
2. Borra todos los espacios demás
3. Usa enter para ir a la siguiente línea.
4. Copiar y pegar en post.

La verdad es que no se como haces para copiar o pegar código de esa manera. ¿usas algún editor en particular? ¿Identas tu código? No es crítica es que... hace más dificil la lectura.

Saludos,

BuRtOn
17-08-2008, 06:34:31
Saludos Delphius, no te entendi esa parte de:


Te agradecería que antes de copiar aqui, leas de nuevo el código. Asi te evitas mas golpes ¿si?


es que me quedo algo mal ???, por que ya lo ejecute y me salio correctamente.

y por otro lado, queria preguntarte que si es mejor dejar en False el Opnekey, pues tu me dijiste que si no existia el registro y el OpenKey estaba en True, lo creaba, en cambio si esta en False, lo deja tal como esta...si es asi, prefiero en False...por ahora....


Bueno Delphius Gracias...

Delphius
17-08-2008, 11:09:35
Te lo decía porque los pequeños errores que tienes son de despiste. Nada mas era que revisaras el código nuevamente antes de pegar.

Una segunda lectura puede ayudar a ver si no se nos escapa algo y evitar estar a los golpecitos despues de descubrir que el error fue por una coma, un espacio, un end... ¿se entiende?

Con respecto a si debe ser True o False, lo mejor que te puedo decir es un gran depende. En algunas ocasiones es deseable que sea True, y en otras no.

Si tienes la certeza de que el directorio que abres siempre estará un False y listo, pero si se desea disponer de una clave de registro determinada un True puede ser conveniente. De cualquier manera la clase TRegistry posee métodos para comprobar si existe una clave o no.

Saludos,