Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Joblist - Aufgabenplaner (https://www.delphipraxis.net/181932-joblist-aufgabenplaner.html)

AlexII 18. Sep 2014 19:44


Joblist - Aufgabenplaner
 
Liste der Anhänge anzeigen (Anzahl: 3)
Hallo,

ich habe eine kleine Anwendung zum Aufgabenplanung geschrieben. Man kann eine Aufgabe mit bestimmten Eigenschaften (Beginn, Priorität, Status, Beschreibung, Ort, usw.) anlegen und verwalten, aber am besten siehe Screenshot.

Die Anwendung hat bis jetzt nur die nötigsten Funktionen, da ich erst das "Fundament" stabil schreiben möchte. Daher werde ich mich als Hobbyprogrammierer sehr freuen wenn sie mir dabei helfen, vor allem mein Umgang mit der DB bewerten und gute Tipps gibt. Der Quellcode liegt bei. ))

Danke!

19.09.2014 Version 0.4 alpha
- Bug Post #2 beseitigt!

22.09.2014 Version 0.5 beta
- Vorschlag aus Post #3 umgesetzt
- Fehlerausgabe in MessageDlg() erweitert



P.S. falls jemand Lust und Laune hat, kann mir bei der Entwicklung helfen. ))

freak4fun 18. Sep 2014 22:49

AW: Joblist - Aufgabenplaner
 
Wenn ich die über FK eingebundene Werte in den Tabellen lösche, sind alle anderen Einträge auch betroffen. Das sollte nicht passieren.
Zumindest eine Warnung sollte erscheinen.

-=ZGD=- 19. Sep 2014 07:11

AW: Joblist - Aufgabenplaner
 
Guten Morgen.

Find´s gut.
Funktioniert.

Ich habe mir natürlich auch mal den Quelltext angeschaut.

Es gibt einige Dinge, die ich anders machen würde, da diese redundant sind.

Du hast zwei Funktionen, die bis auf die Reihenfolge der Selektierung die gleichen Felder abfragen. Einzige Unterschiede sind das Flag zum Einen und die Listview zum Anderen.

Delphi-Quellcode:
// Geschlossene Aufgaben
procedure TForm1.LoadCloseJobslistByStart();
var
  MyItem: TListItem;
begin
  try

    ListView2.Clear;
    ListView2.Items.BeginUpdate;

    SQLQuery1.Close;
    SQLQuery1.SQL.Text := 'SELECT tbmain.id_tbmain, '
    + 'tbmain.title, '
    + 'tbmain.start, '
    + 'tbmain.ende, '
    + 'tbcategory.category, '
    + 'tbprocessowner.processowner, '
    + 'tbpriority.priority, '
    + 'tbstatus.status, '
    + 'tbplace.place '
    + 'FROM tbmain '
    + 'LEFT JOIN tbcategory ON tbmain.fk_category_id=tbcategory.id_tbcategory '
    + 'LEFT JOIN tbprocessowner ON tbmain.fk_processowner_id=tbprocessowner.id_tbprocessowner '
    + 'LEFT JOIN tbpriority ON tbmain.fk_priority_id=tbpriority.id_tbpriority '
    + 'LEFT JOIN tbstatus ON tbmain.fk_status_id=tbstatus.id_tbstatus '
    + 'LEFT JOIN tbplace ON tbmain.fk_place_id=tbplace.id_tbplace WHERE flag = 1';
    SQLQuery1.Open;
    while not SQLQuery1.Eof do
    begin
      MyItem := ListView2.Items.Add;
      MyItem.Data := Pointer(SQLQuery1.FieldByName('id_tbmain').AsInteger); //data mit ids fuellen. Mit dieser ID werden weitere Operationen gemacht, z.B. Bearbeiten, Löschen
      MyItem.Caption := SQLQuery1.FieldByName('title').AsString;
      MyItem.SubItems.Add(SQLQuery1.FieldByName('priority').AsString);
      MyItem.SubItems.Add(DateToStr(SQLQuery1.FieldByName('start').AsDateTime)); // DateTimeToStr zeigt auch die Uhrzeit an

      // Prüfen, ob Datenfeld belegt
      if not SQLQuery1.FieldByName('ende').IsNull then
        MyItem.SubItems.Add(DateToStr(SQLQuery1.FieldByName('ende').AsDateTime))
      else MyItem.SubItems.Add('');

      MyItem.SubItems.Add(SQLQuery1.FieldByName('place').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('category').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('processowner').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('status').AsString);
      SQLQuery1.Next;
    end;

    ListView2.Items.EndUpdate;

  except
    MessageDlg('Die Aufgaben konnten nicht gelesen werden!', mtError, [mbOk], 0);
  end;
end;

// Offene Aufgaben
procedure TForm1.LoadJobslistByStart();
var
  MyItem: TListItem;
begin
  try

    ListView1.Items.BeginUpdate;
    ListView1.Clear;

    SQLQuery1.Close;
    SQLQuery1.SQL.Text := 'SELECT tbmain.id_tbmain, '
    + 'tbmain.title, '
    + 'tbmain.start, '
    + 'tbmain.ende, '
    + 'tbcategory.category, '
    + 'tbprocessowner.processowner, '
    + 'tbpriority.priority, '
    + 'tbstatus.status, '
    + 'tbplace.place '
    + 'FROM tbmain '
    + 'LEFT JOIN tbcategory ON tbmain.fk_category_id=tbcategory.id_tbcategory '
    + 'LEFT JOIN tbprocessowner ON tbmain.fk_processowner_id=tbprocessowner.id_tbprocessowner '
    + 'LEFT JOIN tbpriority ON tbmain.fk_priority_id=tbpriority.id_tbpriority '
    + 'LEFT JOIN tbstatus ON tbmain.fk_status_id=tbstatus.id_tbstatus '
    + 'LEFT JOIN tbplace ON tbmain.fk_place_id=tbplace.id_tbplace WHERE flag = 0';
    SQLQuery1.Open;
    while not SQLQuery1.Eof do
    begin
      MyItem := ListView1.Items.Add;
      MyItem.Data := Pointer(SQLQuery1.FieldByName('id_tbmain').AsInteger); //data mit ids fuellen. Mit dieser ID werden weitere Operationen gemacht, z.B. Bearbeiten, Löschen
      MyItem.Caption := SQLQuery1.FieldByName('title').AsString;
      MyItem.SubItems.Add(SQLQuery1.FieldByName('priority').AsString);
      MyItem.SubItems.Add(DateToStr(SQLQuery1.FieldByName('start').AsDateTime)); // DateTimeToStr zeigt auch die Uhrzeit an

      // Prüfen, ob Datenfeld belegt
      if not SQLQuery1.FieldByName('ende').IsNull then
        MyItem.SubItems.Add(DateToStr(SQLQuery1.FieldByName('ende').AsDateTime))
      else MyItem.SubItems.Add('');

      MyItem.SubItems.Add(SQLQuery1.FieldByName('place').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('category').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('processowner').AsString);
      MyItem.SubItems.Add(SQLQuery1.FieldByName('status').AsString);
      SQLQuery1.Next;
    end;

    ListView1.Items.EndUpdate;

  except
    MessageDlg('Die Aufgaben konnten nicht gelesen werden!', mtError, [mbOk], 0);
  end;
end;
Besser wäre es, du würdest einfach einen Boolean übergeben und die ListView.

Delphi-Quellcode:
procedure LoadJobslistByStart(aClosedOnes: Boolean; aListView: TListView);
begin
  //Irgendwo unterscheidest du dann.
  ...
  + 'LEFT JOIN tbplace ON tbmain.fk_place_id=tbplace.id_tbplace WHERE flag = :flag';

  if aClosedOnes then
  begin
   SQLiteQuery1.ParamByName('flag').value:= 0;
  end
  else
  begin
   SQLiteQuery1.ParamByName('flag').value:= 1;
  end;

  //Weitere Verarbeitung
end;
Gruß,
Stefan

AlexII 19. Sep 2014 08:44

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von freak4fun (Beitrag 1273068)
Wenn ich die über FK eingebundene Werte in den Tabellen lösche, sind alle anderen Einträge auch betroffen. Das sollte nicht passieren.
Zumindest eine Warnung sollte erscheinen.

Stimmt, habe es noch nicht bemerkt. Danke Dir werde es ändern!

AlexII 19. Sep 2014 08:46

