Wypisanie zawartosci klucza do TMemo

dział ogólny

Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » niedziela, 22 marca 2009, 20:42

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?
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Cyfrowy Baron » poniedziałek, 23 marca 2009, 12:06

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;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » poniedziałek, 23 marca 2009, 16:31

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?
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez wargo » poniedziałek, 23 marca 2009, 16:43

Usuń:
Kod: Zaznacz cały
Memo1->Lines->Clear();
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » poniedziałek, 23 marca 2009, 17:07

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 ;)
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Cyfrowy Baron » poniedziałek, 23 marca 2009, 18:08

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;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » poniedziałek, 23 marca 2009, 18:26

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:
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Corvis » poniedziałek, 23 marca 2009, 18:51

bo brakuje przy tmpValue -
Kod: Zaznacz cały
tmpValue->Count
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Cyfrowy Baron » poniedziałek, 23 marca 2009, 19:15

Szybko pisałem i mi umknęło.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » środa, 25 marca 2009, 21:48

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?
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez kinio » środa, 25 marca 2009, 22:01

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.
If a machine is expected to be infallible, it cannot also be intelligent.
-- A.Turing
Avatar użytkownika
kinio
Homos antropiczny
Homos antropiczny
 
Posty: 67
Dołączył(a): poniedziałek, 14 lipca 2008, 08:51
Podziękował : 0
Otrzymał podziękowań: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » środa, 25 marca 2009, 22:19

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 ;)
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Cyfrowy Baron » czwartek, 26 marca 2009, 10:07

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("--------------------------------------------------------------------------");
         }
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Bishamoth » czwartek, 26 marca 2009, 16:15

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.
Avatar użytkownika
Bishamoth
Bladawiec
Bladawiec
 
Posty: 40
Dołączył(a): niedziela, 1 marca 2009, 22:51
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP3
Kompilator: C++ Builder 6
Gadu Gadu: 0
    NieznanyNieznana

Re: Wypisanie zawartosci klucza do TMemo

Nowy postprzez Cyfrowy Baron » czwartek, 26 marca 2009, 20:01

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.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4719
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości