Darmowa i prosta biblioteka do SQLite

Darmowa i prosta biblioteka do SQLite
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:496
0

Hey,
Witam wszystkich w nowym, pięknym tygodniu :P

Chciałbym podszkolić swoje umiejętności operowania danymi z bazy danych. Najlepsza dla moich celów jest SQLite (ponieważ nie będę używał zaawansowanej składni SQL - najprostsze zapytania). Używałem kiedyś tego rozwiązania (https://www.yunqa.de/delphi/products/sqlite3/index) - podstawową funkcjonalność (niestety, widzę że wersja Personal nie obsługuje 64-bit).

Z pewnością ktoś z Was używa na co dzień SQLite.
Proszę o wskazówki i porady:

  1. Implementacja SQLite w Delphi, w sensie dostęp do funkcji i procedur które umożliwiają operacje na danych (odczyt, zapis, etc) + biblioteki SQLite (najlepiej najnowsze) zgodne z implementacją
  2. Darmowe i proste w obsłudze
  3. Wsparcie dla 64-bit (a jeśli nie, to czy operowanie na bazie 32-bitowej (i dll) w 64 bitowym programie jest problemem?)

Dlaczego o to pytam... świat idzie do przodu, wszystko się zmienia. To co kiedyś używałem (w jednym programie zresztą) jest już przestarzałe. A potrzebne jest rozwiązanie, pewne, proste szybkie i darmowe!

Dzięki,
-Pawel


edytowany 6x, ostatnio: Riddle
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 12 godzin
  • Postów:2101
1

W pakiecie masz FireDAC (kiedyś to się nazywało AnyDAC )
Albo ZEOS którego trzeba ściągnąć i zainstalować


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
edytowany 1x, ostatnio: Marius.Maximus
Pepe
Ale chodzi o to, żeby można było przenieść bibliotekę z programem, bez instalacji silnika bazy danych - coś takiego umożliwia SQLite (mogę pisać głupoty - nie używałem nigdy na poważnie baz danych, jedynie w kilku projektach).
Pepe
OK, już wiem - FireDAC wspiera SQLite - ale czy można program używać bez instalacji jakiś specjalnych bibliotek (oprócz sqlite)/
Marius.Maximus
W ZEOS była opcja uzycia statycznej biblioteki sqlite , wiec nawet sqlite.dll nie był potrzebny , czy to mozna zrobic w FireDAC to nie pamietam
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
1
Pepe napisał(a):

Chciałbym podszkolić swoje umiejętności operowania danymi z bazy danych. Najlepsza dla moich celów jest SQLite

Jest to najgorsza baza do uczenia się jako reprezentant SQL
Niemal nic nie jest tak zgodne z mainstreamem, od typów pól poczynając, przez constraitsy, spsobó pracy jako taki i w ogóle


Bo C to najlepszy język, każdy uczeń ci to powie
Pepe
Być może - ale ja nie potrzebuję się uczyć zaawansowanej składni SQL - zresztą teoretycznie ją znam, bo byłem na kursie :P, ale to stare dzieje. Mój projekt potrzebuje utworzyć tabele z kilkoma kolumnami, zapisać tam dane (tysiące - zaledwie - wierszy) i je odczytać w programie.
AK
JAk wielu kolegów spragnionych fuch bazodanowych popadłeś w sprzeczność własnych deklaracji "chcę sie uczyć" / "jednak nie chcę się uczyć (czego uniwersalnego), szybkosc fuchy jedynie"
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:496
0

@Marius.Maximus:
Zaciekawiłeś mnie tym FireDAC. Czy masz pod ręką jakieś dobre przykłady jak tego używać? Takie dla laika... widze w helpie Delphi fragmenty, ale sprzydałoby się jakieś demo zapisu, odczytu danych, sposób tworzenia tabel, usuwania danych - podstawy.


WL
Weź sobie demo odpal...
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 12 godzin
  • Postów:2101
0

@AnyKtokolwiek: ta baza jest idealna do nauki podstaw, bo jak ktoś zechce zaczynać od Oracle to utknie na instalatorze :D ,


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
S4
No ale PG czy SQL.servera można mieć na dokerze jednym kliknięciem a one już są bliżej mainstreamu. Polecam obydwie bo to chyba najpopularniejsze rozwiązania teraz.
AK
@S4t: +1 dokladnie tak. Z już nieco odchodzących to Interbase / Firebird jest prosty w instalacji
AK
@Marius.Maximus: mam nadzieję, że masz na tyle wglądu w siebie, że Oracle użyłeś jako dowcip / świadome przerysowanie ?
Marius.Maximus
@AnyKtokolwiek rzeczywiście trochę przesadziłem, to taki żart z którego tylko jak się śmieje. To było podejście do SQL na studiach, ale to było tak dawno że SqLite mogło być jeszcze w zakresie koncepcji ;) I może to nie był Oracle tylko Informix (jeszcze większy zabytek)
woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 15 godzin
  • Postów:1598