AW: Joblist - Aufgabenplaner
 
@-=ZGD=-

Ok, danke für den Tipp. Und sonst alles gut, oder hast Du dir nicht alles angeschaut?

himitsu 19. Sep 2014 09:16

AW: Joblist - Aufgabenplaner
 
Apropos doppelter Code. :angel:
Zitat:

Delphi-Quellcode:
if aClosedOnes then
begin
  SQLiteQuery1.ParamByName('flag').value := 0;
end
else
begin
  SQLiteQuery1.ParamByName('flag').value := 1;
end;

Das ist ja wie ein
Delphi-Quellcode:
if MyBoolean then
  Result := True
else
  Result := False;
In Delphi ist True als 1 definisert und False ist sowieso immer 0, darum ginge das hier.
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').value := Ord(aClosedOnes);


Aber aus selbem Grund, warum ich ständig drarauf hinweise, daß man
Delphi-Quellcode:
if MyBool = True then
nicht machen sollte, da zwar die Konstante "True" = 1, aber der Zustand "True" <> 0 ist, wäre es so bestimmt sicherer,
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').value := IfThen(aClosedOnes, 1, 0);

wenn man nicht sichestellen kann, was in der Variable drin steckt.


bzw.
SQL-Code:
WHERE flag = :flag;
/
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').AsInteger := IfThen(aClosedOnes, 1, 0);

SQL-Code:
WHERE (flag <> 0) = :flag;
/
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').AsBoolean := aClosedOnes;

AlexII 19. Sep 2014 09:21

AW: Joblist - Aufgabenplaner
 
Gut, ich komme noch dazu... bin noch am Post #2

Habe das Problem so gelöst, aber die FK werden trotzdem gelöscht. Ich verstehe nicht wieso, ist doch alles richtig gemacht, zumindest beim DB Erstellen. :|

Delphi-Quellcode:
PRAGMA foreign_keys = ON;

CREATE TABLE [tbmain] (
  [id_tbmain] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  [title] TEXT NOT NULL,
  [start] DATETIME NOT NULL,
  [ende] DATETIME,
  [memo] TEXT,
  [flag] INTEGER NOT NULL,
  [fk_category_id] INTEGER,
  [fk_processowner_id] INTEGER,
  [fk_priority_id] INTEGER,
  [fk_status_id] INTEGER NOT NULL,
  [fk_place_id] INTEGER,
  FOREIGN KEY ([fk_category_id]) REFERENCES [tbcategory]([id_tbcategory]) ON DELETE RESTRICT,
  FOREIGN KEY ([fk_processowner_id]) REFERENCES [tbprocessowner]([id_tbprocessowner]) ON DELETE RESTRICT,
  FOREIGN KEY ([fk_priority_id]) REFERENCES [tbpriority]([id_tbpriority]) ON DELETE RESTRICT,
  FOREIGN KEY ([fk_status_id]) REFERENCES [tbstatus]([id_tbstatus]) ON DELETE RESTRICT,
  FOREIGN KEY ([fk_place_id]) REFERENCES [tbplace]([id_tbplace]) ON DELETE RESTRICT)

-=ZGD=- 19. Sep 2014 09:26

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von himitsu (Beitrag 1273101)
Apropos doppelter Code. :angel:
Zitat:

Delphi-Quellcode:
if aClosedOnes then
begin
  SQLiteQuery1.ParamByName('flag').value := 0;
end
else
begin
  SQLiteQuery1.ParamByName('flag').value := 1;
end;

Das ist ja wie ein
Delphi-Quellcode:
if MyBoolean then
  Result := True
else
  Result := False;
In Delphi ist True als 1 definisert und False ist sowieso immer 0, darum ginge das hier.
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').value := Ord(aClosedOnes);


Aber aus selbem Grund, warum ich ständig drarauf hinweise, daß man
Delphi-Quellcode:
if MyBool = True then
nicht machen sollte, da zwar die Konstante "True" = 1, aber der Zustand "True" <> 0 ist, wäre es so bestimmt sicherer,
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').value := IfThen(aClosedOnes, 1, 0);

wenn man nicht sichestellen kann, was in der Variable drin steckt.


bzw.
SQL-Code:
WHERE flag = :flag;
/
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').AsInteger := IfThen(aClosedOnes, 1, 0);

