Losowanie plików

2011-10-25 10:10
tomek
0

Witam. Potrzebuję funkcję napisaną w Delphi, która będzie losować jakiś plik (spośród kilkunastu), a następnie wyświetlać jego zawartość. Ogólnie ma to być program - test (spośród 50 pytan losuje 25 i na końcu podaje ilość poprawnych odpowiedzi). Pytania chciałbym zapisać w plikach.

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-10-25 10:30
0
  1. Wyszukać wszystkie pliki z pytaniami (FindFirst - FindNext - FindClose), ich nazwy zapamiętać w tablicy np. tab:array of string.
  2. Wylosować index:=Random(Length(tab)), ew. sprawdzić czy index nie powtórzył się.
  3. Wyświetlić zawartość pliku tab[index].

Pozostało 580 znaków

2011-10-25 10:32
0

ponazywać pliki wg wzoru "pliki.xxx" gdzie i to iteracja, po kolei 1, 2, 3, 4... itd. A potem w delphi zrobić losowanie integera i otworzyć plik z odpowiednim indexem. Czego z tego nie rozumiesz?

edytowany 1x, ostatnio: misiakufal, 2011-10-25 10:33

Pozostało 580 znaków

2011-10-25 12:09
0

może lepiej pytania zapisywać w jednym pliku, o określonym formacie? np.

Jakiego koloru jest biały maluch?|zielony|biały|niebieski|2
Gdzie się odbywa festiwal w Cannes?|w Cannes|w Wałbrzychu|w Benghazi|1

gdzie cyfra na końcu oznacza która odpowiedź jest prawidłowa

Pozostało 580 znaków

2011-10-25 14:56
tomek
0

Dopiero zaczynam nauke Delphi, takze prosze o wyrozumiałość. Mam jeszcze jedno pytanie. Mam instrukcje


procedure TForm1.FormCreate(Sender: TObject);

begin

if FileExists('pytania\*.txt') then
------------- w tym miejscu chciałbym, żeby program przechodził do innej procedury jak to napisać?  
else
ShowMessage('Brak pytań!');
Halt;
end;

Pozostało 580 znaków

2011-10-25 15:13
0

procedure InnaProcedura;
begin
//zawartość procedry
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  if FileExists('pytania\*.txt') then
    InnaProcedura  
  else
  begin
    ShowMessage('Brak pytań!');
    Halt;
  end;
end;

Pozostało 580 znaków

2011-10-25 15:36
tomek
0

A dałoby się zrobić coś takiego? - Sprawdź czy w pliku znajduje sie jakas liczba x ? Jeśli tak to w jaki sposob?

Pozostało 580 znaków

2011-10-25 17:06
0

Najprościej to chyba tak - użyć takiej funkcji:

function IsDigitIFile(WhatFile : string; WhatDigit : integer) : boolean;
var
  SL : TStringList;
begin
  Result := False;
  if FileExists(WhatFile) then
  begin
    SL := TStringList.Create;
    SL.LoadFromFile(WhatFile);
    Result := Pos(IntToStr(WhatDigit), SL.Text) > 0;
    SL.Free;
  end;
end;

I wywołać ją sprawdzając choćby tak:

const
  AWhatDigit = 3;
  AWhatFile = 'D:\plik.txt';
begin
  if IsDigitIFile(AWhatFile, AWhatDigit) then
  begin
    ShowMessage('Liczba ' + IntToStr(AWhatDigit) + ' jest w pliku ' + AWhatFile);
  end
  else
  begin
    ShowMessage('Liczba ' + IntToStr(AWhatDigit) + ' NIE występuje w pliku ' + AWhatFile);
  end;
end;

Jednak polecał bym Tobie najpierw poznać podstawy czytając kompendium na stronie 4p lub różne kursy dla początkujących do znalezienie w google, bo tak to będziesz co chwila pytał o jakiś banał, a nic się nie nauczysz, a takie programowanie w stylu umieszcze kilka komponentów na formatce, a o to jak zrobić to i owo zapytam na forum i program jakoś sam się zrobi - kompletnie nie ma sensu. Dodam jeszcze tylko, że funkcja FileExists musi mieć podaną ewentualną ścieżkę i obowiązkowo pełną nazwę pliku inaczej pokaże Tobie wyjątek. Natomiast wyszukiwanie plików najprościej zrobić funkcjami z WinAPI w taki sposób jak poniżej. Dodam, że u mnie katalog 'D:\a' istnieje i są w nim pliki exe. Jeśli natomiast chcesz zrobić wyszukiwanie rekursywne aby odnaleźć podkatalogi i w nich kolejne pliki to pogoogluj sobie za jakimiś przykładami lub pokombinuj samodzielnie. Przynajmniej się czegoś nauczysz, poza ułożeniem kontrolek na formatce, co oczywiście programowaniem z pewnością nazwać nie można.

const
  FindWhat = 'D:\a\*.exe';
var
  H : THandle;
  WFD : TWIN32FindData;
begin
  Memo1.Lines.Clear;
  H := Windows.FindFirstFile(PChar(FindWhat), WFD);
  if H <> INVALID_HANDLE_VALUE then
  begin
    repeat
      Memo1.Lines.Add(ExtractFilePath(FindWhat) + WFD.cFileName);
    until not Windows.FindNextFile(H, WFD);
    Windows.FindClose(H);
  end;
end;

Pozostało 580 znaków

2011-10-25 17:17
tomek
0

Zamierzam tak się uczyć zaawansowanych rzeczy, ale myślę, że dobrze uczyc sie na przykładach. Moge prosic jeszcze o wytłumaczenie pierwszej czesci kodu?

Pozostało 580 znaków

2011-10-25 17:46
1

Czego nie rozumiesz. Pogoogluj i poczytaj jak działa TStringList, to obiekt przechowujący stringi, a funkcja Pos opisana jest tutaj: Pos i źle podchodzisz do nauki, w kompendium na stronei 4p są oprócz wytłumaczenia podstaw także podawane przykłady. Przyswajając wiedzę z kompendium nauczysz się samodzielnie pisać takie programy, jakie będą Tobie potrzebne. To tak nie działa, że ułóżysz sobie komponenty, a później masz 100 pytan do. Ponieważ wszystkie początkowe wątpliwości rozwieje Tobie przyswojenie wiedzy o absolutnych podstawach, o które pytasz.


Pozostało 580 znaków

2011-10-26 10:23
tomek
0

Potrzebuje jeszcze jedną rzecz. Chcę zapisywać liczby w pliku ale tak, by przy każdym kolejnym zapisie liczba była o 1 linię niżej. Chodzi o to by nie nadpisywać poprzedniej liczby

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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