Kłopot z zapisem typu rekordowego do pllku.

0
var
  Form4: TForm4;
  Pytania:TPytania;
  PytaniaPlik: file of TPytania;
  TablicaPytan1: array[1..6] of TPytania;
  nazwa, pyt11:string;

implementation


{$R *.dfm}


procedure TForm4.Button1Click(Sender: TObject);
begin
  Nazwa:=Edit1.Text;
  AssignFile ( PytaniaPlik, 'C:\Test Ivo\nazwa' +
                            nazwa + '.txt');
   ReWrite ( PytaniaPlik );
  while not eof(PytaniaPlik) do

  TablicaPytan1[1].pyt1:=Edit2.Text;
  TablicaPytan1[1].A1:=Edit3.Text;
  TablicaPytan1[1].B1:=Edit4.Text;
  TablicaPytan1[1].C1:=Edit5.Text;
  write (PytaniaPlik, TablicaPytan1[1].Pyt1 );
  end;

Kompilator wywala mi błąd w którym nie wiem co miałbym zrobić:

[DCC Error] Unit4.pas(72): E2010 Incompatible types: 'TPytania' and 'ShortString'

Kod rekordu:

Type
  TPytania = record
    Pyt1:String[120];
    A1:String[120];
    B1:String[120];
    C1:String[120];

Proszę o sprostwanie błędu i dziękuję :)

dodanie znaczników <code class="delphi"> - furious programming

1

Po pierwsze temat powinien być poruszony w dziale Newbie. Ponieważ póki takowy dział tutaj istnieje, tam zadajemy pytania o banalne podstawy. Tam przenoszę ten wątek.

Po drugie co to za formatowanie "z pupki", czyli jego brak? Nie umiesz formatować samodzielnie, to sobie pogoogluj za informacjami o narzędziach, które zrobią to za Ciebie. Jest o tym bardzo wiele informacji.

Po trzecie coż za finezja we wklejaniu kodu. Część w znacznikach, część bez. A jak już w znacznikach to nie takich żeby nam ułatwić - jak na przykład delphi. Niepotrzebne są bzdetne dopiski, powialające temat.

Po czwarte, poczytaj podstawy. Bo widzę, że nie masz pojęcia jak działa Write. Bo powinno być albo coś w stylu takim jak poniżej, ale cholera wie czy to się powiedzie jak należy, nie sprawdzałem:

var
  OgarnijSie : File of Shortstring;
//...
  Write(OgarnijSie, ShortString('test'));

Także najlepiej i na logikę. Jeżeli masz plik typu rekordowego, to jakim prawem chcesz do niego zapisać string, a nie record? Także powinno być raczej takie coś:

  Write(PytaniaPlik, TablicaPytan1[1]);

Poza tym pętla jak wiadomo w takim kształcie wykona tylko jedną instrukcję, a chyba ma wszystkie poniżej do końca. Ale jak się nie formatuje kodu w ogóle. Lub olewa wspomaganie się formatterami. To niestety ciężko takie coś wychwycić. Poza tym pętla jest bez sensu. Bo cały czas ma się zapisywać pierwszy element tej tablicy? To w takim razie po co ta tablica. Więcej w kod nie wnikałem. Cholera wie, czy po poprawkach to będzie działać tak, jak sobie założyłeś. Ale wątpie.

A i na koniec dodam, że recydywa w dodawaniu tagów z "pupki" poza konkretnym IDE / językiem programowania. A także tytułowanie wzięte również "z pupki", zamiast konkretnie opisać problem w kilku słowach. Będą skutkować przeniesieniem wątku do Kosza bez żadnego rozczulania się. Sorry, ale takie zadanie Moderatorów. Olewacie nagminnie zasady tego forum i nasze prośby o ogrnięcie wyglądu wątków. To spodziewajcie się w związku z tym "nagród" w postaci "Koszowania" Waszych wątków.

0

spokojnie :) uczę się dopiero i najlepiej się uczyć na przykładach, jestem studentem i chciałbym aby ktoś wyjaśnił mi błąd. Kiedy wrzucam
Write(PytaniaPlik, TablicaPytan1[1]); wyświetla się tylko pierwszy wers w pliku z bazą danych, natomiast kiedy dodam pętlę while not eof(Pytania) nic sie nie zapisuje, próbowałem już wszelakich rozwiązań, ale.. Każdy miał swoje początki, a mi bardzo zależy na programowaniu.. Szukałem czegoś podobnego jak i w książkach Kent'a Reisdorph'a, jak i w sieci...

