Wątek przeniesiony 2014-10-31 18:04 z Delphi i Pascal przez furious programming.

Co wybrać do programu - komponenty DB czy ogólne?

0

Witam.

Potrzebuję na swoje potrzeby napisać krótki program bazodanowy ( Jedna Baza , klika tablic). Bazę już mam teraz

tworze formę na której będę mógł odczytać wybrany rekord z bazy SQLLite i edytować.

Czy lepiej użyć Komponentów DB czy Ogólnych? Co będzie łatwiejsze do obsługi i edycji?
Dlaczego pytam. Bo przy DBGrid przy polach Text wywala (MEMO) , coś już szukałem i kombinowałem ale problem został.

Rozumiem, że sql można stosować niezależnie od elementów na których będę Wyświetlał/ Edytował dane?

1

Prostą bazę, jeżeli nie potrzebujesz zapytań i wiesz jakie pola będzie posiadać do zapisu oraz odczytu, można zrobć w pliku własnego formatu. Przykład w załączniku.

Natomiast z SQLem bawiłem się krótko tylko pod SQLite i do wyświetlania danych użyte zostały również standardowe kontrolki, czyli nie te z DB w nazwie. A więcej na temat tych drugich podpowiedzą pewnie inni użytkownicy tego forum, bo mi brak doświadczenia.

Czasem jednak warto ogarnąc temat po swojemu, bo nie potrzeba od razu armaty do zabicia muchy.

0
olesio napisał(a):

Czasem jednak warto ogarnąc temat po swojemu, bo nie potrzeba od razu armaty do zabicia muchy.

I tak samo nie warto wymyślać koła na nowo.
Jeśli ktoś chce oprogramować bazę danych, to nie powinien używać drutu w sensie ręcznego bindowania kontrolek z bazą danych, bo czas który poświęci na wymyślanie koła można przeznaczyć na znacznie ciekawsze rzeczy.
Np. na naukę programowania baz danych, albo na cokolwiek innego.

A co wyświetlania Memo w dbGrid; faktycznie, programowanie bez umiejętności wyszukiwania informacji to męka.
Proszę, tu znajdziesz gotowca:
http://bit.ly/1zOgT55

0

Przecież pisze, że szukałem , ale nie działa/ nie mogę wszystkiego zrozumieć.

Jak przerzucam dane do StringGrid z DBGrid to po sprawdzeniu czy pole ma wartość Null albo przerzucam TEXT albo VALUE pola i widzę wszystkie dane.

Dlatego moje pytanie : Lepiej użyć Komponentów DB czy Ogólnych.

W linku jest pomoc do Delphi a ja używam Lazarusa i nie mam ( może mam, ale nie widzę ) zdarzenia onGetText. Artykuł ten znalazłem wcześniej.

Pole Memo mam dodać do SQLQuery czy gdzie?

Dziękuje moderatorowi za rady :D

A gdybym wiedział jak to zrobić i był tak wprawny jak "niektóry" to bym chyba nie prosił tutaj o pomoc ?! Przypuszczam, że większość miała podobne początki , a widzę, że niektórzy strasznie lubią stwierdzenie " Wymyślanie koła na nowo ". Jak nie chcesz pomóc a masz pisać takie bzdety to nie pisz nic. I wiem co to Google - naprawde :D tylko jak się czegoś uczysz to fajnie jak ktoś ci wytłumaczy ( dlatego np. są w szkole nauczyciele , a niektórzy widzę uważają, że wystarczyły by tylko książki i najlepiej w obcym języku - Książki też czytam).

0

(Pracuję na Lazarus)

Ok znalazłem 'onGetText' w 'SQLQuery' ale tylko gdy kliknę "Create new Field and add it to current position" .

Jak dobrze rozumiem zamieni mi ono aktualnie odczytane pole na to nowo stworzone , czy tylko wartość pola?

A jeśli chcę edytować wartość pola 'MEMO' w 'DBGrid', to zapisze mi edytowaną wartość pola jako typ 'Memo' ( czyli Text ? ) czy 'string'?