2

W najprostszej konfiguracji kładziesz na formę TFDConnection -> Ustawiasz mu (dblclick) parametry do Twojego SQLite. Tam masz opcję test connection i w property connection dajesz na TRUE. Następnie dajesz TFDQuery wpisujesz w nim select do tabeli i w connection podpinasz swojego TFDConnection. Następnie dajesz TDataSource podpisznasz w object inspectorze TFDQuery. Rzucasz na formatkę TDBGrid i podpiszasz w object inspector TDataSource. Ustawiasz TFDQuery.Activate = True i sru powinny się na gridzie pojawić.

To jest absolutny początek ale prościej się tego nie da opisać :)

Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 12 godzin
  • Postów:2101
0

@AnyKtokolwiek: a gdzie zniknął Twój post z propozycja aby uczyć Docker-a ?


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
AK
Nie wiem o czym mówisz ... o tym wątku ???
Marius.Maximus
Przepraszam, to jednak inny użytkownik był @S4t
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:496
0

Panowie, żadne mi dockery w głowie, ani inne skomplikowane, profesjonalne funkcjonalności.
Nie, jest to żadna fucha, a prywatny projekt - bez żadnego potencjału zarobkowego.

Nie chcę się bawić w jakieś komponenty. W DISQlite (który zalinkowałem) było to rozwiązane bardzo prosto - i być może wrócę do tego rozwiązania (ale myślę, że na rynku może pojawiły się inne rozwiązania). To znaczy, odwołuję się tylko do wrappera, i używam gotowych metod - utwórz bazę, otwórz bazę, dodaj kolumnę, usuń wiersz n, etc... Żadnych cudów.

Przykład z mojego starego kodu (pseudo-kod):

Kopiuj
procedure Open_Database;
var
   s8 : UTF8String;
begin
   s8 := Sqlite3_Encode_UTF8(Database_Name);
   Sqlite3_Check(Sqlite3_Open(PUtf8Char(s8), @MOJA_DB), MOJA_DB);
end;

procedure Close_Database;
begin
   Sqlite3_Check(Sqlite3_Close(MOJA_DB), MOJA_DB);
end;

procedure Create_Table;
begin
   try
      Open_Database;
      Sqlite3_Exec_Fast(MOJA_DB, 'CREATE TABLE IF NOT EXISTS IndexT (ID INTEGER PRIMARY KEY, IndexV TEXT);');
	finally
		Close_Database;
	end;
end;

//Odczyt jakiejś wartości
      try
         sqlite3_check(sqlite3_exec(MOJA_DB,
         'SELECT IndexV FROM IndexT;',
         LoadIndex_Callback,
         nil, nil),
         MOJA_DB);
      except
    end;

O takie mniej więcej mi chodzi, bez cudowania :)
-Pawel


woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 15 godzin
  • Postów:1598
1

Masz tu sampla z Embarcadero:SQLite.zip

MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:2 dni
  • Postów:1083
1
woolfik napisał(a):

To jest absolutny początek ale prościej się tego nie da opisać :)

Ale również przepis na to jak NIE pisać programów korzystających z baz danych :)
Jak tak zacznie pisać, to skończy z kodem spaghetti gdzie nie będzie żadnego rozdzielenia pomiędzy logiką, a GUI, a całość będzie zakodowana w zdarzeniach OnClick co tylko spowoduje, że wyrośnie nam kolejny "klikacz Delphi" ;)

Jednak żeby nie było, to można w ten sposób napisać program dający sensowne rozdzielenie GUI od logiki. Jednak nie kładąc komponenty bazodanowe na formatkach.

Co do samego problemu, to warto zainteresować się wyżej wspomnianym Firebird. Ma on wersję embedded która to jest pełnoprawnym serwerem zamkniętym w kilku plikach. Będzie o wiele lepszym wyborem niż SQLite.

woolfik
  • Rejestracja:ponad 17 lat
  • Ostatnio:około 15 godzin
  • Postów:1598
2
Mr.YaHooo napisał(a):
woolfik napisał(a):

To jest absolutny początek ale prościej się tego nie da opisać :)

Ale również przepis na to jak NIE pisać programów korzystających z baz danych :)
Jak tak zacznie pisać, to skończy z kodem spaghetti gdzie nie będzie żadnego rozdzielenia pomiędzy logiką, a GUI, a całość będzie zakodowana w zdarzeniach OnClick co tylko spowoduje, że wyrośnie nam kolejny "klikacz Delphi" ;)

Początki zawsze są trudne ale pokazanie komuś podstaw nie definiuje, że sam się nie rozwinie lub rozwinie się w złym kierunku. Ja zaczynałem od takiego prostego okienkowego GUI pod DB w delphi, a teraz jestem programistą PL/SQL

Jednak żeby nie było, to można w ten sposób napisać program dający sensowne rozdzielenie GUI od logiki. Jednak nie kładąc komponenty bazodanowe na formatkach.

Nie ma kompletnie znaczenia czy rzucisz komponent TFDConnection na klasę bazową TMainForm/TForm dla całej aplikacji czy dorzucisz ją do TDataModule czy też utworzysz ją dynamicznie w runtime (i pozostałe obiekty TFD* też). Fakt trzeba pamiętać o pewnych niuansach ale technicznie nie ma to większego znaczenia. Mówisz natomiast o enakpsulacji i hermetyzacji pewnych ogólnych metodyk programowania, które na moment uczenia mogą spowodować niechęć do programowania w ogóle ... Ja osobiście też nie lubię trzymać logiki tam gdzie GUI tu masz rację natomiast jakby to co wiem teraz po n lat pracy i doświadczenia spadło na mnie na początku to bym został stolarzem bo bym tego nie ogarnął.

Co do samego problemu, to warto zainteresować się wyżej wspomnianym Firebird. Ma on wersję embedded która to jest pełnoprawnym serwerem zamkniętym w kilku plikach. Będzie o wiele lepszym wyborem niż SQLite.

@Pepe: napisał jasno: ponieważ nie będę używał zaawansowanej składni SQL - najprostsze zapytania to myślę, że SQLite mu w zupełności wystarczy

Pamiętaj tylko @Pepe, że SQLite to plik i jako typowy plik nie ma multidostępu czyli jeśli będziesz chciał do tej "bazy" podłączyć się z kilku komputerów to SQLite nie ma takiej funkcjonalności (* tak wiem czytałem, że da się to obejść ale to już jest zupełnie inny temat) i w takiej sytuacji lepiej faktycznie skorzystać z Firebird, o którym pisał @Mr.YaHooo (w firedac zrobisz to dokładnie tak samo)

robertz68
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Zielona Góra
1

tak szczerze, to w aplikacjach w których muszę zapamiętać w bazie np. konfigurację lub naprawdę nie dużo danych (czasami nawet trochę więcej) używam często baz ms access. Wrzucam plik bazy do folderu programu i nic więcej nie trzeba robić. Składnia troszkę się różni (zaawansowana) ale jednak da się tego używać.
Poza tym łatwo mi się taką bazę modeluje w dostępnych narzędziach i Windows obsługuję ją natywnie - żadnych ekstra bibliotek.
Inne dobre rozwiązanie to oczywiście MS SQL Server Express i aż ciężko żeby po jakimś czasie używania komputera w sposób trochę inny niż granie w końcu nie trafił na dysk. Tutaj mamy już wszystko, szczególnie gdy doinstalujemy SSMS.
Ale gdyby jednak okazało się że nie ma SQL Serwera na dysku i nie trafi on tam celowo bo to jednak działo na muchę to zawsze można skorzystać z Microsoft SQL Server Compact Edition. Chyba nawet teraz jest on natywnie na dysku.
Jest z tym chyba tylko taki mały problem że w darmowej wersji Delphi nie ma obsługi bazy MS SQL - no ale zawsze zostaje access :).

woolfik
Jak ktoś wspomniał wcześniej jest też darmowy ZeosLIB
G8
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2000
0
Mr.YaHooo napisał(a):
woolfik napisał(a):

To jest absolutny początek ale prościej się tego nie da opisać :)

Ale również przepis na to jak NIE pisać programów korzystających z baz danych :)
Jak tak zacznie pisać, to skończy z kodem spaghetti gdzie nie będzie żadnego rozdzielenia pomiędzy logiką, a GUI, a całość będzie zakodowana w zdarzeniach OnClick co tylko spowoduje, że wyrośnie nam kolejny "klikacz Delphi" ;)

Jednak żeby nie było, to można w ten sposób napisać program dający sensowne rozdzielenie GUI od logiki. Jednak nie kładąc komponenty bazodanowe na formatkach.

To po co te komponenty bazodanowe są w Delphi? Po to żeby ich nie używać i nie kłaść na formatkach?

