Program na zaliczenie ;/ Katalogowanie książek

0

Witam

Mam problem.
Na zaliczenie przedmiotu mam zrobić program, który czytnikiem sczytuje kod książki i zapisuje w MEMO i do pliku.
Jeżeli będzie próba dodania tej samej książki - wywali wiadomość, że ten kod juz jest.

Ale teraz druga część. Koleś chce, żeby przypisac do numeru książki tytuł i autora którego np. wpisujemy w editach.
I żeby to działało w obie strony, czyli:

Sczytujemy kod za pierwszym razem, wpisujemy tytuł w jeden edit, autora w drugi i dajemy ZAPISZ.
Kiedy następnym razem sczytujemy kod z książki - w editach ( albo w innych ) pokazuje sie automatycznie autor i tytuł.

Jest szansa mi jakoś pomóc :( ?

Na razie działa mi moja pierwsza procedura czyli porównanie czy kod już jest czy nie:

 procedure TForm1.Button1Click(Sender: TObject);
begin
 Listbox1.items.loadfromfile('base.dat');
 if ListBox1.Items.IndexOf(Edit1.text) > -1 then
 showmessage('Ten kod kreskowy już istnieje w bazie ksiazek'); //wywala okno ze kod juz jest
 if ListBox1.Items.IndexOf(Edit1.text) > -1 then
   listbox1.items.delete(Listbox1.Items.IndexOf(Edit1.text));
 Listbox1.items.Add(Edit1.Text);
 Memo1.Lines.Add(Edit2.Text+' '+Edit3.Text+' '+Edit4.Text);
 Listbox1.items.savetofile('base.dat');
 Listbox1.items.savetofile('base_backup.dat');
 Edit1.Clear;
0

Jeżeli liczysz na gotowca to daj znać, przeniosę temat do opowiedniego dla takich próśb działu. A jeżeli chodzi o kod jaki podałeś. Bez sensu jest powtarzać dwa razy ten sam if. Lepiej zrobić to jednym bloku begin ... end. Natomiast pogoogluj sobie o plikach rekordowych / typowanych to znajdziesz wiele przykładów jak przechowywać wiele danych w jednym pliku i je wczytywać. Poza tym komponenty przechowujące TStrings jak TListBox potrafią również przechowywać obiekty. Można wtedy dodawać z pliku bazy do na przykład ListBoxa jakiś obiekt klasy TObject przez AddObject i obiekt taki poza numerem książki wyświetlanym na przykład nawet jako string (bo ESBN - o ile wiem - zawiera często też inne znaki niż cyfry arabskie) będzie zawierał inne ustalone dane jak autora, tytuł czy inne dodatkowe. Wtedy bez zbędnego przeszukiwania w pętli rekordów po prostu sobie wyświetlisz pozostałe dane powiązane z obiektem w jakiś kontrolkach, wedle uznania - mogą być edycyjne. Zrobisz to rzutując jakąś zmienna typu TTwojObiektZawierajacyDane na ListBoxZawierajacyDane.Items.Objects[ListBoxZawierajacyDane.Items.ItemIndex]. Zaś innym roziązaniem może być plikowa baza danych operta na przykład o SQLite. Jednak według mnie prościej zrobić plik typowany, do którego zapiszemy dodane obiekty, a także je odczytamy. Wtedy przez IndexOf, można szukać ESBN czy innego indentyfikatora ksiązki. W zasadzie to funkcja IndexOf jest i tak pętlą ignorującą wielkość znaków w wyszukiwanym ciągu. I na koniec szczerze rzdzę nie nazywać komponentów Edit1...Edit31337 i tym podobnych, bo się w tym pogubisz. Poza tym taki kod "zalatuje" jak dla mnie totalną amatorką i olewawczym stosunkiem do powieżonego zadania. Osobiście jeżeli bym takie coś dostał do oceny to ktoś miałby już przynajmniej ocenę niżej za takie "nazywanie" elementów kodu.

0

Szczerze to pół na pół. Pewnie ciężko tu o gotowca ale chociaż kawałek kodu odpowiadający za przyporządkowania danej linijki z memo do konkretnych editów... Pewnie kolejność bedzie ta sama.

0

Od prośb o gotowce bez własnego wkładu pracy lub bez oferty zapłaty ktorą powinno się umieścić w dziale Oferty Pracy, jest oczywiśćie bardzo poczytny dział Kosz. Natomiast co do pytania to nie bardzo rozumiem. Ja doradzam Tobie żebyś dane trzymał w pliku typowanym. Długośc stringów aby ich nie limitować można przechowywać jako dodatkowy rekord dla każdego wpisu z polami typu integer dla każdego pola. Następnie w pętli zapisywał je do pliku, a odczytywał najlepiej z pliku załadowanego do TMemoryStream zapisując oraz odczytując, dodając obiekty do jakiejś listy, która pozwala przechowywać obiekty, na przykład TListBox. Wsztstko na ten temat jest do wygooglowania. Artykuły z podstawami korzystania z plików typowanych można nawet znaleźć na 4p. Ty jednak chcesz coś tam modzić z Memo, więc nie wiem z czym problem NazwaEdita.Text := NazwaMemo.Lines[IndeksLinijkiLiczonyOdZera];, o to Ci chodzi? A i pytania o banalne podstawy zadajemy w dziale Newbie. A że, jak widzę, Twoje pytania póki co obejmują zakresem banalne podstawy, to tam ten wątek przenoszę.

0
adaxuss napisał(a):

Szczerze to pół na pół. Pewnie ciężko tu o gotowca ale chociaż kawałek kodu odpowiadający za przyporządkowania danej linijki z memo do konkretnych editów... Pewnie kolejność bedzie ta sama.

Skoro nie deklarujesz własnej pracy to idź do działu praca.

0

Chodzi o to ze mam pomysł, tylko trudno mi zrobic z tego poprawną składnie w kodzie.
Też moge napisac if memo1.add.lines of index = 0 to edit1.text:="adam mickiewicz" ale mi to nie dziala ;/
Chce to napisać, ale szukam pomocy kogoś kto wie co studia. Jestem na dziale elektrycznym, niewiem na CH... mi delphi... Jak nie tu to nigdzie indziej mi przeciez nie pomogą ?
A to chodzi dosłownie o jedną linijkę kodu i analogicznie robić tak rosnąco dla kolejnych.

1

if memo1.add.lines of index = 0 to edit1.text:="adam mickiewicz"

No bardzo ciekawie mieszasz konstrukcje...

na CH... mi delphi...

Możesz zawsze zmienić studia.

Jak nie tu to nigdzie indziej mi przeciez nie pomogą ?

Ja znam taką fajną stronę (www.google.pl) gdzie gdy okażesz wkład własny to na pewno pomoże.

A to chodzi dosłownie o jedną linijkę kodu i analogicznie robić tak rosnąco dla kolejnych.

Czy my wyglądamy na instytucję charytatywną? Wydaje mi się że temat kwalifikuje się do kasacji ze względu na wyłudzanie gotowca. Od tego jest dział praca gdzie ktoś za godziwe wynagrodzenie ci to zrobi.

0

gotowiec to dla mnie kod od a do z napisany przez inna osobe.
Ja nie potrzebuje kodu. tylko jasną wskazówkę taką np. jak ja dałem przykład. @olesio dał dobry przykład:
NazwaEdita.Text := NazwaMemo.Lines[IndeksLinijkiLiczonyOdZera];
ale to nie do końca jest logiczne, bo bedzie w edicie pokazywac slowo z memo :|

0

Załóżmy, że linijka w Memo zawiera trzy pola oddzielone unikalnymi separatorami (spacja nie jest dobrym wyborem, ja stosuję znak tabulacji #9)

var
  s,kod,tytul,autor:string;
  p:Integer;
//...
//dodajemy linijkę do Memo
  Memo1.Lines.Add(kod+#9+tytul+#9+autor);
//...
//Wyciągamy wybraną linijkę z Memo i rozdzielamy pola.
  s:=Memo1.Lines[i];
  p:=Pos(#9,s);
  kod:=Copy(s,1,p-1);
  Delete(s,1,p);
  p:=Pos(#9,s);
  tytul:=Copy(s,1,p-1);
  Delete(s,1,p);
  autor:=s;
0

A widzisz - i to już jest coś konkretnego :)
Dziękuje ! Szczerze to już miałem pomysł zrobić to na INI ale moze ten sposób zadziała u mnie.
Jutro sprawdze i dam znać !

0

@pelsta podał Ci rozwiązanie, ale nie zgodzę się z takim podejściem; Komponenty nie służą do przechowywania wszelkich danych, tylko do ich przedstawiania w formie graficznej, więc pakowanie całej biblioteki do kontrolki klasy TMemo jest absurdem (wybacz, ale biblioteka kojarzy mi się z setkami, jak nie tysiącami książek); Poza tym komponent ten nie jest najlepszym wyborem do przedstawiania listy książek - polecę skorzystać z kontrolek klasy TListBox czy TCheckListBox - przy okazji będziesz mógł dane przedstawić w ładniejszy sposób wykorzystując zdarzenie OnDrawItem; Można także skorzystać z kontrolki klasy TListView ze stylem vsReport, dzięki czemu podzielisz sobie informacje na trzy kolumny (według kodu książki, autora i tytułu); Także w tej kontrolce istnieje zdarzenie OnDrawItem (i bardziej zaawansowane zdarzenia służące do ręcznego rysowania itemów), więc także możesz przedstawić dane w ładniejszy sposób, niż operuje to motyw systemu; Możliwości jest wiele, jednak dane wolałbym trzymać np. w prywatnym polu - liście a w kontrolce jedynie je wyświetlać - pobranie informacji następowałoby z listy, a nie z zawartości właściwości kontrolki; Sądzę, że wykorzystując listę skróci się czas wyszukiwania danej książki niżeli miałoby się to odbywać na właściwości kontrolki;


Sam teraz piszę program, w którym istnieje pewna lista (kontrolka klasy TCheckListBox), w której przedstawiam informacje o danych wpisach dzieląc je na grupy względem dnia dodania; Wszelkie informacje o danych wpisach trzymam w liście klasy TObjectList z racji tej, że wpisów może być maksymalnie tysiąc i przy pełnej liście czas wyszukiwania jest o ponad 20% krótszy, niż operując na właściwości Items kontrolki; Podczas ładowania listy wpisów sprawdzam ile jest wszystkich wpisów i tyle dodaję pustych itemów do kontrolki, przez co nie marnuje się pamięć; Rysowanie itemów opiera się na pobraniu z listy daty i czasu i wyświetleniu ich w odpowiednich miejscach - lista z "załadowanymi" informacjami o wpisach wygląda tak:

NotesList.png

Do czego zmierzam - nie pakuj wszystkich informacji do kontrolki, tylko do osobnej listy, a w kontrolce tylko przedstaw te dane; Dzięki czemu przy większej ilości książek wyszukiwanie będzie szybsze, a same dane będzie można ładnie graficznie przedstawić na liście (wcale nie wysilając się bardzo);

0

Może lepiej poczytaj o plikach typowanych (i amorficznych przy okazji) a potem wybierz najlepsze rozwiązanie; Do takich rzeczy akurat najmniej nadają się pliku tekstowe;

Przy plikach typowanych jest taki problem że jest ograniczenie ilości znaków. Twoje stwierdzenie że pliki tekstowe się przydadzą najmniej jest moim zdaniem całkowicie błędne, gdyż nadają się one bardzo. Łatwo je czytać zarówno przy pomocy system.text jak i TStringList.LoadFromFile. Równie łatwo można je zapisywać. Rozwiązaniem alternatywnym jest np. INI albo XML który jednak wymaga dużo więcej pracy aby osiągnąć ten sam efekt końcowy.

@olesio dał dobry przykład:
NazwaEdita.Text := NazwaMemo.Lines[IndeksLinijkiLiczonyOdZera];

Czytaj: Olesio zrobił ci za kurs który powinieneś był przeczytać.

ale to nie do końca jest logiczne, bo bedzie w edicie pokazywac slowo z memo

Nielogiczny jest operator przypisania? Bardzo ciekawe rzeczy wypisujesz...

Pelsta napisał(a)

s:=Memo1.Lines[i];
p:=Pos(#9,s);
kod:=Copy(s,1,p-1);
Delete(s,1,p);
p:=Pos(#9,s);
tytul:=Copy(s,1,p-1);
Delete(s,1,p);
autor:=s;

Wydaje mi się, że to już któryś raz gdzie widzę bardzo podobną odpowiedź? Deja vu, czy po prostu pytacze zawsze pytają ok. 10 typów pytań które zawsze się powtarzają?
O gotowcach nie ma sensu żebym się powtarzał, bo szkodzisz wszystkim wokoło chociażby tym że przez ciebie osoba która coś powinna umieć nie umie tego. Ale o ile do niektórych to dociera to niektórzy są nieprzemakalni.

Dziękuje ! Szczerze to już miałem pomysł zrobić to na INI ale moze ten sposób zadziała u mnie.

Może zadziała... Nie no ale dlaczego miałby nie zadziałać...

A widzisz - i to już jest coś konkretnego

Dla ciebie to potrzeba coś gotowego, nie konkretnego. Można tobie powiedzieć jak coś zrobić (zobacz post olesia?), ale ty nie będziesz umiał tego zrobić, bo nie znasz nawet podstawowych konstrukcji programistycznych (to zdziwienie przy pobieraniu elementu tablicy albo instrukcji przypisania). Nie umiesz nic programować, szukasz czegoś co być może będzie działać, bez myślenia wklejasz to w kod i usiłujesz zrobić tak żeby kompilator to przepuścił.

Wściekły programista napisał(a)

Komponenty nie służą do przechowywania wszelkich danych, tylko do ich przedstawiania w formie graficznej, więc pakowanie całej biblioteki do kontrolki klasy TMemo jest absurdem

To zależy ile biblioteka ma pozycji. Na potrzeby działu newbie wszystko trzeba upraszać więc zamiast stosować TStringList, będzie TMemo (bo się samo zainicjalizuje) a zamiast zaawansowanych systemów bazodanowych - plik txt.

Możliwości jest wiele, jednak dane wolałbym trzymać np. w prywatnym polu - liście a w kontrolce jedynie je wyświetlać - pobranie informacji następowałoby z listy, a nie z zawartości właściwości kontrolki; Sądzę, że wykorzystując listę skróci się czas wyszukiwania danej książki niżeli miałoby się to odbywać na właściwości kontrolki;

Przecież kontrolka ma dokładnie to samo co zwykła lista stringów. Jedynie przy dodawaniu nowych wywoływane jest zdarzenie odmalowania.
I w ogóle to twoje tematy są zbyt zaawansowane jak na dział newbie.

Wszelkie informacje o danych wpisach trzymam w liście klasy TObjectList z racji tej, że wpisów może być maksymalnie tysiąc i przy pełnej liście czas wyszukiwania jest o ponad 20% krótszy, niż operując na właściwości Items kontrolki;

Ciekaw jestem z czego wynika ta zmiana.
W ogóle to jeżeli szukasz jeszcze lepszego pojemnika na dane, to użyłbym fgl.TFPGMap (FPC 2.6.0+ only).

Do czego zmierzam - nie pakuj wszystkich informacji do kontrolki, tylko do osobnej listy, a w kontrolce tylko przedstaw te dane; Dzięki czemu przy większej ilości książek wyszukiwanie będzie szybsze, a same dane będzie można ładnie graficznie przedstawić na liście (wcale nie wysilając się bardzo);

Masz całkowitą rację, tylko ty mówisz do osoby która niedawno odkryła jak się pobiera dane z tablicy.
BTW. Ciągle robisz tą kontrolkę? Ile można :P

(Ale mi tasiemiec wyszedł)

0

Chyba sobie nie poradzę ;/ Sposób kolegi nie działa tak jak powinien :(
Wie ktoś ile trzeba wydać na taki "skomplikowany" program ?

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