CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z AutoRun

Problem z AutoRun

dział ogólny

Re: Problem z AutoRun

Nowy postprzez brando » sobota, 30 kwietnia 2011, 16:42

Dzięki Cyfrowy Baron za podsunięcie pomysłu. Zajmę się nim jeżeli mój sposób nie wypali. A mianowicie wykombinowałem takie coś. Po wyszukaniu folderów z nazwami programów i dodaniu ich do TStringList (dzięki polymorphism za podsunięcie tego pomysłu, rzeczywiście o wiele lepsze rozwiązanie) zwanego Foldery_Nazwy_Programow wywołuje zmienną Szukane i funkcję odpowiadająca za szukanie. W tej funkcji wyszukuje już pliki *.exe i dodaje je do odpowiednich TStringList. Oczywiscie zmieniłem nazwy funkcji odpowiadające za kliknięcie w przycisk na np. Klikniecie_Zainstaluj_X86. Potem jak już będę miał te pliki *.exe dodane do TStringList to mogę złożyć ścieżkę. Więc robię tak:

KOD cpp:     UKRYJ  
 void __fastcall TForm1::Wyszukaj_Programy(String Szukane)
 {
 int i;

for (i=0;i<Foldery_Nazwy_Programow->Count;i++)
      {
if (FindFirst(sAppDir + "Kategorie Programów" + "\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Foldery_Nazwy_Programow->Strings[i] + "\\" + Szukane, faAnyFile, Search) == 0)
     {
      do
      {
    if (Szukane == "[X86*.*") Zainstaluj_X86->Add(Search.Name);
    if (Szukane == "[X64*.*") Zainstaluj_X64->Add(Search.Name);
      }  while(FindNext(Search) == 0);

        FindClose(Search);
     }
   }

 }

void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
static int count = 0;
 Foldery_Nazwy_Programow = new TStringList;
 Zainstaluj_X86 = new TStringList;
 Zainstaluj_X64 = new TStringList;

 if (count != 0)
 {
  DeleteOldObjects(count);
  count  = 0;
 }

 if(FindFirst(sAppDir + "Kategorie Programów\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\*", faDirectory, Search) == 0)
     {
      do{
         if(((Search.Attr & faDirectory) > 0) & (Search.Name != ".") & (Search.Name != ".."))
         {
           Foldery_Nazwy_Programow->Add(Search.Name);
           CreateNewObjects(count, ExtractFileName(Search.Name));
           count++;
         }

         } while(FindNext(Search) == 0);
        FindClose(Search);
 }

   Szukane="[X86*.*";
   Wyszukaj_Programy(Szukane);
   Szukane="[X64*.*";
   Wyszukaj_Programy(Szukane);
}
 


Tylko jest pewien problem, ponieważ chciałem sprawdzić czy wszystko prawidłowo się dodaje, więc dodałem do nowego ListBoxa wszystkie elementy z Zainstaluj_X86 i okazało się, że dodaje wszystkie elementy, lecz później dodaje jeszcze kilka różnych, jakby wylosowanych.

Edit:

A i jeszcze zapomniałem: Co zrobić jeśli pliku nie będzie? Bo zauważyłem, że jeżeli (w przypadku Zainstaluj_X64) nie wyszuka mi programu to wyskakuje błąd. Jaki warunek napisać?

Edit:

Rozwiązałem już problem z dodawaniem kilku różnych elementów, po prostu nie czyściłem tych list, ale nadal wyskakuje błąd jeżeli programu nie będzie.

Edit:

Dodaję również w tym szukaniu nazwy programów do Napis_Nazwa_Programu[i]. Jak mogę usunąć z Search.Name końcówkę .exe?
Avatar użytkownika
brando
Bladawiec
Bladawiec
 
Posty: 14
Dołączył(a): czwartek, 21 kwietnia 2011, 23:24
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP, 7
Kompilator: C++ Builder 6
Gadu Gadu: 1148942
    Windows 7Firefox

Re: Problem z AutoRun

Nowy postprzez Cyfrowy Baron » niedziela, 1 maja 2011, 09:32

To co robisz ma coraz mniej sensu. Odnoszę wrażenie, że błądzisz w ciemnościach i na ślepo szukasz rozwiązania, zamiast zatrzymać się na chwilę i przemyśleć jeszcze raz koncepcję tego programu.

Czy ty się wogóle zastanowiłeś nad tym co tutaj masz:

brando napisał(a):
KOD cpp:     UKRYJ  
for (i=0;i<Foldery_Nazwy_Programow->Count;i++)
      {
if (FindFirst


Po jaką cholerę umieszczasz to w pętli? Gdzie widziałeś taką konstrukcję?
Zauważ, że masz tam dwie pętle, bo do while to też pętla. To aż się prosi o rekurencję.

Zmienna Szukane określa nazwę programu, ale niepełną.

Wyszukujesz pliki programów, czyli pliki z rozszerzeniem *.EXE. Ścieżka powinna wyglądać tak:

KOD cpp:     UKRYJ  
sAppDir + "Kategorie Programów" + "\\" + ListBox1->Items->Strings[ListBox1->ItemIndex] + "\\" + Foldery_Nazwy_Programow->Strings[i] + "\\*.exe"


a warunki:

KOD cpp:     UKRYJ  
    if (Szukane == "[X86*.exe") Zainstaluj_X86->Add(Search.Name);
    if (Szukane == "[X64*.exe") Zainstaluj_X64->Add(Search.Name);


To oczywiście nie może działać prawidłowo, gdyż funkcja FindFirst wynik zapisuje w strukturze Search, a Ty w żadnym warunku nie porównujesz wyniku z tą zmienną, więc gdzie tutaj sens???

Co ciekawe dalej masz coś takiego:
brando napisał(a):
KOD cpp:     UKRYJ  
   Szukane="[X86*.*";
   Wyszukaj_Programy(Szukane);
   Szukane="[X64*.*";
   Wyszukaj_Programy(Szukane);


Czyli funkcja Wyszukaj_Programy jest wywoływana dwukrotnie, za każdym razem z inną wartością argumentu. Więc użycie warunku nie ma najmniejszego sensu! Co porównujesz?

brando napisał(a):
KOD cpp:     UKRYJ  
    if (Szukane == "[X86*.*") Zainstaluj_X86->Add(Search.Name);
    if (Szukane == "[X64*.*") Zainstaluj_X64->Add(Search.Name);


To co przekazałeś zmiennej jako argument z jawnie określoną wartością, czyli jeżeli przekażesz funkcji poprzez argument - zmienną Szukane wartość "[X86*.*", to ta zmienna ma dokładnie taką wartość, to tak jakbyś zrobił taki zapis:

kod niepoprawny:
KOD cpp:     UKRYJ  
if ("[X86*.*" == "[X86*.*") Zainstaluj_X86->Add(Search.Name);
if ("[X64*.*" == "[X64*.*") Zainstaluj_X64->Add(Search.Name);


Dalsze rozważania do niczego nie prowadzą, gdyż Twój kod ma coraz mniej sensu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
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
    Windows XPFirefox

Poprzednia strona

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 3 gości