Strona 1 z 1

Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: niedziela, 22 marca 2009, 20:42
przez Bishamoth
Witam
W jaki sposob mozna wypisac cala zawartosc do komponentu TMemo z dowolnego klucza?
Przykladowo mamy klucz
Kod: Zaznacz cały
HKLM\Software\Microsoft\Windows\CurrentVersion\Run
Jak wyciagnac do TMemo jego zawartosc?

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 12:06
przez Cyfrowy Baron
W celu wyliczenia tylko nazw kluczy wystarczy tak:

Kod: Zaznacz cały
TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey =  HKEY_LOCAL_MACHINE;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);
Rejestr->GetValueNames(Memo1->Lines);
delete Rejestr;


Pobranie kluczy i wartości trzeba zrobić tak:

Kod: Zaznacz cały
TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey =  HKEY_LOCAL_MACHINE;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);

TStrings *tmpValue = new TStringList;

Memo1->Lines->Clear();

Rejestr->GetValueNames(tmpValue);

for(int i = 0; i < tmpValue->Count; i++)
{
  String tekst = Rejestr->ReadString(tmpValue->Strings[i]);
  Memo1->Lines->Add(tmpValue->Strings[i]  + " = " + tekst);
}

delete Rejestr;
delete tmpValue;

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 16:31
przez Bishamoth
Okej, obydwa kody dzialaja poprawnie, ale niestety kasuja one to co juz bylo w TMemo1... Nie da sie jakos obejsc tego by TMemo nie bylo czyszczone za kazdym razem?

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 16:43
przez wargo
Usuń:
Kod: Zaznacz cały
Memo1->Lines->Clear();

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 17:07
przez Bishamoth
wargo napisał(a):Usuń:
Kod: Zaznacz cały
Memo1->Lines->Clear();

No tak, to sie tyczy drugiego kodu a nie pierwszego... Nie zaznacztlem, ze chodzi o kod nr1. Za niedogodnosci przepraszam ;)

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 18:08
przez Cyfrowy Baron
Kod: Zaznacz cały
TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey =  HKEY_LOCAL_MACHINE;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);

TStrings *tmpValue = new TStringList;

Rejestr->GetValueNames(tmpValue);

for(int i = 0; i < tmpValue; i++)
   Memo1->Lines->Add(tmpValue->Strings[i]);

delete Rejestr;
delete tmpValue;

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 18:26
przez Bishamoth
Przy linijce:
Kod: Zaznacz cały
for(int i = 0; i < tmpValue; i++)

Wywala owy blad:
[C++ Error] Unit1.cpp(120): E2034 Cannot convert 'int' to 'TStrings *'

:roll:

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 18:51
przez Corvis
bo brakuje przy tmpValue -
Kod: Zaznacz cały
tmpValue->Count

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: poniedziałek, 23 marca 2009, 19:15
przez Cyfrowy Baron
Szybko pisałem i mi umknęło.

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: środa, 25 marca 2009, 21:48
przez Bishamoth
Wszystko dziala w jak najlepszym stanie, dziekuje :)

Odnosnie tego co pisalem, mam jeszcze jedno pytanie, ale to juz odnosnie instrukcji warunkowych...
Kod: Zaznacz cały
  String program = Edit1->Text;

TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey = HKEY_CURRENT_USER;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\DisallowRun", false);

if (Rejestr->KeyExists(program))
    {
     Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
    }
     else
         {
          Rejestr->DeleteValue(program);
          Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
          Memo1->Lines->Add("--------------------------------------------------------------------------");
         }

Jest to kod jednego z przyciskow TButton. Ma on za zadanie usuwac z rejestru istniejaca juz wartosc i powiadomic o tym, czy tez powiadomic o tym, ze takowa wartosc nie istnieje. No i tutaj jest problem gdyz za kazdym razem wykonuje instrukcje z kodu else ;/ A dokladnie to:
Kod: Zaznacz cały
     else
         {
          Rejestr->DeleteValue(program);
          Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
          Memo1->Lines->Add("--------------------------------------------------------------------------");
         }

Nie wazne czy wartosc istnieje, czy tez nie, on za kazdym razem wykonuje ta sama czynnosc. Czemu?

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: środa, 25 marca 2009, 22:01
przez kinio
hej,

U mnie w rejestrze nie ma takiego klucza, ale to nic wiem dlaczego.
Natomiast nie wiem czy nie powinieneś użyć metody:
Kod: Zaznacz cały
Rejestr->ValueExists(program)

bo lista tych programów w tym kluczu to już pojedyncze wartości.

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: środa, 25 marca 2009, 22:19
przez Bishamoth
Heh, no fakt. Gafa. Ale coz, to nic nie zmienia. Jak bylo na poczatku, tak po zmianie nadal to samo...
PS
kinio napisał(a):U mnie w rejestrze nie ma takiego klucza

Gdyz ten klucz sam utworzylem ;)

//EDIT po paru minutach. No dobra, sam sie zalamalem, jak zauwazylem, ze dziala gdy sie zamieni miejscami warunki:
Kod: Zaznacz cały
  String program = Edit1->Text;

TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey = HKEY_CURRENT_USER;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\DisallowRun", false);

if (Rejestr->ValueExists(program))
    {
     Rejestr->DeleteValue(program);
     Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
     Memo1->Lines->Add("--------------------------------------------------------------------------");
    }
     else
         {
          Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
         }