LA
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 14 godzin
  • Postów:471
3

jak ktos chce wyklikac jakies demo w 15 min to moze klikac komponenty - do wszystkiego innego odradzam.

Problem jest taki, że młodych programistow Delphi już nie ma wg mnie, a starzy maja juz swoje wyrobione nawyki, czesto złe i nie ma sensu dyskutować czy onClick czy nie, bo nie dotrze.

do tematu, to sqlite moze i byc, firebird też.

edytowany 4x, ostatnio: lampasss
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:496
0

:)
Wbrew tematowi czy typie pytania, nie jest początkującym programistą (jestem amatorem i hobbystą). Ale, zauważcie, że jestem na forum już ponad 20lat... chyba więcej, niż niektórzy z was w zawodzie... i niektóre wpisy mnie nieco ubawiły, choć przyznaję temat raczej dla początkujących... Poruszony problem jest prosty, a zaczynają się porady jak pisać w Delphi, jak jest dobrze, a jak te przebrzydłe dinozaury robią... Amatorski program ma działać, dobrze i niezawodnie - w mojej opinii, to czy "wyklikam" interesujący mnie kod, czy użyję komponentów kładzionych na formę z odpowiednimi powiązaniami, czy też napiszę wszystko "z palca" ma znaczenie drugorzędne - ja tutaj Windows nie pisze :P

Najważniejszy jest wynik - program ma robić to do czego został stworzony i działać w miarę niezawodnie. Podsumowując tę dyskusję, za którą Wam dziękuję - wybiorę chyba implementację DISQLite3, bo tę znam, a nie potrzebuję niczego zaawansowanego. Pakiet Zeos też jest dobrym wyborem (bawiłem się tym kiedyś z MySQL).
Jeszcze tylko napiszę do czego naprawdę to potrzebuję...
Otóż mam wiele plików, w formacie INI (na to teoretycznie nie mam wpływu). Ale każdy z nich może mieć "bardzo" (to subiektywne) dużo sekcji z danymi (np 100 plików, a każdy ma po 10tysięcy wpisów). Program który piszę, ma za zadanie wyświetlić te dane w odpowiedniej formie (coś a'la statystyka). Ale pliki INI nie są dobrym rozwiązaniem dla tak wielu danych. Dlatego mam zamiar wszystkie te pliki scalić w plik bazy danych (utworzyć bazę z jedną tabelą z kolumnami z danymi w odpowiednim formacie) i na niej właśnie operować (tylko odczyt). Dostęp tylko lokalny. Jak widzicie, wiele nie trzeba - wymyśliłem, że taki SQLite będzie akurat.


MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:2 dni
  • Postów:1083
0
woolfik napisał(a):

Początki zawsze są trudne ale pokazanie komuś podstaw nie definiuje, że sam się nie rozwinie lub rozwinie się w złym kierunku. Ja zaczynałem od takiego prostego okienkowego GUI pod DB w delphi, a teraz jestem programistą PL/SQL

Oczywiście, ale od razu najlepiej uczyć się dobrych nawyków i eliminować te złe :) Bo czasami bardzo trudno jest wyeliminować złe naleciałości.

woolfik napisał(a):

Nie ma kompletnie znaczenia czy rzucisz komponent TFDConnection na klasę bazową TMainForm/TForm dla całej aplikacji czy dorzucisz ją do TDataModule czy też utworzysz ją dynamicznie w runtime (i pozostałe obiekty TFD* też).

Jak dla mnie wrzucanie komponentów bazodanowych czy połączenia jest niezbyt dobrą praktyką. Odziedziczyłem coś takiego w pracy i lepiej nie mówić jak to jest napisane ;)

woolfik napisał(a):

@Pepe: napisał jasno: ponieważ nie będę używał zaawansowanej składni SQL - najprostsze zapytania to myślę, że SQLite mu w zupełności wystarczy

Oczywiście, kwestia tego czego potrzebuje. Jednak co to zostało napisane już wcześniej, odnośnie niestandardowych rzeczy dla mnie osobiście eliminuje do chyba wszystkich rzeczy.

gajusz800 napisał(a):

To po co te komponenty bazodanowe są w Delphi? Po to żeby ich nie używać i nie kłaść na formatkach?

A czy napisałem, żeby tego nie używać w ogóle? Po prostu nie kładzie się na formatce takich komponentów. Chyba, że chcemy coś sklecić na kolanie albo zrobić jakiś PoC, wtedy jak najbardziej. Jednak jeśli ma to służyć dłużej warto zrobić coś porządnie.

Pepe napisał(a):

