Next i Back.

0

Witam.

Mam taki problem:
Napisalem taką prostą przeglądarke plików jpg i bmp (jestem początkujacy). No, niby dziala - ok.
Ale jak zrobić żeby po naciśnięciu pewnego przycisku program wyświetlał nastepny plik w foderze (lub ostatni - powinny byc 2 mozliwości)? Chodzi mo o to żeby nie trzeba bylo otwierac pliku przez Openpicturedialog, tylko po prosru kliknac button następny lub poprzedni i juz......

mógłby mi ktoś jakoś poradzić, ale tak żebym zrozumiał? ;)

pozdrawiam

ps. pisze jako anonim bo opcja przypominania hasel nie dziala.....:(

0

To się przyda: http://4programmers.net/article.php?id=92

Sprawdzaj tylko dla plików ..

0

hmmmm troche to skomplikowane - ale spróbuje cos zrozumiec, jakco to jeszze sie spytam

dzięki!

0

procedure TMainForm.SearchDir(StartPath: String);
var
SR: TSearchRec;
Found : Integer;

function IsDir(Value : String) : String;
begin
if Value[Length(Value)] <> '\' then
Result := Value + '\' else Result := Value;
end;

begin
Found := FindFirst(IsDir(StartPath) + '.', faDirectory, SR);
while Found = 0 do
begin
Application.ProcessMessages;
if ((SR.Attr and faDirectory) = faDirectory) and
((SR.Name <> '.') and (SR.Name <> '..')) then
begin
ListBox1.Items.Add(IsDir(StartPath) + SR.Name);
SearchDir(IsDir(StartPath) + SR.Name); {<-- w tym miejscu następuje wywołanie
samej siebie }
end;
Found := FindNext(SR);
end;
FindClose(SR);
end;

tak to brzmi..... ta procedura jest jakby pod akcja Searchdir.......ale co to jest?
i jkai mam komponent użyć? ech......

0

Komponent?.. hmm - żaden.

To jest na wyszukiwanie wszystkich plików i katalogów z katalogu, więc sobie skróć tylko do twojego katalogu wyjściowego, bez tej całej rekurencji.. a warunek na to, czy znalazł plik masz:

if ((SR.Attr and faDirectory) = 0) then...

Ładujesz sobie te wszystkie pliki z katalogu w listę, a później jedziesz po tej liście w zależności jak tam chcesz: następny, poprzedni, ostatni.. oczywiście mówię o TStringList.

0

ale to : if ((SR.Attr and faDirectory) = 0) then...
to mam wstawic w akcji czego?
i co dodac do uses i jak nazwac procedure?

i jak napisac np: następny? ;)

wiem ze prosze praktycznie o wszystko ale sam sobie nie poradze.....

0

Ojj widze, że sie bierzesz za pisanie programu ale nie masz zbyt dużego pojęcia co robisz? :-/

Wszystko zależy jak te pliki masz poustawiane. Chcesz wcisnąć jakiś przycisk i ma się pojawić następny, albo poprzedni, lub też ostatni. Może da się to zrobić w inny sposob ale ja korzystam tu z procedury Adama. Można załadować wszystkie twoje pliki (obrazki) jpg na liste (TStringList), to znaczy ich pełne ścieżki, a później tylko poruszać się po nich. Zobacz jak działa procedura Adama ... sprawdź ją u siebie .. - i odpowiednio zmień. Jak już załadujesz listę, to z ładowaniem obrazków powinieneś sobie poradzić. Zapewne trzeba wywalić tą linię:

SearchDir(IsDir(StartPath) + SR.Name);

.. no i jeszcze sprawdzić typ pliku:

if (AnsiLowerCase(ExtractFileExt(IsDir(StartPath) + SR.name)) = '.jpg') then

... to tyle co mogę pomóc bez Delphi .. - dalej chyba sobie poradzisz..

Dopisane: dobra masz tu załadowanie na liste (do ListBoxa...)

procedure TForm1.ZaladujListe(StartPath: string);
var
  SR: TSearchRec;
  Found : Integer;

  function IsDir(Value : String) : String;
  begin
    if Value[Length(Value)] <> '\\' then
      Result := Value + '\\' else Result := Value;
  end;

begin
Found := FindFirst(IsDir(StartPath) + '*.*', faDirectory, SR);
  while Found = 0 do
  begin
    Application.ProcessMessages;
    if ((SR.Attr and faDirectory) = 0) then
    begin
      if (AnsiLowerCase(ExtractFileExt(IsDir(StartPath) + SR.name)) = '.jpg') or (AnsiLowerCase(ExtractFileExt(IsDir(StartPath) + SR.name)) = '.bmp') then
      begin

        ListBox1.Items.Add(SR.Name);

      end;
    end;
  Found := FindNext(SR);
  end;
  FindClose(SR);