SQL-Code:
WHERE (flag <> 0) = :flag;
/
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').AsBoolean := aClosedOnes;

Da hast du schon recht. :thumb:

Ich persönlich mach das immer so wie von mir beschrieben, da oft bei der Entscheidung neuer/aktualister Datensatz noch einige andere Anweisungen/Callbacks/etc. folgten.

-=ZGD=- 19. Sep 2014 09:29

AW: Joblist - Aufgabenplaner
 
Da fällt mir ein...war True in Delphi nicht -1 - irgendwann mal?

AlexII 19. Sep 2014 14:52

AW: Joblist - Aufgabenplaner
 
Habe den Fehler aus Post #2 beseitigt... man war das eine Quälerei... :roteyes: Aber es läuft jetzt. :thumb: Jetzt sind die nächsten Tipps dran. :-D

freak4fun 19. Sep 2014 18:28

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von AlexII (Beitrag 1273192)
Habe den Fehler aus Post #2 beseitigt... man war das eine Quälerei... :roteyes: Aber es läuft jetzt. :thumb: Jetzt sind die nächsten Tipps dran. :-D

Super, weiter so! :thumb:

AlexII 22. Sep 2014 10:51

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von -=ZGD=- (Beitrag 1273072)
Guten Morgen.

Find´s gut.
Funktioniert.

Ich habe mir natürlich auch mal den Quelltext angeschaut.

Es gibt einige Dinge, die ich anders machen würde, da diese redundant sind.

Du hast zwei Funktionen, die bis auf die Reihenfolge der Selektierung die gleichen Felder abfragen. Einzige Unterschiede sind das Flag zum Einen und die Listview zum Anderen.

Besser wäre es, du würdest einfach einen Boolean übergeben und die ListView.

Delphi-Quellcode:
procedure LoadJobslistByStart(aClosedOnes: Boolean; aListView: TListView);
begin
  //Irgendwo unterscheidest du dann.
  ...
  + 'LEFT JOIN tbplace ON tbmain.fk_place_id=tbplace.id_tbplace WHERE flag = :flag';

  if aClosedOnes then
  begin
   SQLiteQuery1.ParamByName('flag').value:= 0;
  end
  else
  begin
   SQLiteQuery1.ParamByName('flag').value:= 1;
  end;

  //Weitere Verarbeitung
end;
Gruß,
Stefan

Äh.... sag ma und wie übergebe ich die Parameter? Etwa so?

Delphi-Quellcode:
// procedure aufrufen
LoadJobslistByStart(True, ListView1);

-=ZGD=- 22. Sep 2014 10:57

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von AlexII (Beitrag 1273364)
Äh.... sag ma und wie übergebe ich die Parameter? Etwa so?

Delphi-Quellcode:
// procedure aufrufen
LoadJobslistByStart(True, ListView1);

Korrekt.

AlexII 22. Sep 2014 11:46

AW: Joblist - Aufgabenplaner
 
ok ))

-=ZGD=- 22. Sep 2014 11:52

AW: Joblist - Aufgabenplaner
 
Du verwendest in der Prozedur auch immer
Code:
ListView1
.
Du musst
Code:
aListView
verwenden, da so der Übergabeparameter/Variable heißt.

AlexII 22. Sep 2014 11:55

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von -=ZGD=- (Beitrag 1273369)
Du verwendest in der Prozedur auch immer
Code:
ListView1
.
Du musst
Code:
aListView
verwenden, da so der Übergabeparameter/Variable heißt.

Ja hab's gemerkt. :-D

Mache jetzt noch die selber Geschichte für's Suchen und dann ist wohl alles ok bei mir, oder gibt's noch Vorschläge bzw. Kritik?

AlexII 30. Sep 2014 13:11

AW: Joblist - Aufgabenplaner
 
Ich nutze hier mehrere Querys (SQLQuery1 und SQLQueryCategory), wäre es auch nur mit einem gegangen?