delete Rejestr;

Teraz juz dziala ;)

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: czwartek, 26 marca 2009, 10:07
przez Cyfrowy Baron
if (Rejestr->ValueExists(program))


to znaczy tyle co: jeżeli w rejestrze istnieje wartość o nazwie program, to wykonaj instrukcje 1 jeżeli nie to wykonaj instrukcje 2.

Można w takiej sytuacji zmienić kolejność warunków, ale można też zmienić zapis, to co wyżej jest równoznaczne z zapisem:

Kod: Zaznacz cały
if (Rejestr->ValueExists(program) == true)


podczas gdy tutaj potrzebny jest zapis:

Kod: Zaznacz cały
if (Rejestr->ValueExists(program) == false)


można przeciążyć operator "bool" i "!":

Kod: Zaznacz cały
if (!Rejestr->ValueExists(program))


co jest równoznaczne z zapisem:

Kod: Zaznacz cały
if (Rejestr->ValueExists(program) == false)


Dlatego wystarczyło w Twoim kodzie zrobić tak:

Kod: Zaznacz cały
if (Rejestr->KeyExists(program) == false) // gdyż sprawdzasz tutaj czy program nie znajduje się na liście
    {
     Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
    }
     else // ten warunek wystąpi tylko gdy wartość klucza znajduje się na liście
         {
          Rejestr->DeleteValue(program);
          Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
          Memo1->Lines->Add("--------------------------------------------------------------------------");
         }


lub tak:

Kod: Zaznacz cały
if (!Rejestr->KeyExists(program)) // gdyż sprawdzasz tutaj czy program nie znajduje się na liście
    {
     Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
    }
     else // ten warunek wystąpi tylko gdy wartość klucza znajduje się na liście
         {
          Rejestr->DeleteValue(program);
          Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
          Memo1->Lines->Add("--------------------------------------------------------------------------");
         }

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: czwartek, 26 marca 2009, 16:15
przez Bishamoth
Cyfrowy Baron napisał(a):Dlatego wystarczyło w Twoim kodzie zrobić tak:

Kod: Zaznacz cały
if (Rejestr->KeyExists(program) == false) // gdyż sprawdzasz tutaj czy program nie znajduje się na liście
    {
     Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
    }
     else // ten warunek wystąpi tylko gdy wartość klucza znajduje się na liście
         {
          Rejestr->DeleteValue(program);
          Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
          Memo1->Lines->Add("--------------------------------------------------------------------------");
         }


lub tak:

Kod: Zaznacz cały
if (!Rejestr->KeyExists(program)) // gdyż sprawdzasz tutaj czy program nie znajduje się na liście
    {
     Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
    }
     else // ten warunek wystąpi tylko gdy wartość klucza znajduje się na liście
         {
          Rejestr->DeleteValue(program);
          Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
          Memo1->Lines->Add("--------------------------------------------------------------------------");
         }

Obydwa kody nie dzialaja poprawnie. W kazdym z nich, niezaleznie od wpisanej nazwy zostaje wykonana ta linijka:
Kod: Zaznacz cały
     Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");

Za to ten kod:

Kod: Zaznacz cały
if (Rejestr->ValueExists(program))
    {
     Rejestr->DeleteValue(program);
     Memo1->Lines->Add("Program "+ program +" zostal usuniety z listy zablokowanych");
     Memo1->Lines->Add("--------------------------------------------------------------------------");
    }
     else
         {
          Memo1->Lines->Add(program +" nie znajduje sie na liscie zablokowanych");
         }

Dziala poprawnie.

Re: Wypisanie zawartosci klucza do TMemo

Nowy postNapisane: czwartek, 26 marca 2009, 20:01
przez Cyfrowy Baron
Ty coś tutaj pokręciłeś i na dłuższą metę, może to powodować błędne działanie programu.
Warunek if else dla Twojego przykładu jest prosty: jeżeli prawda zrób to, jeżeli nie zrób tamto, nie ma innych możliwości.

Dla pewności przeprowadziłem test z istniejącym (u mnie) kluczem:

Kod: Zaznacz cały
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey =  HKEY_LOCAL_MACHINE;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);

if(!Rejestr->ValueExists("ATICCC"))
{
  ShowMessage("Klucz NIE istnieje");
}
else
{
  ShowMessage("Klucz istnieje");
}
}

wynik: komunikat "Klucz istnieje"

następnie wprowadziłem nazwę klucza, który nie istnieje:

Kod: Zaznacz cały
void __fastcall TForm1::Button3Click(TObject *Sender)
{
TRegistry *Rejestr = new TRegistry();
Rejestr->RootKey =  HKEY_LOCAL_MACHINE;
Rejestr->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);

if(!Rejestr->ValueExists("ATICCC_1"))
{
  ShowMessage("Klucz NIE istnieje");
}
else
{
  ShowMessage("Klucz istnieje");
}
}

wynik: komunikat "Klucz NIE istnieje"

Wszystko działa prawidłowo, gdyż inaczej być nie może.
To nie Twój program popełnia błąd, tylko Ty, coś przeoczyłeś i w dalszej pracy nad programem zaowocuje to kolejnymi błędami, gdyż nie rozwiązałeś problemu, lecz "zamiotłeś go pod dywan". Nie wiesz dlaczego warunek nie działa.