Wbrew tematowi czy typie pytania, nie jest początkującym programistą (jestem amatorem i hobbystą). Ale, zauważcie, że jestem na forum już ponad 20lat... chyba więcej, niż niektórzy z was w zawodzie... i niektóre wpisy mnie nieco ubawiły, choć przyznaję temat raczej dla początkujących... Poruszony problem jest prosty, a zaczynają się porady jak pisać w Delphi, jak jest dobrze, a jak te przebrzydłe dinozaury robią... Amatorski program ma działać, dobrze i niezawodnie - w mojej opinii, to czy "wyklikam" interesujący mnie kod, czy użyję komponentów kładzionych na formę z odpowiednimi powiązaniami, czy też napiszę wszystko "z palca" ma znaczenie drugorzędne - ja tutaj Windows nie pisze :P

Oczywiście, że ja to wiem ;) Jednak na temat mogą natrafić również początkujący i czasami warto przypomnieć pewne sprawy :)

Pepe napisał(a):

Otóż mam wiele plików, w formacie INI (na to teoretycznie nie mam wpływu). Ale każdy z nich może mieć "bardzo" (to subiektywne) dużo sekcji z danymi (np 100 plików, a każdy ma po 10tysięcy wpisów). Program który piszę, ma za zadanie wyświetlić te dane w odpowiedniej formie (coś a'la statystyka). Ale pliki INI nie są dobrym rozwiązaniem dla tak wielu danych. Dlatego mam zamiar wszystkie te pliki scalić w plik bazy danych (utworzyć bazę z jedną tabelą z kolumnami z danymi w odpowiednim formacie) i na niej właśnie operować (tylko odczyt). Dostęp tylko lokalny. Jak widzicie, wiele nie trzeba - wymyśliłem, że taki SQLite będzie akurat.

Do takich zastosowań będzie ok. Z takimi danymi poradzi sobie w zasadzie wszystko na czym uruchomi się program.

AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:3561
0
Pepe napisał(a):

:)
Wbrew tematowi czy typie pytania, nie jest początkującym programistą (jestem amatorem i hobbystą). Ale, zauważcie, że jestem na forum już ponad 20lat... chyba więcej, niż niektórzy z was w zawodzie... i niektóre wpisy mnie nieco ubawiły, choć przyznaję temat raczej dla początkujących...

Ponad 20 letni delfista to w moich oczach ... z pewnością nie Wzorzec Elastyczności Dobrej Architektury w Sevres

lampasss napisał(a):

Problem jest taki, że młodych programistow Delphi już nie ma wg mnie, a starzy maja juz swoje wyrobione nawyki, czesto złe i nie ma sensu dyskutować czy onClick czy nie, bo nie dotrze.

Z ust mi wyjąłeś

U klienta "patronuję" nad niezależnym ode mnie softwarem w Delphi. Jak człowiek (20-30 lat skillu w Delphi) poprawi / doda jedno to popsuje w dwóch miejscach
Widziałem debugowanie, Combo1.OnCLick Buton23.OnClick przez kwadrans, ratunek w zmiennych globalnych
A enduser przechodzi "zasady biznesowe" (np teoretycznie zakazana pozycja zero / null) bo klika w innej kolejności niż autor przewidział


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
Pepe
Nie jestem żadnym delfistą. Ani nie interesuje mnie kto jest twoim wzorcem - z pewnością ty sam, patrząc na twoje wypowiedzi, które chyba nikomu nie pomogły. Jesteś jednym z tej sekty, co to wiedzą wszystko najlepiej, twój język programowania jest najlepszy, a Delphi to przeszłość, ta najgorsza. Proponuje pozwolić entuzjastom cieszyć się z tego języka, środowiska, póki istnieje i skupić się na swoim zajebistym skillu. Pozdrawiam.
G8
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2000
0
Mr.YaHooo napisał(a):

A czy napisałem, żeby tego nie używać w ogóle? Po prostu nie kładzie się na formatce takich komponentów.

Coś mi tu chyba ściemniasz. Gdyby to było złe, to albo byłoby to zablokowane, albo w dokumentacji byłaby informacja, że to niezalecane. Jest coś o tym w dokumentacji Delphi albo tych komponentów? Bo chyba nie i wygląda na to że powstały z myślą że mają być wrzucane na formę.

edytowany 1x, ostatnio: gajusz800
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 5 godzin
  • Postów:496
0

Off-topic: A o co wam chodzi z tym językiem Delphi i złymi nawykami programowania?
Delphi przecież opiera się na komponentach, na zdarzeniach. Co jest złego w położeniu dajmy na to przycisku (TButton) na formę (TForm) i obsłudze zdarzenia OnClick? O co chodzi? Przecież na tym to polega, to esencja RAD (Rapid application development).

Rozumiem, że chodzi o to, żeby nie pisać kodu w samej procedurze zdarzenia, tylko oddelegować go do innych modułów poprzez funkcje / procedury, tak? O co cała ta "afera" Delphi? MOże ktoś to porządnie wyjaśnić?


marian pazdzioch
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 9 godzin
  • Postów:740
0

Przepraszam bardzo ale co ma

SQLite

do

nie będę używał zaawansowanej składni SQL - najprostsze zapytania

Pepe
To, że operuje na zapytaniach SQL?
WL
  • Rejestracja:ponad 21 lat
  • Ostatnio:23 dni
  • Postów:1083
1
gajusz800 napisał(a):
Mr.YaHooo napisał(a):

A czy napisałem, żeby tego nie używać w ogóle? Po prostu nie kładzie się na formatce takich komponentów.

Coś mi tu chyba ściemniasz.

Jasne, tylko problem polega na tym, że nie rozumiesz do końca o czym mowa.

Gdyby to było złe, to albo byłoby to zablokowane, albo w dokumentacji byłaby informacja, że to niezalecane.

Poważnie ZALECANE?
No jeśli nawet, to nie na formatkę a na TDataModule 🙃🤣
Poza tym, Delphi wg producenta to RAD.
A RAD to zło dla średnich, dużych lub bardziej skomplikowanych projektów niż trywialny CRUD.
Chociaż i w CRUD'olandi to bardziej przeszkadza niż pomaga - nie ma to żadnych, ale to żadnych zalet.

Co nie znaczy, że w Delphi nie można inaczej i koszernie.
A jakże można i tak to się robi, ale to wymaga ciut więcej pomysłu i wiedzy, której w twoim poście nie znajduje.

Jest coś o tym w dokumentacji Delphi albo tych komponentów? Bo chyba nie i wygląda na to że powstały z myślą że mają być wrzucane na formę.

Możesz je wrzucić na dowolny kontener w IDE, co nie znaczy że to jest ZAWSZE świetny pomysł.

G8
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2000
0

Aha no to jeśli dochodzimy do tego, że RAD, czyli to czym Delphi się szczyci to zło to już inna sprawa. Na tym się opiera Delphi i z myślą o RAD zostało stworzone. Więc w ogóle jeśli RAD to całe Delphi to zło. Bo producent w tym produkcie promuje technologię RAD i pod nią rozwija swoje narzędzia.

edytowany 1x, ostatnio: gajusz800
WL
Ty jesteś głupi czy tylko złośliwy?
G8
Bardzo merytoryczny komentarz. Zamiast tego lepiej byś odniósł się do pytań @Pepe
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:2 dni
  • Postów:1083
0
gajusz800 napisał(a):

Coś mi tu chyba ściemniasz. Gdyby to było złe, to albo byłoby to zablokowane, albo w dokumentacji byłaby informacja, że to niezalecane. Jest coś o tym w dokumentacji Delphi albo tych komponentów? Bo chyba nie i wygląda na to że powstały z myślą że mają być wrzucane na formę.

Od kiedy to jak tak, że jeśli w instrukcji nie napisali, że używanie czegoś w pewien sposób jest złe to jest to dobre? W instrukcji obsługi noża nie napisali, że wepchnięcie go w serce innego człowieka jest złe, jednak każdy wie jak to się skończy....
Delphi to tylko narzędzie, a jak go użyjemy determinuje osoba siedząca przed ekranem komputera. Przecież są artykuły, książki, tutoriale pokazujące jak programować, aby to robić dobrze. Tej wiedzy nie znajdziesz w instrukcji obsługi IDE czy też dokumentacji języka. Większość zasad jest niezależna od języka w jakim się pisze i to nimi należy się kierować podczas pisania kodu. Dobry i słaby kod można napisać w każdym języku. Widziałeś gdzieś w instrukcji IDE wspomniane zasady KISS, YAGNI, czy chociażby potrzebę separacji warstw w programie? No właśnie :)

Pepe napisał(a):

Off-topic: A o co wam chodzi z tym językiem Delphi i złymi nawykami programowania?
Delphi przecież opiera się na komponentach, na zdarzeniach. Co jest złego w położeniu dajmy na to przycisku (TButton) na formę (TForm) i obsłudze zdarzenia OnClick? O co chodzi? Przecież na tym to polega, to esencja RAD (Rapid application development).