Delphi-Quellcode:
    // -------------------------- Category ---------------------------------------
    // Kategorie leer
    if CategoryComboBox.Text = '' then
    begin
      Form1.SQLQuery1.ParamByName('fk_category_id').Clear;
    end else if (CategoryComboBox.Items.IndexOf(CategoryComboBox.Text) = -1) and (CategoryComboBox.Text <> '') then
    begin
      // Kategorie nicht vorhanden, also neue Kategorie in die DB schreiben
      Form1.SQLQueryCategory.Close;
      Form1.SQLQueryCategory.SQL.Text := 'INSERT INTO tbcategory VALUES(NULL, :category)';
      Form1.SQLQueryCategory.ParamByName('category').AsString := CategoryComboBox.Text;
      Form1.SQLQueryCategory.ExecSQL;
      Form1.SQLTransaction1.Commit;

      // Die letzte ID auslesen
      Form1.SQLQueryCategory.Close;
      Form1.SQLQueryCategory.SQL.Text := 'SELECT last_insert_rowid() as id_tbcategory FROM tbcategory';
      Form1.SQLQueryCategory.Open;
      CategoryLastID := Form1.SQLQueryCategory.FieldByName('id_tbcategory').AsInteger;
      Form1.SQLQuery1.ParamByName('fk_category_id').AsInteger := CategoryLastID;
    end else if CategoryComboBox.Items.IndexOf(CategoryComboBox.Text) >= 0 then
    begin
      // String in der CB vorhanden, ID zuweisen
      Form1.SQLQuery1.ParamByName('fk_category_id').AsInteger := Integer(CategoryComboBox.Items.Objects[CategoryComboBox.Items.IndexOf(CategoryComboBox.Text)]);
    end;
    // -------------------------- Ende Category ---------------------------------- 

    Form1.SQLQuery1.ExecSQL;
    Form1.SQLTransaction1.Commit;

AlexII 18. Nov 2014 15:16

AW: Joblist - Aufgabenplaner
 
Ich lasse jetzt die Anwendung mit Windows mithilfe der Registry starten, aber das Prog will bei dem Autostart die DB nicht laden, es kommt der Fehler:

Code:
EDatabaseError
SQLite3Connection1: unable to open database file
Hat jemand eine Idee wieso das passiert? Ich verstehe nicht was der Unterschied ist wenn ich die Anwendung manuell ausführe, oder das System macht das... hm... komisch.

mkinzler 18. Nov 2014 17:34

AW: Joblist - Aufgabenplaner
 
Möglicherweise ist die Datenbank noch nicht verfügbar oder die Anwendung wird in einem anderen Benutzerkontext gestartet

hathor 18. Nov 2014 18:24

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von AlexII (Beitrag 1280216)
Ich lasse jetzt die Anwendung mit Windows mithilfe der Registry starten, ...

Ich finde das nicht sehr lustig, wenn jedes poplige Programm gleich mit dem WINDOWS-Start die Festplatte blockiert mit solchen Aktivitäten!

Damit verzögert sich der Boot-Vorgang des Betriebssystems.

Um es noch einmal ganz deutlich zu sagen:

Es ist SCHWACHSINNIG, das eigene Programm beim Boot-Vorgang zu laden und zu erwarten, dass alle Funktionen von WINDOWS gleich zur Verfügung stehen!

Lade es verzögert mit einem Timer.

AlexII 18. Nov 2014 18:48

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von hathor (Beitrag 1280240)
Ich finde das nicht sehr lustig, wenn jedes poplige Programm gleich mit dem WINDOWS-Start die Festplatte blockiert mit solchen Aktivitäten!

Als erstes braucht das Prog diese Option, weil es da um Aufgaben und Termine geht und zweitens muss diese vom User aktiviert werden. Also keine Panik, wenn man selbst es nicht aktiviert bleibt die Registry unberührt. :wink:

Dejan Vu 19. Nov 2014 04:05

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von hathor (Beitrag 1280240)
Ich finde das nicht sehr lustig, wenn jedes poplige Programm gleich mit dem WINDOWS-Start die Festplatte blockiert mit solchen Aktivitäten! ... Es ist SCHWACHSINNIG,

Und ich finde es nicht sehr lustig, das du Programme als poplig :mrgreen: bezeichnest und die Vorgehensweise als 'SCHWACHSINNIG' bezeichnest. Das ist unhöflich und im Ton vollkommen unangemessen. Komisch, so ein Rüpel bist Du doch gar nicht.

