Witam!
Mam problem z programem takim jak w temacie - wyświetlanie plików z danego katalogu i segregowanie ich wg. nazwy, rozszerzenia, rozmiaru i daty powstania. Tzn znalazłem oczywiście procedury FindFirst i FindNext. I program teoretycznie działa (załącznik wszystkie.JPG). Procedura odpowiedzialna za samo wyświetlanie plików działa elegancko. Ale gdy chcę już sortować pliki np. według nazwy, to ostatni plik (ostatni, czyli zaczynający się na 'najpóźniejszą' literę) w katalogu wyświetlany jest podwójnie... Niezależnie od tego, czy sortuję według nazwy/rozmiaru (na razie tylko te procedury mam zrobione, ale podejrzewam, że dla pozostałych będzie to samo).
Deklaracje:
program plikens;
uses dos, crt;
type
pliki=^Element;
Element=record
nazwa:string;
rozmiar: integer;
czas: integer;
pop, nastepny: pliki;
end;
var
z: char;
pierwszy: pliki;
Tak wygląda mój kod na sortowanie wg nazwy (wg rozmiaru jest prawie taki sam, z tym, że w niektórych miejscach jest rozmiar a nie nazwa i Size a nie Name):
procedure wgnazwy;
var
DirInfo: SearchRec;
nowyplik: pliki;
wiekszy, mniejszy: pliki;
begin
clrscr;
begin
FindFirst('*.*', ReadOnly+Hidden+SysFile+Archive, DirInfo);
new(nowyplik);
nowyplik^.nazwa:= DirInfo.Name;
nowyplik^.rozmiar:= DirInfo.Size;
nowyplik^.czas:= DirInfo.Time;
wiekszy:= pierwszy;
nowyplik^.nastepny:= pierwszy;
pierwszy:= nowyplik;
while DosError = 0 do
begin
{Writeln(DirInfo.Name:20,' ',DirInfo.Size:10,' ',DirInfo.Time:20); }
FindNext(DirInfo);
new(nowyplik);
nowyplik^.nazwa:= DirInfo.Name;
nowyplik^.rozmiar:= DirInfo.Size;
nowyplik^.czas:= DirInfo.Time;
wiekszy:= pierwszy;
while (wiekszy <> nil) and (wiekszy^.nazwa < DirInfo.Name)
do
begin
mniejszy:= wiekszy;
wiekszy:= wiekszy^.nastepny;
end;
if wiekszy= pierwszy
then begin
nowyplik^.nastepny:= pierwszy;
pierwszy:= nowyplik;
end
else if (wiekszy= nil)
then begin
mniejszy^.nastepny:= nowyplik;
nowyplik^.nastepny:= nil;
end else
begin
mniejszy^.nastepny:= nowyplik;
nowyplik^.nastepny:= wiekszy;
end;
end;
end;
end;
procedure wgnazwy_wypisz;
var
pom: pliki;
begin
wgnazwy;
pom:=pierwszy;
while pom <> nil
do begin
writeln(pom^.nazwa:20, ' ',pom^.rozmiar:10, ' ',pom^.czas:20);
pom:=pom^.nastepny;
end;
readln;
end;
Wygląda to po wyświetleniu tak jak w załączniku wgnazwy.JPG i wgrozmiaru.JPG.
Pomógłby ktoś wskazać błąd w kodzie?
I drugi problem związany z wyświetlaniem.
Mam takie małe menu, jeżeli klikne np. 1 to sortuje wg nazwy, jeżeli 2, wg rozmiaru itp. Po sortowaniu wraca do menu. I jeżeli sortuje raz wg nazwy, wróce do menu, sortuje drugi raz wg nazwy np. (sortowania obojętnie jakie, zawsze podobnie jest) to on jakby zapisuje podwójnie wyniki wyszukiwania, powstaje coś takiego jak w załączniku problem.JPG. Z tym, że im więcej razy włącze sortowanie, tym więcej tych linijek powstanie. Próbowałem wstawiać gdzieś FindClose, ale nie pomogło niestety. Również proszę o jakieś wskazówki, jak zrobić, żeby tego nie było.
I takie jeszcze jedno pytanie. Czy tą 'datę' da się jakoś przekonwertować to normalnej daty? Sortowanie według tego już zrobiłem też i działa ok (poza wymienionymi wyżej problemami). Ale trochę dziwnie/nieładnie wygląda. Znalazłem procedury to zamiany tego na date ale w Delphi. Istnieje coś takiego w Pascalu?
Pozdrawiam ;)