![]() |
Kleine Adress-Datenbank
Liste der Anhänge anzeigen (Anzahl: 3)
Ich hatte hier schon mal eine Adress-Datenbank vorgestellt. Dies ist nun die nachfolge Version der Adress-Datenbank. Ich hhabe mich dazu entschlossen sie von Grund auf neu zu programmieren, weil ich mittlerweile meine alten Code schrecklich fand und weil mir die Oberfläche zu groß war. Noch sind nicht alle Features der alten Version implementiert. So fehlt noch der Upload der XML-Datei mit den Kontakten und die Möglichkeit die Kontakte auszudrucken. Sprich es gehen nur die grundlegenden Funktionen einer Adress-Datenbank:
- Kontakt anlegen - Kontakt löschen - Kontakt editieren - Kontakte filtern Ich habe versucht die Oberfläche möglichst minimalistisch zu halten. Sie besteht nur aus einer Listbox und einer Toolbar mit den nötigen Schaltflächen. In der Listbox direkt werden der Name und die Telefonnumer angezeigt, weil ich denke, dass man die Telefonnumer am häufigsten braucht. Die Details zu einem Kontakt lassen sich entweder durch einen Doppelklick auf den Eintrag anzeigen oder durch betätigen der Return-Taste oder über das Kontexktmenü der Listbox. Über das Kontextmenü der Listbox lässt sich der Kontakt auch löschen, was man auch mit der entsprechenden Schaltfläche in der Toolbar machen kann oder über die Tastenkombination [Strg + Entf]. Das Kontextmenü bietet noch die Möglichkeit eine E-Mail an den Kontokt zu schreiben mit dem Standardemailprogramm, wenn mindestens eine E-Mail Adresse hinterlegt ist. Die Kontakte lassen sich auch filtern, wobei der Filter nur stupide nach den eingegeben Buchstaben filtert. Wird also "he" eingegeben, werden alle Kontakte angezeigt, in denen die Buchstabenkombination "he" vorkommt. Die Daten werden in einer XML-Datei im Programmverzeichnis gespeichert. Im Programmverzeichnis deshalb, weil das Programm für meinen USB-Stick gedacht ist. Bis auf das Feld Bemerkung werden alle Daten im Klartext gespeichert. Das Feld Bemerkung wird Base64 codiert, damit man auch Zeilenumbrüche mit speichern kann. Im Anhang das Programm mit Quellcode und ein Screenshot. |
Re: Kleine Adress-Datenbank
Verbesserungsvorschläge:
Outlook Import Tab Möglichkeit bei der Eingabe. |
Re: Kleine Adress-Datenbank
Das Prog sieht erstmal nicht so schlecht aus.
Aber ich würde an deiner Stelle nen Editieren.Icon irgendwo einbauen. Das ist besser so, der User muss dann nicht lange überlegen wie er nun den Eintrag editieren soll. Schließen.Icon würde ich irgendwo rechts setzen. Am besten so: Neu, Editieren, Löschen, Suchen, XMLInfo, Info, Schließen. :thumb: Und XMLInfo ist nicht vollständig wenn noch keine Kontakte abgelegt sind. |
Re: Kleine Adress-Datenbank
Outlook Import? Ach du meine Güte, was verlangst du da von mir?
"Tab Möglichkeit bei der Eingabe", was meinst du damit? Um bei eienm Stringgrid in die nächste Zelle zu kommen, geht das mit den Pfeiltasten. @AlexII: Also das Schließen-Icon war bei allen Anwendungen, die ich bisher gesehen habe immer ganz links. Eine Editier-Schaltfläche. Hm, ist das wirklich nötig? Ich könnte die Schaltfläche "OK" im Detaildialog in "Speichern" umbennen. Zitat:
|
Re: Kleine Adress-Datenbank
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Kleine Adress-Datenbank
Gespeichert wird immer erst, wenn das Programm geschlossen wird. Dann sollten eiegntlich die Informationen vollständig sein.
|
Re: Kleine Adress-Datenbank
Zitat:
|
Re: Kleine Adress-Datenbank
Wie was verlang ich da von dir? Ist doch total einfach:
![]() |
Re: Kleine Adress-Datenbank
Hallo Luckie,
1. Beim Filter die ComboBox als csDropDown umstellen (da soll man ja eh nur von den vorhandenen auswählen, und man braucht nicht das kleine Pfeilchen treffen) 2. Bei Eingabe einer Telefonnummer +49 (3333) 123434 wird in der Liste 49(3333)123434 angezeigt, das ist doof ... 3. Bei der Erstellung eines neuen Kontakts ist der Focus auf dem Schließen-Button, der wäre besser auf der Value-Liste 4. Im Erstellungs-Form wäre es nett die ESC-Taste zum Schließen benutzen zu können 5. Sind Daten im Erstellungsform erfasst/geändert worden, so sollte beim Schließen eine Abfrage kommen (Wirklich Schließen?) Soweit meine Verbesserungsvorschläge. cu Oliver |
Re: Kleine Adress-Datenbank
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Die Änderungen sind noch nicht hochgeladen. Ich will erstmal etwas sammeln. |
Re: Kleine Adress-Datenbank
Wenn du das + in der Telefonnummer nicht mal speicherst, woher weißt du dann das da eins hin muss? :gruebel:
|
Re: Kleine Adress-Datenbank
Zitat:
@Luckie: Da wo ich eine Adresse bearbeiten kann, da sollte man mit ESC dieses Form wieder verlassen können (alternativ zu Klick auf Schließen) cu Oliver |
Re: Kleine Adress-Datenbank
Zitat:
Zitat:
|
Re: Kleine Adress-Datenbank
Zitat:
Gerade für Durchwahlen wird ja das "-"-Zeichen benutzt, was ja auch die Lesbarkeit erhöht. Die internationale Schreibweise für eine Telefonnummer ist ja "+<Ländercode> (<Ortsvorwahl>) <Hauptnummer>[-<Durchwahl>]" cu Oliver |
Re: Kleine Adress-Datenbank
Zitat:
|
Re: Kleine Adress-Datenbank
Zitat:
Delphi-Quellcode:
TelefonNr := StringReplace( TelefonNr, '(', ' (', [ rfReplaceAll ] );
TelefonNr := StringReplace( TelefonNr, ')', ') ', [ rfReplaceAll ] ); |
Re: Kleine Adress-Datenbank
Ja gut, auf die einfachsten Sachen kommt man nicht. :roll:
|
Re: Kleine Adress-Datenbank
Hallo Luckie,
ich finde die Eingabe der Daten nicht wirklich flüssig, als 10-Finger-Schreiber muss ich immer absetzen und die Pfeiltaste nach unten drücken, um zum nächsten Feld zu gelangen. Wenn z.B. nach einem Return der Cursor ins nächste Eingabefeld der Tabelle springen würde, fände ich das besser. Was noch ein tolles Feature wäre: Der User kann sich einmalig eine eigene Struktur der gewünschten Felder definieren. So könnte man das Teil wirklich ganz individuell an sein Bedürfnisse anpassen. Edit: Ich sehe gerade den Code -- die Struktur steckt ja quasi fest in einer Klasse. Da wird eine automatische Anpassung wohl so ziemlich unmöglich werden. Gruß Jürgen |
Re: Kleine Adress-Datenbank
Neue Version hochgeladen mit den Änderungswünschen und Verbesserungsvorschlägen.
@Pfoto: Bei einem Stringgrid ist es Standard, dass man mit den Pfeiltasten in die nächste Zelle gelangt. Und da smit der eigenen Struktur: Das sollte eigentlich nur eine kleine Adressdatenbank für mich sein. ;) |
Re: Kleine Adress-Datenbank
Der Speicher-Button kommt nicht mehr ... und bei "Wollen Sie die Änderungen speichern?" -> Ja wird trotzdem nicht gespeichert
Delphi-Quellcode:
Ist irgendwie auch sinnentleert oder ... da passiert ja nix ... ;)
procedure TDetails.FormClose(Sender: TObject; var Action: TCloseAction);
var ret: DWORD; begin if Modified then begin ret := MessageBox(Self.Handle, PChar(rsModifiedQuery), PChar(rsModifiedCaption), MB_ICONQUESTION or MB_YESNOCANCEL); case ret of ID_YES: Close; ID_NO: begin Modified := False; Close; end; ID_CANCEL: ; // nichts machen end; end; end; ok, ausser bei ID_YES und ID_NO ein DoppelClose (es soll ja eh schon geschlossen werden) bei ID_CANCEL wird nichts gemacht -> das Form wird geschlossen ;)
Delphi-Quellcode:
type
TDetails = class(TForm) Bevel1: TBevel; btnCancel: TButton; // aber wo ist denn btnSave? sgDetails: TStringGrid; StatusBar1: TStatusBar; memBem: TMemo; procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormShow(Sender: TObject); procedure memBemChange(Sender: TObject); procedure sgDetailsSetEditText(Sender: TObject; ACol, ARow: Integer; const Value: string); procedure FormCreate(Sender: TObject); procedure btnCancelClick(Sender: TObject); private { Private declarations } public { Public declarations } IsNewContact: Boolean; Modified: Boolean; // nicht besser als Property? dann könnte man darüber btnSave.Enabled steuern (gut, den gibts ja nicht mehr) end; |
Re: Kleine Adress-Datenbank
Ächtz, wenn man Code blind ohne zu testen an eine andere Stelle kopiert. Sollte gefixt sein. Aktuelle Version im ersten Posting.
Die "Speichern"-Schaltfläche habe ich entfernt, weil sie irgendwie überflüssig geworden ist. |
Re: Kleine Adress-Datenbank
Mal nur so nebenbei ...
wäre es nicht besser, das Modified und NewContact in dem Object TContact zu verwalten?
Delphi-Quellcode:
das macht die Sache doch irgendwie runder ...
type
TMeinObject = class private FModified : Boolean; FIsNew : Boolean; FInfo : string; procedure SetInfo(const Value : string); public property IsNew : Boolean read FIsNew; property Modified : Boolean read FModified; property Info : string read FInfo write SetInfo; procedure Load; constructor Create; end; implementation procedure TMeinObject.SetInfo(const Value : string); begin if FInfo <> Value then FModified := True; FInfo := Value; end; procedure TMeinObject.Load; begin FInfo := 'Daten'; FIsNew := False; FModified := False; end; procedure TMeinObject.Create; begin inherited; FInfo := ''; FIsNew := True; FModified := False; end; cu Oliver |
Re: Kleine Adress-Datenbank
Zitat:
aber der source ist verschwunden ... wieso :mrgreen: |
Re: Kleine Adress-Datenbank
So jetzt sollte es aber funktionieren. Ichhabe es noch mal neu kompiliert und getestet. Der Source ist jetzt auch wieder dabei. Aktuelle Version im ersten Posting.
|
Re: Kleine Adress-Datenbank
Zitat:
Delphi-Quellcode:
... aber bearbeiten geht ...
procedure TfrmAdressen.NewContact;
... Details.ShowModal; if Details.ModalResult = mrOk then // Du hast kein ModalResult mehr!!!
Delphi-Quellcode:
Wundert mich eh, dass du für die Übernahme der Daten aus dem Formular
procedure TfrmAdressen.ShowContactDetails;
... Details.ShowModal; //if Details.ModalResult = mrOK then if Details.Modified then // aha ... hier geändert a) dieses 2x programmiert hast (ist eine typische Fehlerquelle, wie man hier sieht) b) diese Übergabe nicht im Form frmContacts machst Ich hätte an das frmContacts einfach nur das Contact-Object übergeben und nachher zurückverlangt. Dann bleibt der Code für das Anzeigen, bearbeiten und zurückschreiben auch dort wo es passiert, und im Hauptteil reagiere ich einfach nur noch auf das Flag Modified und New. cu Oliver |
Re: Kleine Adress-Datenbank
Zitat:
Zitat:
|
Re: Kleine Adress-Datenbank
Zitat:
Die Referenz auf das Object hat sich ja nicht verändert, nur der Inhalt ;) und darauf kannst du nach dem Schließen reagieren. cu Oliver |
Re: Kleine Adress-Datenbank
Also ich habe es jetzt so:
Delphi-Quellcode:
Nur wie bekomme ich das geänderte Objekt in die ContactCollection? Bisher habe ich ja nur das Objekt geändert, was an der Listbox hängt. Ich müsste die ganze Collection leeren und mit den Objekten der Listbox wieder füllen. Oder gibt es da eine bessere Möglichkeit?
procedure TfrmAdressen.ShowContactDetails;
var Details : TDetails; Contact : TContact; begin if (lbContacts.ItemIndex > -1) then begin Details := TDetails.Create(nil); try Details.Contact := TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]);; Details.ShowModal; if Details.Modified then begin // hier fehlt was ContactCollection.HasBeenModified := True; FillListbox; end; finally Details.Release; end; end; end; |
Re: Kleine Adress-Datenbank
Hat sich erledigt, war Blödsinn.
Anzeigen sieht jetzt so aus:
Delphi-Quellcode:
Undneu sieht so aus:
procedure TfrmAdressen.ShowContactDetails;
var Details : TDetails; Contact : TContact; begin if (lbContacts.ItemIndex > -1) then begin Details := TDetails.Create(nil); try Details.Contact := TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]);; Details.ShowModal; if Details.Modified then begin ContactCollection.HasBeenModified := True; FillListbox; UpdateStatusbar; end; finally Details.Release; end; end; end;
Delphi-Quellcode:
Hast du dir das so gedacht?
procedure TfrmAdressen.NewContact;
var Details : TDetails; Contact : TContact; begin Details := TDetails.Create(nil); try Details.IsNewContact := True; Details.Caption := 'Neuer Kontakt'; Contact := TContact.Create; Details.Contact := Contact; Details.ShowModal; if Details.Modified then begin ContactCollection.Add(Contact); ContactCollection.HasBeenModified := True; FillListbox; UpdateStatusbar; end; finally Details.Release; end; end; Aktuelle Version (1.0.0.27 im ersten Posting. PS: Jetzt sollte es aber klappen. Hmpf. |
Re: Kleine Adress-Datenbank
Ja, jetzt tut es :thumb: (have a close look at my signature)
Nur ist ein neuer Kontakt ein Sonderform vom Editieren (vieles gleich, weniges anders). Diese Funktion würde ich in einer abhandeln, oder Teile in einer eigenen procedure auslagern, dann ist auch bei einer Erweiterung immer gesichert, dass es funktioniert. Aber eine fast ähnliche Abfolge mehr als einmal zu Schreiben finde ich immer lästig und pfui :) |
Re: Kleine Adress-Datenbank
Zitat:
|
Re: Kleine Adress-Datenbank
OK, hier dein Code für einen neuen Kontakt:
Delphi-Quellcode:
und hier für das Bearbeiten:
procedure TfrmAdressen.NewContact;
var Details : TDetails; Contact : TContact; begin Details := TDetails.Create(nil); // Edit, New try Details.IsNewContact := True; // New Details.Caption := 'Neuer Kontakt'; // New Contact := TContact.Create; // New Details.Contact := Contact; // New Details.ShowModal; // Edit, New if Contact.HasBeenModified then // Edit, New begin ContactCollection.Add(Contact); // New ContactCollection.HasBeenModified := True; // Edit, New FillListbox; // Edit, New UpdateStatusbar; // Edit, New end; finally Details.Release; // Edit, New end; end;
Delphi-Quellcode:
jetzt fassen wir das mal zusammen:
procedure TfrmAdressen.ShowContactDetails;
var Details : TDetails; begin if (lbContacts.ItemIndex > -1) then // Edit begin Details := TDetails.Create(nil); // Edit, New try Details.Contact := TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]); // Edit Details.ShowModal; // Edit, New if Details.Contact.HasBeenModified then // Edit, New begin ContactCollection.HasBeenModified := True; // Edit, New FillListbox; // Edit, New UpdateStatusbar; // Edit, New end; finally Details.Release; // Edit, New end; end; end;
Delphi-Quellcode:
Nun ist es eine Funktion :)
procedure TfrmAdressen.EditContactDetails(const IsNew : Boolean );
var Details : TDetails; Contact : TContact; begin if IsNew or (lbContacts.ItemIndex > -1) then begin Details := TDetails.Create(nil); try if IsNew then begin Contact := TContact.Create; Details.Caption := 'Neuer Kontakt'; end else Contact := TContact(lbContacts.Items.Objects[lbContacts.ItemIndex]); Details.IsNewContact := IsNew; Details.Contact := Contact; Details.ShowModal; if Details.Contact.HasBeenModified then begin if IsNew then ContactCollection.Add(Contact); ContactCollection.HasBeenModified := True; FillListbox; UpdateStatusbar; end; finally Details.Release; end; end; end; cu Oliver |
Re: Kleine Adress-Datenbank
Also ich finde da meine Lösung aber etwas übersichtlicher.
|
Re: Kleine Adress-Datenbank
Das kann man auch noch schicker gestalten, wenn man das IsNew-Flag an das Kontakt-Object hängt.
Nur ich betrachte 2 Fälle in einer proc, die sich aber sehr ähnlich sind. btw, ich habe da ein kleines Speicherleck entdeckt ;) wenn ein neuer Kontakt nicht gespeichert wird.
Delphi-Quellcode:
procedure TfrmAdressen.NewContact;
var Details : TDetails; Contact : TContact; begin Details := TDetails.Create(nil); try Details.IsNewContact := True; Details.Caption := 'Neuer Kontakt'; Contact := TContact.Create; Details.Contact := Contact; Details.ShowModal; if Contact.HasBeenModified then begin ContactCollection.Add(Contact); ContactCollection.HasBeenModified := True; FillListbox; UpdateStatusbar; end else Contact.Free; // Wenn nichts eingegeben wurde, dann hängt das hier sonst in der Luft finally Details.Release; end; end; |
Re: Kleine Adress-Datenbank
Hallo Michael,
ich habe gerade mal Deine kleine Adressdatenbank getestet. Die Adressdatenbank ist klein und schnuckelig. Aber ein paar Kritik- und Verbesserungspunktee habe ich trotzdem :
|
Re: Kleine Adress-Datenbank
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Kleine Adress-Datenbank
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Edit : Anhang hinzugefügt. |
Re: Kleine Adress-Datenbank
Ich lasse bisher nur die Anzeige der Telefonnummer in der Listbox formatieren. Gespeichert wird sie wie eingegeben.
Und das mit der TNA konfigurierbar machen, ist mir für die kleine Anwendung zu viel Arbeit. |
Re: Kleine Adress-Datenbank
Die Symbole in der ListBox sehen sehr pixelig aus wenn ein Item markiert ist. Wenn du in der Methode DrawItems dein TIcon weglässt und direkt die Draw-Methode der ImageList verwendest siehts besser aus.
Delphi-Quellcode:
ImgList.Draw(Canvas, Rect.left + 4, Rect.Top + 4, 0, dsTransparent, itImage);
|
Re: Kleine Adress-Datenbank
Mein Delphi 2006 kennt die Bezeichner dsTransparent und itImage nicht, obwohl die Unit Controls eingebunden ist. Und mit
Delphi-Quellcode:
sehe ich keinen großen Unterschied.
Main.frmAdressen.ImageList1.Draw(Canvas, ARect.left + 4, ARect.Top + 4, 6);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz