ďťż

Ładny brzuch

Znowu mam problem. Poniższa procedura z założenia ma działać w ten sposób, że po każdorazowym wejściu na zakładkę TabSheet2 ma w FileListBox1 wyświetlić listę plików (pliki nie mają rozszerzeń). Zależy mi na sprawdzeniu czy istnieje plik _WSZYSTKIE, podkreślenie jest po to, aby sortował(ustawiał się) się na początku listy. I w tym momencie mam bardzo dziwne zachowanie: przy pierwszym wejściu na zakładkę procedura działa poprawnie, przechodzę na inną zakładkę, wracam na tą swoją i teraz if (FileExists('grupy/_WSZYSTKIE')=false) zwraca FALSE.
O co tu może chodzić? Myślałem o zwalnianiu pamieci, ale tu nie ma zmiennych, którym można zrobić FREE. Próbowałem ze sposobem zapisu ścieżki do katalogu ../Grupy, czyli bez ../ lub zamiast /, ale klęska na całej linii. Katalog 'Grupy' jest podrzędny w stosunku do katalogu w którym jest główny plik programu (exe). Może zamiast TabSheet2Show użyć jakiejś inne metody? Ta mi się wydaje najbardziej odpowiednia.
Resztę ew dopowiem później bo żony nie ma a dziecko mi już szaleje (pora spania)...

procedure TSDIAppForm.TabSheet2Show(Sender: TObject);
begin
FileListBox1.Items.Clear;
if DirectoryExists('../Grupy')=FALSE then CreateDir('Grupy');
if (FileExists('grupy/_WSZYSTKIE')=false)
then Application.MessageBox('Brak pliku "_WSZYSTKIE"!', 'Błąd programu.',MB_OK + MB_Iconstop)
else
FileListBox1.Directory := ('Grupy');

end;

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)



Wiem już trochę więcej. Założenia:

c:program.exe - mój program
c:Grupy - katalog 'Grupy'
c:Grupy_WSZYSTKIE - plik '_WSZYSTKIE'

Odkryłem, że problem robi mi:

FileListBox1.Directory := ('Grupy');

Za pierwszym razem warunek: if (FileExists('grupy/_WSZYSTKIE')=false)
sprawdza ścieżkę:

c:Grupy_WSZYSTKIE

a następnym razem:

c:GrupyGrupy_WSZYSTKIE

Jak to można poprawić?

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

cytat:Perpetum napisał:

Wiem już trochę więcej. Założenia:

c:program.exe - mój program
c:Grupy - katalog 'Grupy'
c:Grupy_WSZYSTKIE - plik '_WSZYSTKIE'

Odkryłem, że problem robi mi:

FileListBox1.Directory := ('Grupy');

Za pierwszym razem warunek: if (FileExists('grupy/_WSZYSTKIE')=false)
sprawdza ścieżkę:

c:Grupy_WSZYSTKIE

a następnym razem:

c:GrupyGrupy_WSZYSTKIE

Jak to można poprawić?

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

Próbowałem jeszcze czegoś takiego, użycia:
try
treść mojej procedurki
finally
FileListBox1.Directory:= GetCurrentDirectory (tak tylko w skrócie to wygląda)
Niestety niezbyt to chce działać, powiedziałbym dokładniej: nie chce działać. Bezsensownie wygląda nadanie obiektowi wartości właściwości przy jego opuszczaniu (tzn, przy opuszczaniu innego obiektu, czyli zakładki, jednocześnie tego też opuszczam). Z drugiej strony to się gdzieś zapamiętuje gdzie nie powinno.
Zaaaaaaraz !!!! Coś mi zaświtało, wydaje mi się, że gdzieś czytałem, że Delphi ma błąd właśnie związany z destruktorem FileListBox. Na pewno niedawno o tym czytałem, tylko czy to chodziło o FileListBox to nie jestem pewien, ale może naprowadzi to kogoś mniej zielonego ode mnie na trop.

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

Ale fajnie, sam sobie pogadałem, może sam wpadnę po drodzę jak to zrobić, wtedy powiem. Jak dobrze się rozpędzę to może jakiegoś swojego kompilatora niechcący stworzę :-)

:bananas::bananas::bananas::bananas::bananas:

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)



