Entwickler-Ecke
Freeware Projekte - Adressbuch
Kaoro-kun - So 20.08.06 01:08
Titel: Adressbuch
Hallo Forenmitglieder,
als wir in der Schule die Aufgabe bekamen, mal etwas sinnvolles zu Programmieren, kam mir die Idee, das Programm auszubauen und zu erweitern.
Daraus ist ein relativ Akzeptables Adressbuch entstanden.
Es arbeitet mit 2 untypisierten Dateien, wobei eine die eingegebenen Daten erfasst, und eine andere die Multiuserfähigkeit garantiert.
Beide Dateien sind im System32 Verzeichnis abgelegt. User.dat für die User, und Adressdatenbank mit dem Namen des Users, als txt. Da sie jedoch untypisiert ist, sind Steuerzeichen enthalten...
Nun zu meiner eigentlichen Bitte:
Ich hätte gern Feedback zu dem Projekt und evtl. Verbesserungsvorschläge von euch.
Regards,
Kao
Edit:Nun ist das Projekt so Modifiziert, das Interne Dateien im Anwendungsdaten-Verzeichnis des Aktuellen Users abgelegt werden.
freak4fun - So 20.08.06 03:08
Was kann ichz jetzt mit der "SuchenUnit.pas" anfangen? Da hste doch bestimmt noch was vergessen. :lol:
MfG
freak
Danniolo - So 20.08.06 04:30
:welcome: Erstmal hallo und herzlich willkommen im DF!
Zu deinem "Programm": also wirklich viel bringen tut das nicht, wenn du einfach nur eine Unit ins Archiv tust!
(Zieh am besten den ganzen Ordner rein, dann is schon alles wichtige dabei - so eben nicht).
Außerdem ist das so wies aussieht die falsche Sparte > Denn wenn der Source bei deinem Programm dabei is gehört das in die Sparte
Open-Source [
http://www.delphi-forum.de/forum_Open+Source+Projekte_28.html]
Kaoro-kun - So 20.08.06 07:40
Guten Morgen,
Also erstmal bedanke Ich mich für die Aufmerksamkeit, da war Ich gestern Nacht wohl ein wenig unaufmerksam...
Nun, Ich las vor dem Post diesen Wichtigen Thread, und hiess es dort nicht, das der Source immer dabei sein muss?
MrSaint - So 20.08.06 11:31
Dateien ins System32 Verzeichnis :shock: Hallo?!? Das werd ich mit Sicherheit nicht testen. Leg die Dateien bitte wo anders ab. Am Besten in den Anwendungsdaten-Ordner.
MrSaint
Kaoro-kun - So 20.08.06 11:44
Inwiefern denn testen? ._.
Zumal die Dateien oben doch genau angegeben sind mit Namen...oder was hast Du da vor?
Traust Du mir tatsächlich zu, Trojaner zu Programmieren? Hast mein Profil wohl noch nicht gelesen. XD
Die Programminternen Dateien habe Ich aus dem Grund nicht im Anwendungsverzeichnis abgelegt, weil es ja durchaus vorkommen kann, das man die .exe auf dem Desktop aufbewahren könnte...das wiederum würde für Unnötige Dateien auf demselben sorgen...zumal Du mit den Internen Dateien als normaler Anwender eh kaum etwas anfangen kannst, da durch die untypisierten Dateien Steuerzeichen für die Enden der Arrayfelder in den Dateien stehen, die man auch nicht einfach so entfernen kann, da das Programm sonst nicht mehr mit ihnen arbeiten kann.
Regards,
Kao
MrSaint - So 20.08.06 11:50
Wahrshceinlich bekommt dein Tool gar keinen Zugriff auf das System32 Verzeichnis, wenn man es nicht als Admin ausführt. Und ins System32 Verzeichnis gehören einfahc keine Dateien von irgendwelchen Programmen. Und mit Anwendungsdaten-Verzeichnis meine Ich C:\Dokumente und Einstellungen\[Username]\Anwendungsdaten\[DeinProgrammName]\. Da gehört das rein und da hast du auch Schreibzugriff... Such ein bisschen im Forum, da sollte es irgendwo eine Funktion geben, die dir diesen Pfad ausspuckt.... Ansonsten gibt es bestimmt was bei den Schweizern.
MrSaint
Kaoro-kun - So 20.08.06 11:54
Hm stimmt...der Pfad ist mir noch nicht eingefallen...werd Ich gleich ändern und als Update editieren. ^^ Vielen Dank für die Info.
Regards,
Kao
MrSaint - So 20.08.06 19:51
So, nu hab ich's kurz ausprobiert:
- Mach im Anwendungsdaten-Ordner doch bitte einen Unterordner für dein Programm und schmeiß die Dateien nicht direkt in den Anwendungsdaten-Ordner... Wenn das jedes Programm so machen würde, hätte man schon lang keinen Überblick mehr...
- Ich kann leere Datensätze anlegen. Warum?
- In der Suchen-Form kann man ion die ComboBox schreiben
- verbesser bitte die diversen Schreibfehler
- wenn ich was ändere, warum wird der Dtaensatz dann aus der Liste gelöscht und ich soll ihn neu hinzufügen (Button-Beschriftung!). Das hat das obskure Ergebnis, dass wenn ich einen Eintrag ändern will, dann aber auf "zurück" gehe, ist der Datensatz weg :shock:
- Wenn ich einen neuen Datensatz anlege, möchte ich auch mit <ENTER> bestätigen können und mit <ESC> abbrechen (schau dir mal Default und Cancel von den Buttons an, die machen genau das...)
- Was ist das für eine ProgressBar unten rechts? die sieht komisch aus.. Und was macht die?
- wieso ist Datensatz hinzufügen ein Button und nicht im Hauptmenü unter Adressen? Da gehört das auf jeden Fall auch hin!
Das ist mir bisher aufgefallen...
MrSaint
Kaoro-kun - Mo 21.08.06 08:42
Also, das mit dem Ändern hab Ich bisher nicht anders hinbekommen, leider... :(
Zudem war Ich bei der Umsetzung der Möglichkeit, Datensätze zu Ändern, zu Faul, extra ein Formular zu erstellen, sodass Ich einfach das, zum Hinzufügen nutzte. Lässt sich aber auch noch Ändern. :angel:
Die Möglichkeit leere Datensätze anzulegen hab Ich mir während der Entwicklungszeit gelassen, um zu sehen, ob kleinere Feinheiten im Programm so funzen, wie geplant...wie genau Ich das verhindern kann, obwohl die Möglichkeit bleiben muss, Felder auszulassen, fällt mir im Moment nur Teilweise ein:
Wenn Ich eine If-Abfrage Formuliere, die prüft, ob die Summe der Texte '' ist, müsste Ich doch verhindern können, das leere Datensätze hinzugefügt werden, oder?
An die Sache mit der Kombobox hab Ich gar nicht gedacht. :shock:
Bei den Edits, mit dem Enter und dem Esc - nach dieser Möglichkeit hab Ich mir die Augen Blindgesucht, aber beim Lesen nichts gefunden, was mir hätte helfen können, dein Tipp hat mir da nachgeholfen, vielen Dank.
[Edit]: Je nachdem, welchem Button Ich das Default True setze, trägt er sofort ein, oder er schliesst's Fenster...wie bitte mach Ich, das er im Edit weiterspringt?! :autsch:
Der Progressbar dient der Optischen Unterstützung...da Ich durch bisher mangelnde Kenntnisse die Datenbankgröße auf 1000 Datensätze eingeschränkt hab, wird die Fülle durch den Progressbar angezeigt. Label und ProgressBar zeigen so Anschaulicher, wieviel Datensätze man hat. Auch das war ein Nebeneffekt meiner Kontrollen bei der Entwicklung...
Den HinzufügenButton nur im Formular fand Ich angenehmer, da man meist eher die Maus bewegt, wenn das Programm schon Offen ist, aber der Vorschlag mit dem Hautpmenü wird kein Problem. :)
[Edit]: Als Ich versucht hab, deine gewünschten Verzeichnisänderungen durchzuführen, erhielt Ich am Anfang die Meldung "Ungültiger Dateiname" und den E/A-Fehler 102. Die Fehler waren mir bekannt, aber Ich wusste nicht warum, da Ich davon ausging, das Delphi nicht vorhandene Ordner selbst erstellt.
Tut es aber nicht. :autsch: Wie veranlasse Ich Delphi, Ordner zu erstellen?
mit Dank für's Feedback,
Kao
Kaoro-kun - Mo 21.08.06 13:01
Also...
Das mit dem Verzeichnis, mit der ComboBox, mit den Menü, und der Möglichkeit leere Datensätze zu schreiben ist geklärt.
Fehlen noch die Editfelder mit Enter und das mit dem Ändern... ._.
Regards,
Kao
Kaoro-kun - Mo 21.08.06 18:05
Also JETZ kam was Geiles...
Ich wollte also dieses Datensatz ändern machen...
Und nehm dazu über ALT+F12 den Inhalt meiner Datensatz hinzufügen Form und Kopier das in das neue Formular...
Nachdem Ich erstma das Gehacke mit den ganzen Namen beendet hatte, damit es überhaupt startet, das Programm, will Ich diese Kopierte Formular aufrufen...
Und bekomme eine Fehlermeldung mit ner Zugriffsverletzung irgendwas bla bla... ._.
WAS mach Ich FALSCH? Und außerdem muss Ich noch die Sache mitm genauen Ändern klären und wie Ich das nu mit den Edits mach, das es da weiter geht...wäre Nett, wenn mir da jemand helfen könnte...
Regards,
Kao
JayEff - Di 22.08.06 16:18
Um das herauszufinden brauchen wir entweder deinen Source oder ich muss mal wieder meine Kristallkugel polieren.. :gruebel: bin aber zu faul dafür. Ausserdem würde das in einen neuen Post gehören, nicht in Freeware. Ausserdem solltest du den Editknopf benutzen ^^ Ok genug ausserdems. ich werd mal eben dein Programm mir anschaun tun (Meine deutschlehrerin wird mich töten :D ) und mein Urteil dazu abgeben tun. Nach dem testen tu ich den Post hier mal editieren.
Ausserdem hast du ja den Source in deinem Archiv - Dann gehörts mehr in Open Source. Was du gemeint hast:
Tino: |
Die Programm- bzw. Komponenten-Sourcen müssen mitgeliefert werden*
* = Nur bei Open-Source-Projekte |
In den Sparten Freeware und Opensource sind die Announcements die selben - der Stern gilt eben nur für OpenSource.
Edit: Ganz nett soweit, nur warum zum Teufel finde ich den Benutzernamen Löschen Button im Readme?? Is das da nicht ein BISSCHEN fehl am platze? Ausserdem würd ich einfach alle Buttons die du da so hast ins TMainMenu machen... Ist immer nett, wenn man etwas auf 2 verschiedene Arten machen kann :D
btw mir ist ne verbesserung für mein Programm eingefallen... Ich werd meine Daten mal demnächst mit ner typisierten Datei speichern - ist a) Platzsparender und b) Speicherplatzmäßig unbegrenzt.
Kaoro-kun - Di 22.08.06 17:07
UNbegrenzt ist es nicht, mein unbekannter Freund...
Du scheinst zu Vergessen, das Du bei untypisierten Dateien ein Array brauchst, das Du Begrenzen MUSST. ;)
Aber die Begrenzung selbst ist ein wenig Breiter als bei Variablen... +g+
Regards,
Kao
JayEff - Di 22.08.06 20:03
...Äh? Was genau meinst du ... ? Ich kann zwar keine Strings speichern, wohl aber String[500] o.ä. ...
Ich weis nich wies dir geht, aber ich sehe kein Ende, ab dem ich mit write(f, einRecord); keine neuen Datensätze mehr anlegen kann ... :(
Ach und:
JayEff hat folgendes geschrieben: |
| Ich werd meine Daten mal demnächst mit ner typisierten Datei speichern. |
Wer sagt was von untypisiert? oO
Blackheart666 - Di 22.08.06 21:08
Ist aber schon nicht schlecht für zwei Programme die kein Mensch braucht sich dermaßen in die Ha.... naja Ihr wisst schon was Ich mein..
Kaoro-kun - Di 22.08.06 23:30
Ehrlich gesagt? Nein, weiss Ich nicht.
Und JayEff, sry, hatte mich wohl Verlesen...Ich jedenfalls schreib ja in Untypisierte, da bin Ich ja theoretisch gezwungen, die Arrays zu begrenzen...
Regards,
Kao
JayEff - Di 22.08.06 23:51
Blackheart666 hat folgendes geschrieben: |
| Ist aber schon nicht schlecht für zwei Programme die kein Mensch braucht sich dermaßen in die Ha.... naja Ihr wisst schon was Ich mein.. |
Ähem -
ICH brauche mein Programm. Darum hab ichs geschrieben (hälst du mich - tut mir leid wenn mir kein besseres Wort einfällt - für blöd?). Wie auch in der Beschreibung meines Threads angegeben, habe ich das Programm genau auf meine Bedürfnisse angepasst und vollständig zur Erweiterung freigegeben.
Wir haben uns nicht in die Haare gekriegt oder was auch immer du sagen wolltest - wir haben lediglich über die Effizienz diverser Programmierstile bzw. Datenverarbeitungsarten gesprochen, tut mir Leid, wenn das nicht zu dir durchgedrungen ist.
Falls du fachlich passende Kommentare zum Thema verfassen willst, schreib das bitte hier, ansonsten würde sich das DF Team glaube ich am ehesten über PNs freuen. Danke.
@ Kaoro-kun:
ich hab keine Ahnung von untypisierten Dateien. Ich glaub ich sollte mir deinen Source doch mal genauer ansehen ;) Mal sehn was die so bringen...
Kaoro-kun - Mi 23.08.06 00:19
Untypisierte Dateien haben ihre Vor- und Nachteile...Du musst im Grunde einen eigenen Typen erstellen.
Sprich, Du wählst für jedes deiner Datenteile einen Namen aus. Wie Ich bei mir eben Telefonnummer usw...
Hat den nachteil, Du musst die einzelnen Felder einschränken. Sprich, für Namen bspw. 10 Zeichen.
Da sie untypisiert - weil Du sie ja erst festgelegt hast - sind, brauchen sie ein Array.
Heisst, eine Variable mit Platz für jedes deiner Felder.
Das - finde Ich - Komplizierte dabei ist, Du musst, wenn Du später die Daten in das Array liest, jedes einzelne Feld ansprechen, dazu unten ein Beispiel. Willst Du nun aber in die Datei speichern, sprichst Du nicht mehr die einzelnen Felder an, sondern gleich den ganzen Satz...klingt Komplex, hat aber auch so seine Vorteile, weil man Übersicht behält, und es so ausserdem gezielt ausgeben kann. +g+
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type meintyp=record meinfeld:string[10]; deinfeld:integer[10]; end;
var a:array [1..10] of meintyp; i:integer; f:file of meintyp; Begin a[1].meinfeld:=edit1.text; a[1].deinfeld:=StrToInt(edit2.text); |
geht auch mit:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| with a[1] do Begin meinfeld:=edit1.text; deinfeld:=StrToInt(edit2.text); end; reset(f); for i:=0 to filesize(f)-1 do write(f,a[i]); closefile(f); |
JayEff - Mi 23.08.06 03:13
Sorry dich zu korrigieren, aber das IST eine typisierte datei.
Du hast eine Datei (
file) vom Typ MeinTyp (
of meintyp), und du kannst problemlos unendlich viele Datensätze hineinschreiben:
write(f, datensatz); kannst du ja so oft ausführen, wie du willst, bevor du die datei mit CloseFile schließt. Ausserdem kannst du alle Datensätze lesen mit:
Delphi-Quelltext
1:
| for i:=0 to FileSize(f)-1 do read(f, meintypArray[i]); |
Die einzige Beschränkung stellt MaxInt dar. du kannst nur MaxInt an Datensätzen speichern, da die For-Schleife nen Integer will, glaub ich.
Kaoro-kun - Mi 23.08.06 05:56
Du bedenkst aber nicht die Einschränkung der Typintegrierten Variablen bzw des Arrays...
Das MUSS ja irgendwo nen Haltepunkt haben, und wenn der Überschritten ist, wird weder gelesen noch gespeichert...sicher, die For-Schleife ist dahingehend sehr Variabel, aber das Array irgendwann nicht mehr...so sehe Ich das zumindest.
Regards,
Kao
MrSaint - Mi 23.08.06 09:40
Stichwort variable Arrays ;) Es ist nicht wirklich beschränkt. Nur wenn dir der Speicher auf dem Rechner ausgeht (oder eben bei MAX_INT)...
MrSaint
Kaoro-kun - Mi 23.08.06 12:42
Also Ich bekam immer Fehlermeldungen, wenn Ich weder die Felder noch das Array einschränken wollte. ._.
Regards,
Kao
JayEff - Mi 23.08.06 17:28
Beschränke das Array doch so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| var AnArray: Array of TMyRecord; f: file of TMyRecord; begin AssignFile(f, FileName); Reset(f); SetLength(AnArray, FileSize(f)); SetLength(AnArray, Length(AnArray)+1); for i:=0 to FileSize(f)-1 do Read(f, AnArray[i]); CloseFile(f); end; |
Das ganze ist ein Dynamischer Array und seine Größe lässt sich jederzeit variieren. Du siehst: Du kannst write(f, xx) so oft ausführen, wie du grade Lust dazu hast bzw. so oft, wie der Record auf deine Festplatte passt. Folglich ist die Größe tatsächlich nur vom verfügbaren Speicherplatz begrenzt.
Falls du immernoch Probleme hast, schreib uns :gruebel: kann mir kaum vorstellen, dass das nicht geht.
PS: Eine untypisierte Datei ist folgendes:
var f: file; du siehst, du arbeitest mit einer typisierten ^^
Kaoro-kun - Mi 23.08.06 17:32
Hm...erstmal muss Ich mich für den Tipp bedanken.
Wobei Ich da eine Frage hab...dieses Setlength da zwischendrin...das +1 bringts ja net wirklich, aber könnte Ich nicht auch irgendwo zwischendrin eine If-Abfrage so ähnlich Formulieren? Oder könnte Ich es nicht dauerhaft so einrichten, das er das Array immer so groß macht wie die Datei? Also Ich meine, das das Array immer dann größer wird, wenn die Datei auch größer wird? Oder muss Ich da sozusagen einen Moment "abpassen"?
Was die Typisierung angeht, da muss Ich wohl in der Schule was verwechselt haben... :oops:
Aber kommen wir zu dem Problem, was dieses Update für mich so Unmöglich macht; das Datensatz ändern.
Ich habe, denke Ich, eine Lösung gefunden, wie Ich den Datensatz, der in der Listbox gefiltert wird, aus dem Array herauszulesen, und in die Edits zu schreiben, dennoch wird immer wieder der erste Datensatz in die Edits gesetzt..Ich habs 2, 3 mal mit Einzelschrittabarbeitung probiert und sehe keinen Fehler...Ich will mal sehen, das Ich weiter unten die relevanten Quelltexte kopiere, vielleicht findet ihr ja den Fehler...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| procedure TForm6.FormActivate(Sender: TObject); begin Form1.Enabled:=false; c:=form1.listbox.ItemIndex; read(f,a[c]); edit1.Text:=a[c].name; edit2.Text:=a[c].vorname; edit3.Text:=a[c].telefon; edit4.text:=a[c].strasse; edit5.text:=a[c].ort; edit6.Text:=a[c].plz; edit7.Text:=a[c].mail; end;
procedure TForm6.FormActivate(Sender: TObject); begin Form1.Enabled:=false; c:=form1.listbox.ItemIndex; read(f,a[c]); edit1.Text:=a[c].name; edit2.Text:=a[c].vorname; edit3.Text:=a[c].telefon; edit4.text:=a[c].strasse; edit5.text:=a[c].ort; edit6.Text:=a[c].plz; edit7.Text:=a[c].mail; end; |
c ist die Integer, die den Listbox.Itemindex aus der Hauptform übergibt, damit Ich den Markierten Datensatz aus dem Array lesen kann. Bei den Einzelschritten hat C immer den richtigen Wert, und eine weile auch das Array den richtigen Datensatz drinstehen, aber irgendwann mittendrin ändert es den Inhalt auf den ersten Datensatz... :autsch:
Regards,
Kao
JayEff - Mi 23.08.06 17:39
Nun, dazu ist das Setlength ja da. Immer wenn du write aufrufst, vergrößerst du den Array um 1. also ein etwa so:
Delphi-Quelltext
1: 2: 3: 4:
| write(f, MyRecord); SetLength(AnArray, high(AnArray) + 1); AnArray[high(AnArray)].a:=MyRecord.a; AnArray[high(AnArray)].b:=MyRecord.b; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!