AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Joblist - Aufgabenplaner
Thema durchsuchen
Ansicht
Themen-Optionen

Joblist - Aufgabenplaner

Ein Thema von AlexII · begonnen am 18. Sep 2014 · letzter Beitrag vom 19. Nov 2014
Antwort Antwort
Seite 3 von 3     123   
AlexII
Registriert seit: 28. Apr 2008
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. ))
Miniaturansicht angehängter Grafiken
screenshot.png   db-modell.png  
Angehängte Dateien
Dateityp: zip Joblist-05.zip (2,35 MB, 63x aufgerufen)
Bin Hobbyprogrammierer! Meine Fragen beziehen sich meistens auf Lazarus!

Geändert von AlexII (22. Sep 2014 um 15:11 Uhr)
 
AlexII

 
FreePascal / Lazarus
 
#21
  Alt 18. Nov 2014, 19:48
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.
  Mit Zitat antworten Zitat
Dejan Vu
 
#22
  Alt 19. Nov 2014, 05:05
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 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.

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.
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#23
  Alt 19. Nov 2014, 09:21
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.

Geändert von AlexII (19. Nov 2014 um 09:24 Uhr)
  Mit Zitat antworten Zitat
hathor
 
#24
  Alt 19. Nov 2014, 13:53
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;

...
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#25
  Alt 19. Nov 2014, 13:57
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
  Mit Zitat antworten Zitat
hathor
 
#26
  Alt 19. Nov 2014, 14:09
Bei mir geht's.
Siehe Anhang...

-AUTORUN anklicken
-Programm beenden
-neu booten
-SQLtest startet MIT DB.
Angehängte Dateien
Dateityp: zip SQLtest.zip (809,1 KB, 24x aufgerufen)

Geändert von hathor (19. Nov 2014 um 14:13 Uhr)
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#27
  Alt 19. Nov 2014, 14:16
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?
  Mit Zitat antworten Zitat
hathor
 
#28
  Alt 19. Nov 2014, 15:34
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.
Angehängte Dateien
Dateityp: zip SQLtest-2.zip (841,4 KB, 7x aufgerufen)

Geändert von hathor (19. Nov 2014 um 16:15 Uhr)
  Mit Zitat antworten Zitat
AlexII

 
FreePascal / Lazarus
 
#29
  Alt 19. Nov 2014, 15:41
Danke Dir, ich habe es jetzt selber gelöst. -> hier
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 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