Przy tworzeniu nowego pola w 'SQLQuery' wybrać typ pola 'MEMO' czy 'String' ?

I jak obsłużyć zdarzenie 'onGetText'?

Jakiś przykładowy kod do obsługi zdarzenia? byłbym wdzięczny.

Wiem że może pytania głupie , ale naprawdę staram się temat ogarnąć i im więcej czytam tym głupszy jestem. Niektórzy przez 'Canvas' takie pola obsługują , inni tworzą własne procedury 'onGetText' :( .

0
GoYo26 napisał(a):

Przecież pisze, że szukałem , ale nie działa/ nie mogę wszystkiego zrozumieć.

Jak przerzucam dane do StringGrid z DBGrid to po sprawdzeniu czy pole ma wartość Null albo przerzucam TEXT albo VALUE pola i widzę wszystkie dane.

No i po co tak, a nie samo Field.Text lub Field.DisplayText?
Pokaż kod który przerzuca dane z DBGrid do StringGrid - strasznie mnie to ciekawi... Zwłaszcza, że DBGrid nie posiada żadnych danych, a przechowuje tylko tyle, ile widać na ekranie - a więc jak Ci się to udało osiągnąć?

Dlatego moje pytanie : Lepiej użyć Komponentów DB czy Ogólnych.
W linku jest pomoc do Delphi a ja używam Lazarusa i nie mam ( może mam, ale nie widzę ) zdarzenia onGetText.

A gdzie szukasz tego zdarzenia?
Poszukam za Ciebie (w życiu nie odpaliłem Lazarusa, a więc.. muszę poszukać).

A to to co niby jest?
http://lazarus-ccr.sourceforge.net/docs/fcl/db/tfield.ongettext.html
To jest zdarzenie dla POLA. A pola są zarządzane przez DataSet, samo SQLQuery dziedziczy z DataSet, a więc posiada kolekcję pól (Fields).
Identycznie jest w Delphi - a więc, tak twierdzę, że:

  1. Bzdety wypisujesz.
  2. Nie przeczytałeś ze zrozumieniem tego co napisano w artykule.

Artykuł ten znalazłem wcześniej.

To jeszcze go przeczytaj - ze zrozumieniem.

Pole Memo mam dodać do SQLQuery czy gdzie?

Facet, Ty nie masz pojęcia o czym piszesz...

Dziękuje moderatorowi za rady :D

A gdybym wiedział jak to zrobić i był tak wprawny jak "niektóry" to bym chyba nie prosił tutaj o pomoc?!

Nie ciskaj się, bo dostałeś konkretną odpowiedź.
Ale nie zrozumiałeś z tego za wiele (gorzej - próbujesz naginać rzeczywistość do Twoich wyobrażeń), no ale to już Twój problem...

Przypuszczam, że większość miała podobne początki , a widzę, że niektórzy strasznie lubią stwierdzenie " Wymyślanie koła na nowo ". Jak nie chcesz pomóc a masz pisać takie bzdety to nie pisz nic.

Bzdety kolego to Ty wypisujesz na potęgę. Aż się kurzy.
Parafrazując twoje "bzdety" - jak nie potrafisz zrozumieć odpowiedzi to nie czytaj, a tym bardziej - nie odpowiadaj.

I wiem co to Google - naprawde :D

Nie sądzę.

tylko jak się czegoś uczysz to fajnie jak ktoś ci wytłumaczy ( dlatego np. są w szkole nauczyciele , a niektórzy widzę uważają, że wystarczyły by tylko książki i najlepiej w obcym języku - Książki też czytam).

Jak Ty tak czytasz ze zrozumieniem jak pytasz, to... szkoda gadać.
Jeszcze nie spotkałem nauczyciela, który nauczyłby kogokolwiek dobrze programować. Więcej - większość z tych, których poznałem ma blade pojęcie o programowaniu, ale to moja prywatna opinia.

A teraz krótka konkretna odpowiedź na Twoje błazenady:

  1. Nigdzie nie masz dodawać żadnego pola.
  2. Zakładam, że poprawnie wszystko skonfigurowałeś i program działa (powiedzmy)
  3. A więc dodaj z łaski swojej taki kod w zdarzeniu AfterOpen swojego SQLQuery
begin
  if DisplayText then
    aText := Sender.AsString;
end;

Trudne?

0

Niestety

procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
begin
   if DisplayText then
    aText := Sender.AsString;
end;                      

nie działa : błąd

unit1.pas(68,19) Error: Identifier not found "DisplayText"

A się nie ciskam tylko podzielenie się wiedzą jak by ciebie bolało. Nie mówię, że się nie znasz - tylko zachowujesz się trochę jak stare urzędniczki.

Tak - nie bardzo wiem o czym pisze bo robię to pierwszy raz - coś czytałem ale nie wychodzi tak jak tam gdzie czytałem, ale to chyba nie jest wstyd czegoś nie wiedzieć albo nie zrozumieć.

Już czekam na ocenę 'procedury' :D

procedure TForm1.Button3Click(Sender: TObject);

var
  i:integer;
  RowsCount:integer;

begin

 RowsCount:=0;

 StringGrid1.ColCount:=DBGrid1.Columns.Count;
 StringGrid1.RowCount:=DBGrid1.DataSource.DataSet.RecordCount+1;

 for i:=0 to DBGrid1.Columns.Count-1 do
      begin
        StringGrid1.Cells[i,RowsCount]:=DBGrid1.Columns.Items[i].FieldName;
      end;

 i:=0;

 for RowsCount:=0 to DBGrid1.DataSource.DataSet.RecordCount-1 do
   begin
     for i:=0 to DBGrid1.Columns.Count-1 do
       begin

         if   (DBGrid1.DataSource.DataSet.Fields.Fields[i].Text='(MEMO)')
         or  (DBGrid1.DataSource.DataSet.Fields.Fields[i].Text='(memo)')
           then

             begin
               if  DBGrid1.DataSource.DataSet.Fields.Fields[i].Value = null
                 then  StringGrid1.Cells[i,RowsCount+1]:=''
                 else  StringGrid1.Cells[i,RowsCount+1]:=DBGrid1.DataSource.DataSet.Fields.Fields[i].Value
             end

           else
            StringGrid1.Cells[i,RowsCount+1]:=DBGrid1.DataSource.DataSet.Fields.Fields[i].text;

       end;
     DBGrid1.DataSource.DataSet.Next;
   end;

end;                                        
0

Dobra. Może inaczej kto poleci dobrą - dla początkujący - książkę na temat baz danych w pascalu. Większość jest pisana takim językiem ze nic z tego nie da się zrozumiec . Nie lubię czytać na pc jakoś wole książki wydają się bardziej przejrzyste. A może ktoś ma i nie używa to odkupie.

0

Nie ma prawa działać, moja wina. Nie ma pojęcia co się stało, ale zrobiłem tak potężny skrót myślowy, że... szkoda gadać.

Tak powinno być:

Najpierw dodaj sobie metodę obsługi do zdarzenia OnGetText - gdzieś do jakiejś klasy, np. do formy gdzie jest ten grid.

  TForm1 = class(TForm)
  protected
    procedure OnGetTextForMemo(Sender: TField; var aText: string; DisplayText: Boolean);
  end;

implementation

procedure TForm1.OnGetTextForMemo(Sender: TField; var aText: string; DisplayText: Boolean);
begin
  if DisplayText then
    aText := Sender.AsString;
end;

A potem w AfterOpen dla SQLQuery dodaj to:

procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
begin
   Sender.FieldByName('Nazwa pola memo').OnGetText := OnGetTextForMemo;
end;    
0
GoYo26 napisał(a):

Niestety

procedure TForm1.SQLQuery1AfterOpen(DataSet: TDataSet);
begin
   if DisplayText then
    aText := Sender.AsString;
end;                      

nie działa : błąd

unit1.pas(68,19) Error: Identifier not found "DisplayText"

A się nie ciskam tylko podzielenie się wiedzą jak by ciebie bolało. Nie mówię, że się nie znasz - tylko zachowujesz się trochę jak stare urzędniczki.

Tak - nie bardzo wiem o czym pisze bo robię to pierwszy raz - coś czytałem ale nie wychodzi tak jak tam gdzie czytałem, ale to chyba nie jest wstyd czegoś nie wiedzieć albo nie zrozumieć.

Już czekam na ocenę 'procedury' :D

Powinno być mniej więcej tak:

procedure TForm1.FillStringGrid(AStringGrid : TStringGrid; ASourceDBGrid : TDBGrid);
var
  i        : Integer;
  lDataSet : TDataSet;
begin
  AStringGrid.ColCount := ASourceDBGrid.Columns.Count;
  AStringGrid.RowCount := 1;

  for i := 0 to ASourceDBGrid.Columns.Count - 1 do
    AStringGrid.Cells[i, RowsCount] := ASourceDBGrid.Columns.Items[i].Field.DisplayLabel;

  lDataSet := ASourceDBGrid.DataSource.DataSet;
  lDataSet.DisableControls;
  try
    lDataSet.First;
    while not lDataSet.Eof do
    begin
      for i := 0 to ASourceDBGrid.Columns.Count - 1 do
      begin
         AStringGrid.RowCount := AStringGrid.RowCount + 1;
         AStringGrid.Cells[i, AStringGrid.RowCount - 1] := ASourceDBGrid.DataSource.DataSet.Fields.Fields[i].DisplayText;
      end;
      lDataSet.Next;
    end;
  finally
    lDataSet.EnableControls;
  end;
end;

Jak znajdziesz różnice (poza dwukrotnie mniejszą ilością kodu), to odpowiem Ci na pytanie dlaczego tak.
Ale mój kod mi się nie podoba, bo nie wiem czy mam przepisać wszystkie kolumny (właściwie - to wszystkie dane, a nie tylko kolumny) czy tylko widoczne?

0

Jestem teraz trochę zajęty jak będę w domu ( ok 20) to dokładnie przejrze ale widzę ze nie sprawdzasz wartości pola i dodajesz wiersze do 'StringGrid' w trakcie odczytu ( jak jest to poprawne wyrażenie). A ogólnie mniej kodu = lepiej .
Widzisz jak chcesz to potrafisz :D .
Jak źle myślę popraw.

0

Czemu w kodzie wlochacza, w zmiennych jest deklaracja Dataseta, a potem i tak interuje po DBgrid.datasource.dataset...
Czy to przeoczenie czy jakoś przepisanie dataseta ma czemus sluzyc?

0
GoYo26 napisał(a):

Jestem teraz trochę zajęty jak będę w domu ( ok 20) to dokładnie przejrze ale widzę ze nie sprawdzasz wartości pola i dodajesz wiersze do 'StringGrid' w trakcie odczytu ( jak jest to poprawne wyrażenie).

Bo nie trzeba tu niczego sprawdzać - Field.DisplayText zwróci dokładnie taki tekst, który jest wyświetlany jest w kontrolce - łącznie z formatowaniem dla pól o typach numerycznych.
Czytaj manuala, nie będę Ci wszystkiego tłumaczyć jak sześciolatkowi.

A ogólnie mniej kodu = lepiej .
Widzisz jak chcesz to potrafisz :D .

Nie przeginaj.

Jak źle myślę popraw.

Tych zmian jest więcej...

0
lopki23 napisał(a):

Czemu w kodzie wlochacza, w zmiennych jest deklaracja Dataseta, a potem i tak interuje po DBgrid.datasource.dataset...
Czy to przeoczenie czy jakoś przepisanie dataseta ma czemus sluzyc?

Oho, następny z wadą wzroku ;-)
Iteruję po lDataSet (wiersze), a potem iteruję po kolumnach dbgrida.
Dlaczego tak?
Bo chodziło o wczytanie danych z "DBGrida", a DBGrid może mieć pewne kolumny ukryte i w innej kolejności niż pola w DataSet.
Mi się to też nie podoba, ale nie chciało mi się robić tego inaczej - to i tak jest o niebo lepiej napisane niże poprzedni ;-)

0

Chyba pytanie powinno się znaleźć w 'newbee'.

Pisze program jako hobby, wiem że mogę kupić taki program jaki potrzebuje ,ale chcę go napisać samemu i mieć z tego radość. Wiem, że bylo by i taniej i szybciej ale nie to jest moim celem.

W szkole ( podstawowej )pisałem ostatnio jakieś 20 lat temu na TPascalu :/. A później nie miałem czasu na te sprawy. Teraz trochę się zmieniła sytuacja i dlatego proszę o porady i dziękuję za to co do tej pory się dowiedzialem. Myślę ,że za pół roku moje programy będą dużo lepsze.

0
GoYo26 napisał(a):

Dobra. Może inaczej kto poleci dobrą - dla początkujący - książkę na temat baz danych w pascalu. Większość jest pisana takim językiem ze nic z tego nie da się zrozumiec . Nie lubię czytać na pc jakoś wole książki wydają się bardziej przejrzyste. A może ktoś ma i nie używa to odkupie.

Nie znam takiej. A to co jest dostępne po polsku to, sorry, chłam.
Bardzo dobrą książką była "Bazy danych w architekturze klient serwer w Delphi 3" Kena Hendersona. I oczywiście, ta książka ma 15 lat (albo i więcej) i opiera się na BDE, ale do dziś jest całkiem aktualna. To ponad 1000 stron, czyli cegła ;-)
Powinienem gdzieś ją jeszcze mieć...