usunięcie cytowania prawie całego poprzedniego posta - furious programming

0

Ja jestem spokojny, ale do czasu. Uwierz mi nieraz też byś się wkurzał, chociaż troszkę. Jakbyś był ignorowany, a chciał dla wszystkich dobrze. W sensie, żeby na forum panował jako taki porządek w wątkach i ich otagowaniu oraz tytułach. I żeby ludzie używali Google.

Co do zapisu, to ja bym zrobił coś w ten deseń, jak poniżej. Dodałem pętlę i zapis pytania z numerem. Żeby "naocznie" w pliku widzieć czy wszystko jest ok. Wcześniej problemem było to EOF. Musisz poczytać jak to działa. Na ogół używa się tego przy odczycie danych.

A jak można żądać by następował zapis czegokolwiek, jeśli wcześniej plik został utworzony poprzez Rewrite? I dlatego jest pusty (ma zero bajtów, dopóki nic z nim nie zrobimy, w sensie zapis do niego). Także pętla nie wykonała się ani razu. Pomijając to, o czym wspomniałem we wcześniejszej swojej odpowiedzi, że pętla jaką wkleiłeś wykonywała się jak już tylko dla pierwszej instrukcji po do. To samo dotyczy takich konstrukcji jak if ... then oraz with ... do. Ale o tym wiedział byś dawno zgłębiając podstawy.

type
  TPytania = record
    Pyt1 : string[120];
    A1 : string[120];
    B1 : string[120];
    C1 : string[120];
  end;

var
  Nazwa : string;
  PytaniaPlik : file of TPytania;
  TablicaPytan1 : array[1..6] of TPytania;

procedure TForm1.Button1Click(Sender : TObject);
var
  I : integer;
begin
  Nazwa := Edit1.Text;
  AssignFile(PytaniaPlik, 'D:\' + Nazwa + '.bin');
  ReWrite(PytaniaPlik);
  for I := Low(TablicaPytan1) to High(TablicaPytan1) do
  begin
    TablicaPytan1[I].pyt1 := 'Pytanie numer ' + IntToStr(I) + ' = ' + Edit2.Text;
    TablicaPytan1[I].A1 := Edit3.Text;
    TablicaPytan1[I].B1 := Edit4.Text;
    TablicaPytan1[I].C1 := Edit5.Text;
    Write(PytaniaPlik, TablicaPytan1[I]);
  end;
  CloseFile(PytaniaPlik);
end;

Zmieniłem tylko nazewnictwo pliku oraz wywaliłem zbędne dla działania kodu zmienne.

A co do lektury książek. Rób jak uważasz. Ucz się z czego chcesz. Byle skutecznie. Wedle mnie kompendium Adama o Delphi, ze strony 4p. W zupełności wystarczy do zgłebienia podstaw. A później należy kodzić jak najwięcej, ale z początku prostych rzeczy. I na pewno trzeba wytrwale googlować, kombinować dosłownie do bólu. I dopiero w ostateczności pisać z czymkolwiek na jakiekolwiek forum tematyczne. Nie zrażać się. Bo imo bez wykazania się samodzielnością, daleko się nie zajdzie w programowaniu, nigdy.

0

I właśnie dzięki tobie dowiedziałem się więcej niż przez 6h googlowania i wyszukiwania - Ja mam ten problem, że muszę zobaczyć jak coś działa, by załapać o co chodzi, taki sam problem miałem z klasami, bo kompletnie nie wiedziałem do czego one służą i czego mam się spodziewać po kompilacji, dziękuję bardzo i biorę się do pracy :)

ps. Tych pytań ma być 24 oraz wszystkie rekordy muszą się zapisywać i wczytywać z pliku, jeszcze tylko muszę logicznie pomyśleć jak zrobić by poprawna odpowiedź była wczytana z pliku.

Co do kodzenia bawiłem się ostatnio w tworzenie gierki na zasadzie CheckButtonów i TTimera. I jak zwykle miałem kłopot z zapisem do pliku zdobytych statystyk, gra działa na zasadzie gier przeglądarkowych jednak nie ma zapisu póki co.

2

Rozważ plik ini:

[Ile palców masz na ręcę=C]
A=3
B=4
C=5
D=6

[Czemu waść chrzani=A]
A=Bo nie umie korzystać z googla
B=Bo ma nick wojas666
C=Bo tak
D=Bo jak chrzanisz to dostajesz gotowce
1

Rozumiem. Bo przykład najlepiej przemawia do czlowieka. Kiedy ja zaczynałem coś tam modzić w Delphi. To na google wiele ciekawych stron z tym nie było. A nawet same 4p jeszcze raczkowało, bo było zdaje się tutaj tylko FAQ. A calość hostowana na chyba of.pl.

A dowiedział byś się o wiele więcej przez nawet 5 godzin. Gdybyś tylko chciał. Na pewno jak działaja: EOF, Write, czy zasady stosowanie begin. A jaka była by Twoja satysfakcja. Że sam dałeś radę :) Ja oczywiście lubię tutaj pomóc, kiedy mogę i potrafię. Ale na prawdę wiele razy człowiek powiela te same odpowiedzi, a ciężko sobie przygotować szablon odpowiedzi. No chyba, że zawsze napiszemy RTMF! albo użyj Google. I to nie będą słowa bez pokrycia. Tylko życiowe doświadczenie :)

Co do zapisu prawidlowej odpowiedzi. To wystarczy dodatkowe pole rekordu typu Byte i w niej zapisany jej numer. Odczyt to też pikuś. Po prostu pętla taka, jaką stosowałeś wcześniej. Tylko należalo by albo użyć tablicy dynamicznej i zwiększąć ją przed odczytem kolejnego rekordu. Albo zapisać numer rekordów w bazie i odczytać go na początku. Albo najbardziej wedle mnie elegancko, to jeśli już i tak kodzisz pod VCL, to skorzystać z dobrodziejstw inwentarza. I w pętli while not EOF... do begin ..., po prostu dodawać rekordy jako dane do na przykład TListBox.

Czyli jakoś tak, na szybko klepane. Bo nie chce się mi teraz zagłębiać w sposoby przekazywania recordów jako TObject i prawidłową obslugę tego.

//...
type
  TPytania = record
    Pyt1 : string[120];
    A1 : string[120];
    B1 : string[120];
    C1 : string[120];
  end;
  TPytObj = class(TObject)
    Pyt1 : string[120];
    A1 : string[120];
    B1 : string[120];
    C1 : string[120];
  end;

var
  Nazwa : string;
  PytObj : TPytObj;
  PytaniaPlik : file of TPytania;
  TablicaPytan1 : array[1..6] of TPytania;

procedure TForm1.Button1Click(Sender : TObject);
var
  I : integer;
begin
  Nazwa := Edit1.Text;
  AssignFile(PytaniaPlik, 'D:\' + Nazwa + '.bin');
  ReWrite(PytaniaPlik);
  for I := Low(TablicaPytan1) to High(TablicaPytan1) do
  begin
    TablicaPytan1[I].pyt1 := 'Pytanie numer ' + IntToStr(I) + ' = ' + Edit2.Text;
    TablicaPytan1[I].A1 := Edit3.Text;
    TablicaPytan1[I].B1 := Edit4.Text;
    TablicaPytan1[I].C1 := Edit5.Text;
    PytObj := TPytObj.Create;
    with PytObj do
    begin
      pyt1 := TablicaPytan1[I].Pyt1;
      A1 := TablicaPytan1[I].A1;
      B1 := TablicaPytan1[I].B1;
      C1 := TablicaPytan1[I].C1;
    end;
    ListBox1.Items.AddObject(TablicaPytan1[I].Pyt1, PytObj);
    Write(PytaniaPlik, TablicaPytan1[I]);
  end;
  CloseFile(PytaniaPlik);
end;

procedure TForm1.ListBox1DblClick(Sender : TObject);
var
  Idx : integer;
begin
  Idx := ListBox1.ItemIndex;
  if Idx > -1 then
  begin
    PytObj := TPytObj(ListBox1.Items.Objects[Idx]);
    if PytObj <> nil then
    begin
      with PytObj do
      begin
        ShowMessage(Pyt1);
      end;
    end;
  end;
end;
//...

Albo tak jak pisze dragon. Rozważ sobie plik typu INI. Masz do jego obsługi proste funkcje WinAPI lub klasę TIniFile. Banalne w obsludze jest to i to. Tylko sobie na prawdę pogooglować i popatrzeć co i jak. I nie można spocząć na laurach, pisząć że nie wiem o co chodzi w klasach. Bez nich programowanie obiektowe nie ma sensu.

A i czytałem Twój usunięty post i nic nie rozumiem z niego. Coś tam piszesz, że odwołujesz się do elementu tablicy [2] i dziwisz się, że podaje Tobie dane od niego, a nie od tego z pętli. Ty chyba nie masz pojęcia o co chodzi w pętlach i do czego słuzą tablice. Ale chyba zorientowałeś się, stąd usunięcie.

Natomiast tablica i tak jest tutaj zupełnie zbędna. Bo robiąc sobie edytor pytań do późniejszego dopisania ich do Twojego pliku "bazy", można wszystko sobie trzymać na liście takiej jak TListBox, dodając je jako obiekty i odwołujac do nich. Tak, jak to pokazałem powyżej. Dodawanie nowego elementu i jego usuwanie ewentualnie to też banał. Później wszystko sobie tylko w pętli od 0 do TwojListBox.Items.Count - 1 zapisujesz do pliku i tyle. Ogółnie banały, a więc bez poznania podstaw samodzielnie poprzez lekturę komendium na 4p od początku do końca się nie obędzie. Bo bez podstaw będziesz błądził po omacku i zadawał ze 1638 pytań, bez końca.

A nie o to chodzi przecież żeby pytać, tylko umieć sobie poradzić samodzielnie. Wyobraź sobie, że dostałeś takie zlecenie pracując w firmie, a tutaj dedaline to godzina. Nie ma akurat netu, bo padł. Z biura wyjść nie możesz. Jedynie do czego masz dostęp do Delphi i dołączony do IDE help. I trzeba zkodować albo nie wiem, dyscyplinarka. Wiem, przykład może i ekstremalny, może nie myślisz też o pracy jako programista w przyszłośći. Ale sam wspominasz w jednym ze swoich postów, że zależy Tobie na programowaniu. No to pewnie w przyszlości nie tylko hobbystycznie.

A Dragon zauważył niestety słusznie, że już za dużo dostałeś gotowców. Także na tym postaram się poprzestać. Bo pewnie Ciebie tylko bardziej rozleniwiam. I myślisz sobie coś w stylu "e jakiś frajer daje mi tutaj gotowe kody, to ja trochę pościemniam, że więcej się tutaj nauczyłem dzięki kodom od niego, a i tak zaraz mi naklepie cały program za mnie, no i kij mu w oko, jak tak się dał wciągnąć w pomaganie mi leniowi" itd ;)

0

Co do tablic już doszedłem co i jak i za to dziękuję, co do reszty postaram sobie sam dojść co i jak i tak za dużo pomogliście :)
Co do książek, Profesor na pierwszym wykładzie powiedział prosto z mostu, że jeśli chcemy uczyć się programowania z książki, to mamy wziąć tą książkę i z całej siły uderzyć się nią w głowę, bo większość treści które są tam zamieszczone nigdy nam się nie przydadzą, bądź wychodzą z podstaw.

Jeszcze raz wszystkim dziękuję za pomoc i pozdrawiam :)

0

Okey, dodawanie Pytań/Odpowiedzi z głowy, zrobiłem to w plikach INI. Kolejny problem pojawił się z odczytaniem poprawnej wartości z pliku INI:

"[Czemu waść chrzani=A]"
cytując kolegę wyżej, a mianowicie chciałbym połączyć RadioButtony z poprawnymi odpowiedziami, dzisiaj straciłem na to pół dnia, prosił bym tylko o przykład pobrania poprawnego A.

Z góry dzięki.

1

Pobierasz identyfikator sekcji, po czym odwołujesz się do ostatniego znaku tego łańcucha - co w tym takiego trudnego?

Chyba że masz problem z pobraniem wszystkich identyfikatorów sekcji? Do tego służy metoda ReadSections:

procedure ReadSections(Strings: TStrings); override;

Call ReadSections to retrieve the names of all sections in an INI file into a string list object.

Strings specifies the string object to hold the retrieved names. Strings can point to a TStrings object, or to a component property, such as Items for a TListBox component.

This version of ReadSections is only available if the application is compiled for Windows. On Linux, ReadSections is inherited from TMemIniFile.

Cytat z helpa Delphi7.

1

TIniFile.ReadSections
TIniFile.ReadSectionValues

0

Dzięki wielkie po raz kolejny.

0

hmm taki kolejny problem, a mianowicie, mam kod zapisu i odczytu z IniFile, wygląda on następująco:

  • Zapis:
    var
  Form4: TForm4;
  Pytanie1:TNazwa;
  AA:String;
  Pytania:TIniFile;

procedure TForm4.Button1Click(Sender: TObject);
begin
 Pytania:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'Pytania.ini');
 Pytania.WriteString( 'Pytania', 'Temat', Edit1.Text );
 AA:='Pytanie1';
 begin
 Pytania.WriteString( AA, 'Pytanie Pierwsze:', Edit2.Text );
 Pytania.WriteBool( AA, 'A1', RadioButton1.Checked);
 Pytania.WriteBool( AA, 'B1', RadioButton2.Checked);
 Pytania.WriteBool( AA, 'C1', RadioButton3.Checked);
 Pytania.WriteString( AA, 'A', Edit3.Text  );
 Pytania.WriteString( AA, 'B', Edit4.Text );
 Pytania.WriteString( AA, 'C', Edit5.Text );
 Pytania.Free;
 end;
  • Odczyt:
    • Button odpowiadający przyznaniu pukntu za dobrą odpowiedź:
procedure TForm6.Button1Click(Sender: TObject);
begin
G:=0;
N:=1;
  Pytania:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'Pytania.ini');
case RadioGroup1.ItemIndex of
0:Begin
  if Pytania.ReadBool( AA, 'A1', true ) then
   begin
      Dobra1.Caption:=IntToStr(1);
   end
     else Dobra1.Caption:=IntToStr(0);
End;
1:Begin
  if Pytania.ReadBool( AA, 'B1', true ) then
   begin
      Dobra1.Caption:=IntToStr(1);
   end
     else Dobra1.Caption:=IntToStr(0);
End;
2:Begin
  if Pytania.ReadBool( AA, 'C1', true ) then
   begin
      Dobra1.Caption:=IntToStr(1);
   end
     else Dobra1.Caption:=IntToStr(0);
     { Koniec Pytania Pierwszego }
 Pytania.Free;
end;

*Wczytanie do label'ów wartości z pliku INI:

procedure TForm6.Button2Click(Sender: TObject);
begin
Pytania:=TIniFile.Create(ExtractFilePath(ParamStr(0))+'Pytania.ini');
 Label2.Caption:=Pytania.ReadString( AA, 'Pytanie Pierwsze:', Label2.Caption );
 Label1.Caption:=Pytania.ReadString( AA, 'A', Label1.Caption );
 Label3.Caption:=Pytania.ReadString( AA, 'B', Label3.Caption );
 Label4.Caption:=Pytania.ReadString( AA, 'C', Label4.Caption );
 Pytania.Free;
end;

Problem polega na tym, że kiedy stworzę test, wszystko ładnie pięknie wczytuje do labeli oraz poprawnych odpowiedzi, ale kiedy zamknę program i wczytam wcześniej stworzony test do Ini wszystkie odpowiedzi są poprawne, A Labele są puste, jak by wcale nie otwierał tego INI..

1

Pytania z różnych kategorii trzymaj w różnych plikach.

0

oto moje dzieło, dzięki wszystkim co pomogli :)
Login: Administrator
Hasło: Prymus1

Jeszcze malutka prośba, jeśli ktoś wyłapie jakieś błędy, bugi proszę śmiało je wytykać pod postem.

0

Nie chciałem zakładać nowego tematu, więc napiszę tutaj. Pracuję teraz nad kolejnym projektem, a mianowicie tworzę prostą gierkę w stylu przeglądarkowych, na zasadzie ( kliknij -> wykonaj ). Pomysł raczej związany z dalszym rozwijaniem umiejętności programistycznych. Utrwalam sobie pracę na RadioButtoncha, CheckButtonach, Klasach, zapisem do pliku, progressbar'ach .. Ale mniejsza o to..

Napisałem ponieważ mam problem z odtwarzaniem dźwięku ".wav" po kliknięciu na Button. Skorzystałem z MMSystem i problem polega na tym, że system odtwarza mi "Dong".. Przeczytałem poradnik Adam'a. W uses wklepałem: MMSystem. A wycinek kodu wygląda następująco:

PlaySound( 'C:\Pantera.wav', 0, SND_FILENAME);
1

Nie ogarniam tych PlaySoundowych rzeczy. Ja ułatwił bym sobie sprawę i skorzystał z bass.dll. Wtedy możesz śmiało używać też i mp3. Dodatkowo zyskując potężne możliwości. A przy okazji przećwiczysz sobie zabawę z dllkami. Do samej dllki są dołączone przykłady użycia, również w Delphi. A do tego bogata dokumentacja i unit do używania dlki dynamicznie. Nic tylko korzystać, jeśli projekt będzie nniekomercyjny. A i idiotyzmem jest podawanie ścieżki do pliku "na sztywno". No chyba, że tylko na chwilę i dla testów.

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