Es ist durchaus legitim, ein Programm in den Autostart zu packen, auch in die Registry. Dazu ist die Funktionalität schließlich da. Wenn DU damit ein Problem hast, kannst DU kannst es ja anders starten. Blöd ist das natürlich, wenn ein Programm beharrt, über die Registry gestartet zu werden, also nicht flexibel ist. Hier ist das aber offensichtlich nicht der Fall.

Zitat:

Zitat von hathor (Beitrag 1280240)
Damit verzögert sich der Boot-Vorgang des Betriebssystems....das eigene Programm beim Boot-Vorgang zu laden

Der 'Boot-Vorgang' ist mit Starten der Autostart-Programme längst vorbei. Das Betriebssystem ist vollständig geladen und betriebsbereit. Irgendwie muss man sich ja anmelden, ne wahr?
Wie macht man das eigentlich, das 'das eigene Programm beim Boot-Vorgang zu laden'? Welche Dateien müssen wo registriert werden? Wäre das nicht ein kleines Sicherheitsrisiko?

Zum Thema: Wo befindet sich die Datenbank, also in welchem Ordner? Netzlaufwerke sind vermutlich noch nicht gebunden und verfügbar, ein typischer Fehler.

AlexII 19. Nov 2014 08:21

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von Dejan Vu (Beitrag 1280267)
Zum Thema: Wo befindet sich die Datenbank, also in welchem Ordner? Netzlaufwerke sind vermutlich noch nicht gebunden und verfügbar, ein typischer Fehler.

Es handelt sich um eine SQLite DB, diese liegt im Programmverzeichnis. Das Prog ist portable, der Programmordner kann also überall liegen, aber die .exe und die DB liegen auf jeden Fall (noch) zusammen.
Aber ich habe schon eine Idee, vor dem Programmaufruf nach der Verbindung zu der DB zu schauen, und falls sie noch nicht besteht, das Prog kurz sleepen lassen und danach neu versuchen bis die besteht.

hathor 19. Nov 2014 12:53

AW: Joblist - Aufgabenplaner
 
Relative Pfade durch absolute ersetzen, z.B.

Delphi-Quellcode:
...
  if not FileExists(ExtractFilepath (Application.ExeName) + 'DEINE.db') then
  begin
    ShowMessage('The database does not exist. Please create one.');
    Exit;
  end;

...

AlexII 19. Nov 2014 12:57

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von hathor (Beitrag 1280325)
Relative Pfade durch absolute ersetzen, z.B.

Delphi-Quellcode:
...
  if not FileExists(ExtractFilepath (Application.ExeName) + 'DEINE.db') then
  begin
    ShowMessage('The database does not exist. Please create one.');
    Exit;
  end;

...

Habe ich schon, aber es hilft nicht, siehe hier -> Neues Thema

hathor 19. Nov 2014 13:09

AW: Joblist - Aufgabenplaner
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir geht's.
Siehe Anhang...

-AUTORUN anklicken
-Programm beenden
-neu booten
-SQLtest startet MIT DB.

AlexII 19. Nov 2014 13:16

AW: Joblist - Aufgabenplaner
 
Zitat:

Zitat von hathor (Beitrag 1280331)
Bei mir geht's.
Siehe Anhang...

-AUTORUN anklicken
-Programm beenden
-neu booten
-SQLtest startet MIT DB.

Und wie sieht Dein Eintrag in der Registry aus? Kannst Du mir de SourceCode schicken?

hathor 19. Nov 2014 14:34

AW: Joblist - Aufgabenplaner
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist die mitgelieferte Demo - etwas erweitert:

Delphi-Quellcode:
unit Main;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Registry;

type
  TForm1 = class(TForm)
    Panel_Actions: TPanel;
    Memo_Result: TMemo;
    Button_DB_Create: TButton;
    Button_DB_Read: TButton;
    Button1: TButton;
    cbAutoRun: TCheckBox;
    Button2: TButton;
    procedure Button_DB_CreateClick(Sender: TObject);
    procedure Button_DB_ReadClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses
  SQLite3, SQLite3Wrap;

{$R *.dfm}

function CreateAutorunEntry(const AName, AFilename: String; active: Boolean): Boolean;
var
 Reg: TRegistry;