0

Czy lepiej zdobyć Książke A.Boduch "Kompedium Programisty Delphi 7" czy "2005 " ? Czytałem, że bardzo ciekawa pozycja.

Przypominam ,że chodzi o bazy danych 'SQLLite' i 'Lazarus'.

Rozdział 17

Tam użyte są zwykłe komponenty i ładnie wygląda...

Ciągle nie otrzymałem konkretnej odpowiedzi czy "łatwiej, lepiej i sprawniej" pracować z komponentami DB czy ogólnymi?

Pan Wlochaty ( jak dobrze nick pamiętam) zachęca do DB

0

Ciągle nie otrzymałem konkretnej odpowiedzi czy "łatwiej, lepiej i sprawniej" pracować z komponentami DB czy ogólnymi?

Odpowiedź jest prosta - po to zostały stworzone dedykowane komponenty, aby było "łatwiej, lepiej i sprawniej" :]

0
GoYo26 napisał(a):

Czy lepiej zdobyć Książke A.Boduch "Kompedium Programisty Delphi 7" czy "2005 " ? Czytałem, że bardzo ciekawa pozycja.

Ogólna idea programowania jest dokładnie taka sama w Delphi i w FPC/Lazarus, a różnice są w szczegółach.
Do FPC/Lazarus użyj ZEOS'a, który ostatnio ładnie się rozwija.

Przypominam ,że chodzi o bazy danych 'SQLLite' i 'Lazarus'.
Rozdział 17
Tam użyte są zwykłe komponenty i ładnie wygląda...

Tak uważasz?
Twoje prawo, ja mam dokładnie odwrotne zdanie na ten temat; przeczytaj to: http://4programmers.net/Forum/1077021

Ciągle nie otrzymałem konkretnej odpowiedzi czy "łatwiej, lepiej i sprawniej" pracować z komponentami DB czy ogólnymi?
Pan Wlochaty ( jak dobrze nick pamiętam) zachęca do DB

Łatwiej, szybciej i sprawniej działają kontrolki dbAware (TDBText, TDBGrid, itd.).
Jest tylko jedno małe ale - trzeba się nauczyć ich obsługi i stosowanej tam konwencji.

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