cytat:Perpetum napisał:
Próbowałem jeszcze czegoś takiego, użycia:
try
treść mojej procedurki
finally
FileListBox1.Directory:= GetCurrentDirectory (tak tylko w skrócie to wygląda)
Niestety niezbyt to chce działać, powiedziałbym dokładniej: nie chce działać. Bezsensownie wygląda nadanie obiektowi wartości właściwości przy jego opuszczaniu (tzn, przy opuszczaniu innego obiektu, czyli zakładki, jednocześnie tego też opuszczam). Z drugiej strony to się gdzieś zapamiętuje gdzie nie powinno.
Zaaaaaaraz !!!! Coś mi zaświtało, wydaje mi się, że gdzieś czytałem, że Delphi ma błąd właśnie związany z destruktorem FileListBox. Na pewno niedawno o tym czytałem, tylko czy to chodziło o FileListBox to nie jestem pewien, ale może naprowadzi to kogoś mniej zielonego ode mnie na trop.

Zamiast finally zastosuj EXCEPT (wtedy w przypadku błędu wykona to co jest po instrukcji EXCEPT) czyli jestcto po prostu obsługa błędu ...

Terminator

Niestety EXCEPT i tak w tym momencie mnie nie urządza w tym przypadku. Wymyśliłem coś takiego jak poniżej, zadowolony byłem z tego niesłychanie, że trochę program oszukałem, ale okazuje się to jednak tylko częściowym rozwiązaniem.

procedure TSDIAppForm.TabSheet2Show(Sender: TObject);
begin
if fileexists('grupy_wszystkie')
then
begin
FileListBox1.Directory:=('Grupy');
end
else
begin
FileListBox1.Directory:=('.');
end;
end;

Zamias ELSE mógłbym EXCEPT wykorzystać, ale na jedno wychodzi. Obiekt FileListBox rzeczywiście jest chyba z błędem zrobiony.
To co tu zastosowałem w tym miejscu działa wyśmienicie, ale jak na innym TabSheet próbuję wczytać plik do list box z jakiegoś katalogu, to po przejściu z tej zakładki już się nie wczyta, bo nie może znaleźć pliku. Stosowanie teraz metod głupich jak powyższa nie ma sensu, bo przede mną jeszcze kawał programu do wykonania, a ten FileListBox będzie mi krzaczył w reszcie. Chyba z niego zrezygnuję i zastosuję ListBox według wskazówek OXI-ego (http://www.ks-ekspert.pl/forum/topic.asp?TOPIC_ID=9390), przynajmniej z tym nie ma problemów.
Dla testów otworzyłem nową formę, wstawiłem FileListBox1 i załóżmy dla zdarzenia FileListBox1Click dałem FileListBox1.Directory:=('Grupy'); wcześniej założyłem kilka katalogóww "Grupy" jeden w drugim, a wewnątrz każdego inny plik. Wyobraźcie sobie że ten głupi obiekt za każdym razem wchodzi o katalog głębiej, pomimo kombinowania z ".", "", "/" przed nazwą katalogu.

Aaaaaaaaa.
Właśnie znajomy mi podpowiedział. Próbowałem przy tym samym zdazreniu co zaraz pokaże zcegoś innego, lepiej już nie powiem czego bo popadacie (destruktorów własnej roboty i zwalniania pamięci, to mi ginął FileListBox).

Poniższa procedura rozwiązuje problem:

procedure TSDIAppForm.TabSheet2Hide(Sender: TObject);
begin
FileListBox1.Directory:=('..');
end;

Dobranoc. Do następnego razu.

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

Pytając z ciekawości już, czy uwazacie chłopaki, że to jest normalne zachowanie FileListBox-a?
Ładując do ListBoxa np zawartość jakiegoś pliku, ścieżkę do niego wskazuję jako parametr, a z tym niesżczęsnym FileListBoxem jest tak, że nazwę katalogu muszę przypisać jako wartość zmiennej. Co o tym sądzą starzy wyjadacze? Chyba to nie powinno działć w ten sposób?
Na razie zaproponowane przeze mnie rozwiązanie urządza mnie, mam nadzieję, że tak zostanie do końca budowy progsa. Może jednak okaże się, że to jest lipa?
Swoją drogą jest to chyba bardzo ciekawy przypadek...

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

Dziwne, że nikt nie pomyślał, że trzeba używać czegoś takiego jak ExtractFilePath(Application.ExeName).

Perpetum
_________________________________________________________________
Wiedz, że odpowiadając na moje (pewnie głupie) pytania "ratujesz" mi życie !!! :-)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •