datenbankanbindung ohne komponente, fehlerfunktion

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von VB_Lazarus »

hallo,
ich wollte mich kurz vorstellen.
ich bn ein vb6 hobby-programmierer und will mich mit pascal bzw. lazarus auseinandersetzen.
dieses ganze projekt (lazarus + fpc) hat mich beeindruckt.
ich habe mich nicht wirklich mit pascal auseinandergestzt, weil die programmiersprache basic (office, diverse anwendungen) stark verbreitet ist.
jetzt ist der zeitpunkt gekommen mich damit auseinderzusetzen, weil fpc plattformübergreifend und nicht abhängig von diversen laufzeitumgebungen (net u.d.) ist.
natürlich habe ich auch so meine anfangsschwierigkeiten pascal zu verstehen.
deshalb habe ich einige frage und bin dankbar, wenn sie beantwortet werden.
ich habe ein projekt (rechnungsprogramm) was ich nach pascal konvertieren möchte.
dieses programm basiert auf vb6 und hat eine msaccess datenbank.
ich habe das vb programm so aufgebaut, das mit einem modul (main) das programm gestartet wird.
in diesem modul werden alle einstellungen aus einer ini-datei ausgelesen.
es wird in diesem modul auch eine datenbankverbindung hergestellt hergestellt.
danach wird ein login-formular geöffnet. der benutzer und sein passwort ist in der db gespeichert.
die fehler in den routinen werden an eine funktion weitergeleitet und dort ausgewertet.

1. gibt es eine möglichkeit in pascal auch eine sub main zu erstellen und eine datenbankverbindung ohne komponenten herzustellen?
die formulare sollten erst dann geladen werden, wenn alles ok ist.
2. gibt es eine möglichkeit so eine fehlerfunktion (on error goto fehler -> funktion mit rückgabewert) in pascal zu implementieren?

ich bedanke mich im voraus für die hilfestellung und wünsche allen ein frohes weihnachtsfest.

gruss

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von af0815 »

VB_Lazarus hat geschrieben:1. gibt es eine möglichkeit in pascal auch eine sub main zu erstellen und eine datenbankverbindung ohne komponenten herzustellen?
die formulare sollten erst dann geladen werden, wenn alles ok ist.
2. gibt es eine möglichkeit so eine fehlerfunktion (on error goto fehler -> funktion mit rückgabewert) in pascal zu implementieren?

Erstmal willkommen bei Lazarus.

1) Ja, das Projekt startet und ruft dann die Erstellung der einzelnen Formulare auf und übergibt die Kontrolle an das definierte Hauptformular. Das entspricht in etwa dem Verhalten was du meinst. Bezüglich Datenbankverbindung - die Datenbankverbindung sind nichtvisuelle Komponenten, damit können die, wie alle anderen Objekte auch, per Programmcode erstellt und verwendet werden. Ich nehme an, du meinst das die Verbindung ohne visuell sichtbare Komponenten durchgeführt wir für das Login.

2) Ja, halte ausschau nach try/except oder try/finally

Auf dem Portal ist ein Link für dieLazSnippets/LazInfos vielleicht bekommst du dort ein paar Anregungen.
Bezüglich Access, stellt sich die Frage, ob es verwendet werden soll. Es ist auf Windows beschränkt und meines Wissens nur über ODBC (kein ADO oder RDO) anzusprechen. vor allen wenn du die Applikation auf Lazarus umstellen willst (ev. Plattformunabhängig) so wäre es doch gut, die alten Wege zu verlassen und optimiert für Lazarus mit seinen Möglichkeiten zu arbeiten. Auch die Version 1.0 von Lazarus kommt langsam in Sicht :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von VB_Lazarus »

danke, für die schnelle antwort.
ich habe gemerkt, dass die formulare in der .lpi aufgerufen werden.
ist das richtig, das ich meine procedure auch in der .lpi definieren muss und entsprechend abarbeiten?
kann ich mit dieser try funktion auch eine resume next erzeugen?
mit der datenbank verhält es sich so, ich habe msaccess und kann die datenbank dadurch sehr komfortabel ändern und anpassen.
ich würde auch gerne von diesem datenbankformat abkommen, wenn ich eine einfache alternative hätte.
non visuelle komponente, kann ich die komponenten im code ansprechen?
muss die definition irgendwo in der uses stehen?

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von MAC »

Hallo.

Wenn du eine GUI anwendung hast (visuelle komponente, also form) dann lass ich die .lpr datei meistens komplett in Ruhe.
viel mehr ändert man die eigentliche .pas datei.
Es kommt drauf an was für eine Procedure das ist. Je nachdem , ob das eine Procedur einer Klasse ist oder einfach nur eine dahingestellte Procedure ist muss man die Deklarieren, ein paar beispiele (gekürzt):

1. Button1.Click

Code: Alles auswählen

TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject); // Deklaration , muss sein.
  private
  public
  end;
 
var
  Form1: TForm1;
implementation
{$R *.lfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 
end;


2. Globale funktion

Code: Alles auswählen

TForm1 = class(TForm)
    Button1: TButton;
  private
  public
  end;
 
function EurozuDollar(euro:real):real; // Deklaration ist "Freiwillig"
 
var
  Form1: TForm1;
implementation 
{$R *.lfm}   
 
function EurozuDollar(euro:real):real;
begin
result := euro * 1.38;
end;


wobei man die deklaration auch im 2ten fall vornehmen sollte weil man sonnst die proceduren sotieren muss.
Also wenn beim Button1Click procedure a von procedure b aufgerufen wird müsste die Reihenfolge erst a, dann b, dann Button1.Click sein.
Wenn man die vorher deklariert kannst du die umstellen wie du willst :)


Soweit ich weis verhält sich

try
//...
except
//...
end;

so das beim Fehler innerhalb vom try-teil direkt zum except gesprungen wird und dieser ausgeführt wird. sonnst wird nur der tryteil durchgelaufen.

try
//...
finally
//...
end;

da sollte wie oben try ausgeführt weden und beim fehler zum finally springen. Aber im unterschied würde das finally auch ohne fehler normalerweise durchgelaufen

Datenbankformat kenn ich mich nicht aus. Muss es gleich datenbank sein, oder reicht nicht textdatei?

Code: Alles auswählen

Signatur := nil;

VB_Lazarus
Beiträge: 90
Registriert: Do 23. Dez 2010, 19:10
OS, Lazarus, FPC: Windows 10/11 32/64bit, L 2.2.0 32bit, FPC 3.2.2 32bit
CPU-Target: 32Bit

Re: datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von VB_Lazarus »

erst mal danke für die beispiele.
das problem liegt nicht in der prozedur, sondern kann ich eine prozedur vor dem erstellen (create) einer form ausführen?
d.h. ich möchte einige einstellungen für das programm abfragen, unter anderem ein dialog für die auswahl der datenbank.
falls einige einstellungen fehl laufen, sollte die form erst gar nicht angezeigt werden und das programm sollte mit einer info beendet werden.
datenbank ist leider notwendig, da es verschiedene abhängigkeiten gibt (adressen, rechnungen, artikel usw.).
diese daten kann man am besten mittels einer db handeln.
leider habe ich nur ein tutorial über die anbindung einer msaccess db mittels einer komponente gefunden.
in vb kann man im projekt einen verweis setzen und dann auf das objekt zugreifen.
ich wollte die db vorher verbinden, bevor ich eine form erstelle.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von Socke »

Du kannst die Datenbank-Komponenten auf ein Datanmodul legen. Diese werden wie Formulare erstellt, und haben auch einen OnCreate-Event. Wenn du also dieses Datenmodul als erstes erstellst (im Menü »Projekt -> Projekteinstellungen -> Formulare« nach ganz oben sortieren), kannst du im OnCreate-Event ein weiteres Formular manuell erstellen und anzeigen. Wenn etwas schief läuft, kannst du mit Application.Terminate; das Programm fast sofort beenden (alle automatisch erstellten Formulare werden trotzdem noch erstellt, aber nie angezeigt).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: datenbankanbindung ohne komponente, fehlerfunktion

Beitrag von MAC »

Ich würde das "Stylish" machen und einfach ein Ladebild zwischenstellen, das hat jedes Programm, sogar Lazarus selbst xD
Dann startest du eine Form auf der nen Tolles Bild liegt. Borderstyle ist bsnone. und da kommt dan ein Timer drauf. Denn Timer sind gut für Code, der nach dem starten dieser Form ausgeführt wird. Beim OnCreate von Form1 z.B: gib es noch gar kein Button1, weil dieser erst danach ausgeführt wird. Also hast du dein Timer mit interval 1. Und in dem wird dann alles wichtige abgefragt. von mir aus schonmal mit der datenbank verbunden. Und wenn das klappt dann tust du am ende
timer1.Enabled := False // damit der nur einmal startet.
Form2.Enabled := False;
Form1.Enabled := True;
Oder eben statt Form1.Enabled : Achtung Feher... Bla Bla Bla

Ich gehe jetzt davon aus das Form1 deine tolle standartform ist und form2 die mit dem Bild.
Dann
>> Projekt >> Quelltext anzeigen >>
in das hier

Code: Alles auswählen

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end.

vertauschen

Code: Alles auswählen

begin
  Application.Initialize;
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


dann wird erst Form2 gestartet. Sollte zumindest ;)

Code: Alles auswählen

Signatur := nil;

Antworten