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. )) |
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. |
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:
Besser wäre es, du würdest einfach einen Boolean übergeben und die ListView.
// 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;
Delphi-Quellcode:
Gruß,
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; Stefan |
AW: Joblist - Aufgabenplaner
Zitat:
|
AW: Joblist - Aufgabenplaner
@-=ZGD=-
Ok, danke für den Tipp. Und sonst alles gut, oder hast Du dir nicht alles angeschaut? |
AW: Joblist - Aufgabenplaner
Apropos doppelter Code. :angel:
Zitat:
Delphi-Quellcode:
In Delphi ist True als 1 definisert und False ist sowieso immer 0, darum ginge das hier.
if MyBoolean then
Result := True else Result := False;
Delphi-Quellcode:
SQLiteQuery1.ParamByName('flag').value := Ord(aClosedOnes);
Aber aus selbem Grund, warum ich ständig drarauf hinweise, daß man
Delphi-Quellcode:
nicht machen sollte, da zwar die Konstante "True" = 1, aber der Zustand "True" <> 0 ist, wäre es so bestimmt sicherer,
if MyBool = True then
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;
|
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) |
AW: Joblist - Aufgabenplaner
Zitat:
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. |
AW: Joblist - Aufgabenplaner
Da fällt mir ein...war True in Delphi nicht -1 - irgendwann mal?
|
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
|
AW: Joblist - Aufgabenplaner
Zitat:
|
AW: Joblist - Aufgabenplaner
Zitat:
Delphi-Quellcode:
// procedure aufrufen
LoadJobslistByStart(True, ListView1); |
AW: Joblist - Aufgabenplaner
Zitat:
|
AW: Joblist - Aufgabenplaner
ok ))
|
AW: Joblist - Aufgabenplaner
Du verwendest in der Prozedur auch immer
Code:
.
ListView1
Du musst
Code:
verwenden, da so der Übergabeparameter/Variable heißt.
aListView
|
AW: Joblist - Aufgabenplaner
Zitat:
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? |
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; |
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:
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.
EDatabaseError
SQLite3Connection1: unable to open database file |
AW: Joblist - Aufgabenplaner
Möglicherweise ist die Datenbank noch nicht verfügbar oder die Anwendung wird in einem anderen Benutzerkontext gestartet
|
AW: Joblist - Aufgabenplaner
Zitat:
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. |
AW: Joblist - Aufgabenplaner
Zitat:
|
AW: Joblist - Aufgabenplaner
Zitat:
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:
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. |
AW: Joblist - Aufgabenplaner
Zitat:
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. |
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; ... |
AW: Joblist - Aufgabenplaner
Zitat:
|
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. |
AW: Joblist - Aufgabenplaner
Zitat:
|
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. |
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