end;
0

ostatnie pytanie:

procedure TForm1.ZaladujListe(StartPath: string);

co to jest?.... to jest jakis events?....i co dodac do proxcedur na poczatku zeby to w ogóle wykrył?.....bo to przeciez nie ejst komponent nie? jak do procedur dodam tą linijke to sie wysypuje......

0

jak dodam do procedur na gorze to:
procedure TForm3.ZaladujListeX(StartPath: string);

to pisze blad ze : Expected "=" but "(" found. i mnie odnaosi do miejsca zaznoaocznego ptrzez ze mnieikesem (na górze) (ozywiscie jego tam nie ma przy kompilacji.....)

0

Jaki event?

Umiesz dodać deklarację procedury do części interface? .. bo jeśli nie to przeczytaj jakiś kurs.. jak Ty programy pisałeś :>

0

a jak na gorze estawie samo :

procedure ZaladujListe(StartPath: string);

to tym razem pisze że :

[Error] Unit3.pas(33): Identifier redeclared: 'ZaladujListe'

ta opcja next i back chyba mnie przerasta....

0

bo trzeba jescze zadeklarować procedurę albo w klasie TForm i wtedu odwołujesz się do niej przez:

procedure TForm.Załaduj....

albo gdzieś przed pierwszym var-em.

//dopisane: ups. nie doczytałem, błąd wskazuje na to że masz podwójnie zadeklarowaną tę procedurę.

0

tam na gorze mam :

procedure zaladuj(StartPath: string);

potem, zaraz pod implementation mam:

implementation

uses Unit2, Unit1, Unit4;

procedure Tform3.zaladuj(StartPath: string);
var
SR: TSearchRec;
Found : Integer;

function IsDir(Value : string) : string;
begin
if Value[Length(Value)] <> '\' then
Result := Value + '\' else Result := Value;
end;

begin
Found := FindFirst(IsDir(StartPath) + '.', faDirectory, SR);
while Found = 0 do
begin
Application.ProcessMessages;
if ((SR.Attr and faDirectory) = 0) then
begin
if (AnsiLowerCase(ExtractFileExt(IsDir(StartPath) + SR.name)) = '.jpg') or (AnsiLowerCase(ExtractFileExt(IsDir(StartPath) + SR.name)) = '.bmp') then
begin

form3.ListBox1.Items.Add(SR.name);

end;
end;
Found := FindNext(SR);
end;
FindClose(SR);
end;

a jak chce sie odwolac przez :

procedure TForm3.SpeedButton5Click(Sender: TObject);
begin
procedure tform3.zaladuj;

end.

to sie sypie, co robie źle?

0

hmm koncówke zrobilem tak:

procedure TForm3.SpeedButton5Click(Sender: TObject);
procedure zaladuj;
begin

end;

begin

end;

i sie teraz kom[piluje, ale jak nacisne na speedbutton5 to nic sie nie dzieje, wiec pewnie cox znowu pomieszalem (a gdzie w tej procedurze jest napisane jakie pliki tj.z jakiego folderu ma poberac?)

0
procedure TForm3.SpeedButton5Click(Sender: TObject);
begin
zaladuj('c:\\windows'); // albo inny katalog z obrazkami
end; // średnik !

// Detox, respekt za cierpliwość [prosze] - ŁF

0

no, cos mam...

dzieki ze mnie nie zwyzywaliście. Jak bede mial problemy (bede mial - czuje to) to jeszcze napisze.
Detox, wielkie dzięki za napisanie mi całej tej procedury.

thx all!

teraz tylko jak zmieniac lokalizacje ladowanych plików...i jak wreszcie wykorzystac to next i back, popróbuje coś wymyślić......

pozdrawiam

0

czy moze użyc filelistbox zamiast listbox? bo w listbox nie dziala takie cos jak:

listbox.filename; a filelistbox.filename dziala......

0

jak chcesz uzyc filelistbox nie widze problemu - wybór nalezy do ciebie, ale w ListBox napisz zamiast listbox1.filename to listbox1.items[listbox1.itemindex]

0

dobra, skonczylem - to oczywiscie nie jest jakis super prog - chcialm sie p oprosru nauczyc jak to sie robic

dziekuje wszystkim za pomoc!!

ps. jak ktos chce sie pośmiac to niech poda maila - wysle program ze żródłem ;)

pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1