begin
 Reg := TRegistry.create;
 try
     Reg.Rootkey:= HKEY_CURRENT_USER;
     Reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', True);
     if active = true then
     Reg.WriteString(AName, AFilename)
     else
     Reg.DeleteValue(AName);
 finally
   Reg.Free;
   Result := true;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
cbAutoRun.Checked:= CreateAutorunEntry(Application.Title, ParamStr(0),true);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
cbAutoRun.Checked:= not CreateAutorunEntry(Application.Title, ParamStr(0),false);
end;

procedure TForm1.Button_DB_CreateClick(Sender: TObject);
var
  DB: TSQLite3Database;
  Stmt: TSQLite3Statement;
  IDs: array[1..6] of Integer;
begin
  // Delete database if it already exists
  DeleteFile(ExtractFilepath (Application.ExeName) + 'artists.db');

  // Create database and fill it with example data
  Screen.Cursor := crHourGlass;
  DB := TSQLite3Database.Create;
  try
    DB.Open(ExtractFilepath (Application.ExeName) + 'artists.db');

    // Create table "artists"
    DB.Execute('CREATE TABLE artists (name TEXT, born REAL, died REAL)');

    // Fill the table with artists
    Stmt := DB.Prepare('INSERT INTO artists (name, born, died) VALUES (?, ?, ?)');
    try
      Stmt.BindText (1, 'Leonardo da Vinci');
      Stmt.BindDouble(2, EncodeDate(1452, 4, 15));
      Stmt.BindDouble(3, EncodeDate(1519, 5, 2));

      Stmt.StepAndReset; // StepAndReset executes a prepared statement
                         // and resets it so we can reuse it again

      IDs[1] := DB.LastInsertRowID; // Save newly added artist's ID to use it
                                    // when filling "paintings" table below

      Stmt.BindText (1, 'Raphael');
      Stmt.BindDouble(2, EncodeDate(1483, 3, 28));
      Stmt.BindDouble(3, EncodeDate(1520, 4, 6));
      Stmt.StepAndReset;
      IDs[2] := DB.LastInsertRowID;

      Stmt.BindText (1, 'Arkhip Kuindzhi');
      Stmt.BindDouble(2, EncodeDate(1842, 1, 27));
      Stmt.BindDouble(3, EncodeDate(1898, 7, 24));
      Stmt.StepAndReset;
      IDs[3] := DB.LastInsertRowID;

      Stmt.BindText (1, 'Nicholas Roerich');
      Stmt.BindDouble(2, EncodeDate(1874, 10, 9));
      Stmt.BindDouble(3, EncodeDate(1947, 12, 13));
      Stmt.StepAndReset;
      IDs[4] := DB.LastInsertRowID;

      Stmt.BindText (1, 'Ivan Aivazovsky');
      Stmt.BindDouble(2, EncodeDate(1817, 7, 29));
      Stmt.BindDouble(3, EncodeDate(1900, 5, 5));
      Stmt.StepAndReset;
      IDs[5] := DB.LastInsertRowID;

      Stmt.BindText (1, 'Ivan Shishkin');
      Stmt.BindDouble(2, EncodeDate(1832, 1, 25));
      Stmt.BindDouble(3, EncodeDate(1898, 3, 20));
      Stmt.StepAndReset;
      IDs[6] := DB.LastInsertRowID;
    finally
      Stmt.Free;
    end;

    // Create table "paintings"
    DB.Execute('CREATE TABLE paintings (title TEXT, year INTEGER, artist INTEGER)');

    // Fill the table with paintings info
    Stmt := DB.Prepare('INSERT INTO paintings (title, year, artist) VALUES (?, ?, ?)');
    try
      // Leonardo da Vinci
      Stmt.BindText(1, 'The Virgin and Child with St. Anne');
      Stmt.BindInt (2, 1508);
      Stmt.BindInt (3, IDs[1]);
      Stmt.StepAndReset;

      Stmt.BindText(1, 'Mona Lisa');
      Stmt.BindInt (2, 1519);
      Stmt.BindInt (3, IDs[1]);
      Stmt.StepAndReset;

      // Raphael
      Stmt.BindText(1, 'Sistine Madonna');
      Stmt.BindInt (2, 1514);
      Stmt.BindInt (3, IDs[2]);
      Stmt.StepAndReset;

      Stmt.BindText(1, 'Transfiguration');
      Stmt.BindInt (2, 1520);
      Stmt.BindInt (3, IDs[2]);
      Stmt.StepAndReset;

      // Arkhip Kuindzhi
      Stmt.BindText(1, 'After a rain');
      Stmt.BindInt (2, 1879);
      Stmt.BindInt (3, IDs[3]);
      Stmt.StepAndReset;

      Stmt.BindText(1, 'Elbrus');
      Stmt.BindInt (2, 1895);
      Stmt.BindInt (3, IDs[3]);
      Stmt.StepAndReset;

      // Nicholas Roerich
      Stmt.BindText(1, 'To Kailas. Lahul');
      Stmt.BindInt (2, 1932);
      Stmt.BindInt (3, IDs[4]);
      Stmt.StepAndReset;

      Stmt.BindText(1, 'Krishna');
      Stmt.BindInt (2, 1929);
      Stmt.BindInt (3, IDs[4]);
      Stmt.StepAndReset;

      // Ivan Aivazovsky
      Stmt.BindText(1, 'The Mary Caught in a Storm');
      Stmt.BindInt (2, 1892);
      Stmt.BindInt (3, IDs[5]);
      Stmt.StepAndReset;

      Stmt.BindText(1, 'Brig "Mercury" Attacked by Two Turkish Ships');
      Stmt.BindInt (2, 1892);
      Stmt.BindInt (3, IDs[5]);
      Stmt.StepAndReset;

      // Ivan Shishkin
      Stmt.BindText(1, 'Morning in a Pine Forest');
      Stmt.BindInt (2, 1889);
      Stmt.BindInt (3, IDs[6]);
      Stmt.StepAndReset;

      Stmt.BindText(1, 'Wood Distances');
      Stmt.BindInt (2, 1884);
      Stmt.BindInt (3, IDs[6]);
      Stmt.StepAndReset;
    finally
      Stmt.Free;
    end;

    ShowMessage('Database created.');
  finally
    DB.Free;
    Screen.Cursor := crDefault;
  end;