Rozumiem, że chodzi o to, żeby nie pisać kodu w samej procedurze zdarzenia, tylko oddelegować go do innych modułów poprzez funkcje / procedury, tak? O co cała ta "afera" Delphi? MOże ktoś to porządnie wyjaśnić?

Mniej więcej o to chodzi. Sam osobiście nie piszę w Delphi, ale C++ Builderze, ale zasada jest podobna. Samo środowisko przecież używa zmiennych globalnych w których siedzą wskaźniki do formatek, data module. Wyklikując sobie powiązania pomiędzy komponentami np. wyżej wspomniane Connection -> Transaction -> Query -> DataSource -> Grid W przypadku gdy wydzielimy komponenty bazodanowe do oddzielnego data module, to wyklikane powiązania wymagają użycia zmiennych globalnych. Po prostu IDE samo podsuwa złe praktyki. Powiedzmy, że przy małych programach da się tak pracować, ale jak stopień skomplikowania i rozmiar systemu rośnie w pewnym momencie zostanie to bez możliwości rozwoju i dodawania nowych funkcji w prosty sposób.

Sam dostałem w pracy spadku program który ma całość zawarte na formatkach. Hitem jest zdarzenie OnActivate dla pewnej formatki. Napiszę tylko, że funkcja ta ma 1 800 linijek kodu Oto do czego prowadzi używanie RAD w większych systemach...

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
0
Mr.YaHooo napisał(a):

Delphi to tylko narzędzie, a jak go użyjemy determinuje osoba siedząca przed ekranem komputera.

Skoro tak, to dziwię się, że napisałeś również to:

Hitem jest zdarzenie OnActivate dla pewnej formatki. Napiszę tylko, że funkcja ta ma 1 800 linijek kodu Oto do czego prowadzi używanie RAD w większych systemach...

Oto do czego prowadzi osoba siedząca przed komputerem — nie IDE, nie RAD, nie komponenty, nie rozmiar projektu, a koder. Stosujesz cherry picking. Nie ma wymogu umieszczania pełnej implementacji obsługi zdarzenia w ciele zdarzenia. Można implementację podzielić na mniejsze funkcje (w tym jednorazówki), można je w ogóle wyrzucić do osobnego modułu, a w zdarzeniu jedynie wywołać odpowiednią funkcję.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
G8
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad rok
  • Postów:2000
0

@Mr.YaHooo: nie do końca chyba rozumiesz o co mi chodzi. Delphi jako takie opiera się na podejściu RAD. Całe środowisko powstało właśnie z myślą o takim użyciu. Więc pisanie, że podejście te jest słabe jest równoznaczne z pisaniem że Delphi jest słabe.

I nie bardzo rozumiem czemu RAD miałoby wykluczać dobre praktyki. Czemu komponenty na formularzu (a po to zostały stworzone) mają oznaczać coś złego.

edytowany 1x, ostatnio: gajusz800
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:2 dni
  • Postów:1083
0
furious programming napisał(a):

Nie ma wymogu umieszczania pełnej implementacji obsługi zdarzenia w ciele zdarzenia. Można implementację podzielić na mniejsze funkcje (w tym jednorazówki), można je w ogóle wyrzucić do osobnego modułu, a w zdarzeniu jedynie wywołać odpowiednią funkcję.

Owszem, nie ma takiego wymogu. Nie mniej jednak wielu początkujących programistów Delphi/C++ Builder'a stosuje upychanie całości na formatkach. Przypadek, a może po prostu schemat działania narzędzi typu RAD zachęca do takiego pisania programów?

gajusz800 napisał(a):

I nie bardzo rozumiem czemu RAD miałoby wykluczać dobre praktyki. Czemu komponenty na formularzu (a po to zostały stworzone) mają oznaczać coś złego.

Wykluczać to na pewno nie. Bo za pomocą RAD'ów można ładnie pisać, ale wymaga to zaplanowania i napisania większej ilości kodu. A czemu kładzenie komponentów bazodanowych na formatkach jest złe? Miesza się odpowiedzialności. Masz w jednej klasie prezentację danych oraz ich pobieranie z bazy. To dobre podejście? Kolejną sprawą, że IDE domyślnie korzysta ze zmiennych globalnych, a te już same z siebie to zło, bo chociażby wprowadza niejawne zależności pomiędzy modułami.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
1
Mr.YaHooo napisał(a):

Nie mniej jednak wielu początkujących programistów Delphi/C++ Builder'a stosuje upychanie całości na formatkach.

Nigdy nie oceniaj jakości technologii na podstawie losowego, gównianego kodu, napisanego przez kogoś, kto nie potrafi pisać dobrego kodu. Nigdy i żadnej technologii, bo to nie technologia winna, że jej użytkownik jest dzbanem. ;)

Przypadek, a może po prostu schemat działania narzędzi typu RAD zachęca do takiego pisania programów?

System komponentów wizualnych w Delphi, Lazarusie i innych narzędziach RAD jest tak zbudowany, aby kod obsługi tych komponentów był implementowany w zdarzeniach, których ciała generowane są automatycznie przez IDE. Jeśli chcesz oprogramować interakcję z kontrolką, uzupełniasz konkretne zdarzenie i koniec. Nieistotne jest to na ile metod podzielisz kod zdarzenia, ani czy skorzystasz z tego wygenerowanego czy podłączysz swoje z zewnątrz w runtime — całość sprowadza się do przewidzianego przez producenta zdarzenia kontrolki.

I tak samo jest np. w Unity — silnik zaprogramowany jest tak a nie inaczej, więc jego użytkownik korzysta z tego, co przygotowali jego twórcy (czyli konkretne klasy i metody). Nieistotne jest to, czy cały kod napiszesz w danej metodzie, czy podzielisz go na wiele metod, tak czy siak ta konkretna metoda silnika musi być wywołana. Możesz napisać w niej 1800 linii kodu, a możesz tylko jedną — z wywołaniem właściwej metody, zaimplementowanej gdzieś indziej.

Tak więc to nie jest kwestia zachęcania czy nie, a architektury danej technologii. Natomiast zadaniem użytkownika jest dostosowanie się do specyfiki architektury i napisanie takiego kodu, aby dało się go wygodnie utrzymywać.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 8x, ostatnio: flowCRANE
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:2 dni
  • Postów:1083
0
furious programming napisał(a):

Nigdy nie oceniaj jakości technologii na podstawie losowego, gównianego kodu, napisanego przez kogoś, kto nie potrafi pisać dobrego kodu. Nigdy i żadnej technologii, bo to nie technologia winna, że jej użytkownik jest dzbanem. ;)

Racja, nie powinno się tak oceniać. Analogicznie jak nie broń zabija, a człowiek który ją trzyma w ręku i ciągnie za spust ;)

furious programming napisał(a):

System komponentów wizualnych w Delphi, Lazarusie i innych narzędziach RAD jest tak zbudowany, aby kod obsługi tych komponentów był implementowany w zdarzeniach, których ciała generowane są automatycznie przez IDE. Jeśli chcesz oprogramować interakcję z kontrolką, uzupełniasz konkretne zdarzenie i koniec. Nieistotne jest to na ile metod podzielisz kod zdarzenia, ani czy skorzystasz z tego wygenerowanego czy podłączysz swoje z zewnątrz w runtime — całość sprowadza się do przewidzianego przez producenta zdarzenia kontrolki.

To jest akurat dobre podejście. Jednak trochę rozleniwia. Skoro mam wygenerowane zdarzenie, to wszystko ląduje wewnątrz jego. Niestety dużo ludzi tak myśli i tak właśnie robi. Tylko co z tymi nieszczęsnymi zmiennymi globalnymi które IDE tworzy podczas tworzenia nowego formularza? Przecież wiadomo, że należy ich unikać. Więc po co w ogóle je tworzyć z automatu?

furious programming napisał(a):

Tak więc to nie jest kwestia zachęcania czy nie, a architektury danej technologii. Natomiast zadaniem użytkownika jest dostosowanie się do specyfiki architektury i napisanie takiego kodu, aby dało się go wygodnie utrzymywać.

Tak, a zadaniem autorów danej technologii jest dobre zaprojektowanie frameworka, aby wygodnie się z niego korzystało.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Tuchów
  • Postów:12175
0
Mr.YaHooo napisał(a):

Tak, a zadaniem autorów danej technologii jest dobre zaprojektowanie frameworka, aby wygodnie się z niego korzystało.

I dlatego właśnie komponenty mają zdarzenia, bo są bardzo wygodne. :]


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 9 godzin
0

@Mr.YaHooo:

Tylko co z tymi nieszczęsnymi zmiennymi globalnymi które IDE tworzy podczas tworzenia nowego formularza? Przecież wiadomo, że należy ich unikać. Więc po co w ogóle je tworzyć z automatu?

Automat IDE działa tak jak działa.
Jeśli już mam potrzebę (albo chęć :) ) aby utworzyć formularz w IDE to w pierwszym kroku po utworzeniu nowej formy wywalam tę zmienną globalną

edytowany 2x, ostatnio: grzegorz_so
Pepe
Mógłbyś rozwinąć temat? Co wywalasz, PO CO i czym zastępujesz?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.