end;

procedure TForm1.Button_DB_ReadClick(Sender: TObject);
var
  DB: TSQLite3Database;
  Stmt_Artists,
  Stmt_Paintings: TSQLite3Statement;
begin
  if not FileExists(ExtractFilepath (Application.ExeName) + 'artists.db') then
  begin
    ShowMessage('The database does not exist. Please create one.');
    Exit;
  end;

  DB := TSQLite3Database.Create;
  try
    DB.Open(ExtractFilepath (Application.ExeName) + 'artists.db');

    // Show all artists and their paintings
    Stmt_Artists := DB.Prepare('SELECT rowid, name, born, died FROM artists ORDER BY born');
    Stmt_Paintings := DB.Prepare('SELECT title, year FROM paintings WHERE artist = ? ORDER BY year');
    try
      while Stmt_Artists.Step = SQLITE_ROW do
      begin
        Memo_Result.Lines.Add(Stmt_Artists.ColumnText(1));
        Memo_Result.Lines.Add(DateToStr(Stmt_Artists.ColumnDouble(2)) + ' - ' + DateToStr(Stmt_Artists.ColumnDouble(3)));

        Memo_Result.Lines.Add('paintings:');
        Stmt_Paintings.BindInt(1, Stmt_Artists.ColumnInt(0));
        while Stmt_Paintings.Step = SQLITE_ROW do
          Memo_Result.Lines.Add('   ' + Stmt_Paintings.ColumnText(0) + ' (' + Stmt_Paintings.ColumnText(1) + ')');
        Stmt_Paintings.Reset;

        Memo_Result.Lines.Add('');
      end;
    finally
      Stmt_Paintings.Free;
      Stmt_Artists.Free;
    end;
  finally
    DB.Free;
  end;

  // Add separator
  Memo_Result.Lines.Add('------------------------------------------------');
  Memo_Result.Lines.Add('');
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Button_DB_ReadClick(Self);
end;

end.

AlexII 19. Nov 2014 14:41

AW: Joblist - Aufgabenplaner
 
Danke Dir, ich habe es jetzt selber gelöst. -> hier


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz