![]() |
savedialog/opendialog
Hallo!
ICh habe ein Address buch geschreieben!, Nun weiß ich nciht wie ich es schaffe, die Daten in eine Datei zu exportieren, und nachher wieder zu öffnen. die Daten sind in einem: eintrag:Array 1..100] of Tdaten; (Tdaten ist ein record!!!); ICh weiß das man den "opendialog" und "savedialog" benutzten muss, aber nicht genau wie! Schoneinmal danke für ihre Bemühungen! |
Re: savedialog/opendialog
Wenn ich mich nicht irre, dann ist in der OH eine Demo dazu (vermutlich unter TOpenDialog/TSaveDialog, oder so)
Du brauchst dazu nur die entsprechende Komponenten auf dein Form ziehen und (ich glaube) mit Execute den gewünschten Dialog aufrufen.
Delphi-Quellcode:
Falls du noch eine bestimmte Dateiendung, oder andere Wünsche hast,
If OpenDialog1.Execute Then Begin
// Daten aus der Datei mit dem Namen in OpenDialog1.Filename auslesen End; dann kanst du dieses direkt im OI einstellen oder vorher noch in OpenDialog.xyz verändern. [add] wenn in dem Array keine Pointer (z.B. lange Strings) vorhanden sind, dann kanst du die Daten z.B. so Speichern.
Delphi-Quellcode:
Var A: Array[1..100] of TDaten;
F: File; AssignFile(F, SaveDialog1.FileName); Rewrite(F); WriteBlock(F, @A, 100 * SizeOf(TDaten)); Close(F)
Delphi-Quellcode:
[add2]
Var A: Array[1..100] of TDaten;
F: File of TDaten; AssignFile(F, SaveDialog1.FileName); Rewrite(F); For i := 1 to 100 do Write(F, A[i]); Close(F); ichbins hat wohl schneller geschrieben, als ich editiert hab :cy: |
Re: savedialog/opendialog
:gruebel: Open- und Savediaolg sind nur Dialoge - wie der Name schon sagt. Du kannst hier nur Dateien und Ordner auswählen, die du Öffnen, bzw. Speichern willst. Um das Speichern/Laden als solches mußt du dich dann schon selber kümmern.
Zitat:
|
Re: savedialog/opendialog
Delphi-Quellcode:
Daten darf keine Strings enthalten. Falls Strings enthalten sind, ersetzte sie durch
//Speichern:
var f:file of tdaten; begin if not savedialog1.execute then exit; assignfile(f,savedialog1.filename); rewrite(f); for i:=1 to 100 do write(f,eintrag[i]); closefile(f); end; //Laden: var f:file of tdaten; begin if not opendialog1.execute then exit; assignfile(f,opendialog1.filename); filemode:=0; reset(f); for i:=1 to 100 do read(f,eintrag[i]); closefile(f); end;
Delphi-Quellcode:
Du kannst genauso darauf zugreifen.
Array[0..255] of char
|
Re: savedialog/opendialog
aha, also man muss nen file nehmen, allerdings wie kann ich dann vom 1. zum 2. datensatz blättern?
beim array macht man edit1.text:=array[1+1].xxx, wei geht das denn bei daten? achso, char ist doch aber nur ein buchstabe oder?
Delphi-Quellcode:
type
TDaten = record vorname, Name, nummer, handyn, ort:string[15]; strasse, email:string[20]; plz, hnummer:string[5]; end; var ake:integer; //Aktueller Eintrag// anze:integer; //Anzahl Einträge// schongespeichert:boolean; eintrag: array1..300] of Tdaten; procedure TForm1.Button3Click(Sender: TObject); //ein eintrag vor begin if anze=ake then begin showmessage('Du zeigst bereits den lezten Eintrag an!'); exit; end else begin evorname.text:=eintrag[ake+1].vorname; ename.text:=eintrag[ake+1].name; enummer.text:=eintrag[ake+1].nummer; ehandy.Text:=eintrag[ake+1].handyn; eHnummer.Text:=eintrag[ake+1].hnummer; eort.text:=eintrag[ake+1].ort; eplz.Text:=eintrag[ake+1].PLZ; estrasse.text:=eintrag[ake+1].strasse; email.Text:=eintrag[ake+1].email; ake:=ake+1; end; end; |
Re: savedialog/opendialog
Zitat:
|
Re: savedialog/opendialog
Char ist nur EIN Buchstabe, aber ein Array of Char nicht :zwinker:
Du kannst aber auch String[100] für einen String mit maximal 100 Zeichen, oder auch Array[1..100] of Char verwenden. Beides kannst du natürlich (dank dem inteligenten Compiler) wie einen normalen String/AnsiString verwenden. Aber du hast ja schon eine passnde StringVariante verwendet, also gibt es da keine Probleme. wenn du den 1. Record in eintrag[1] eingelesen hast, dann springt der FilePojnter automatisch zum nächsten Record, welcher dann natürlich in eintrag[2] reinwandert ... und das geht dann so weiter, bis zum letzten Record ... PS: da du ja ein statisches Array verwendest, kannst du pracktischer Weise das gesammte Array auf einmal Speichern/Laden.
Delphi-Quellcode:
AssignFile(F, ...);
Rewrite(F); BlockWrite(F, @eintrag, 300 * SizeOf(TDaten)); Close(F); AssignFile(F, ...); Reset(F); BlockRead(F, @eintrag, 300 * SizeOf(TDaten)); Close(F); |
Re: savedialog/opendialog
so das sieht jetzt so bei mir aus:
Delphi-Quellcode:
dann kommt immer so ne fehler meldung:"konstantausdruck kann nicht als varparameter weitergegeben werden."
procedure TForm1.Button6Click(Sender: TObject); ///laden
begin AssignFile(F, opendialog1.filename); Reset(F); BlockRead(F, @eintrag, 300 * SizeOf(TDaten)); Close(F); opendialog1.execute; end; procedure TForm1.Button7Click(Sender: TObject); //speichern var I:Integer; //zählvariable begin AssignFile(F, savedialog1.filename); Rewrite(F); BlockWrite(F, @eintrag, 300 * SizeOf(TDaten)); Close(F); schongespeichert:=true; end; achso, wenns was zur sache tut: meine datei soll dann meineDaten.mod heißrn, das hab ich schon bei beiden in som filter und so eingetragen. Mit dem Programm hab ich mich wahrscheinlihc übernommen :wall: :pale: !! zum glück gibts ja euch!! :hello: |
Re: savedialog/opendialog
An welcher Stelle kommt den der Fehler?
Und opendialog1.execute muß vor dem Laden der Daten ausgeführt werden ;) |
Re: savedialog/opendialog
Zitat:
hab dein Code nur mal so schnell überflogen (bald Feierabend ^^) und erstmal gesehen, daß zu speicherst, BEVOR du mit Opendialog1.execute eine Datei auswählst ... (siehe kommentare im code) und beim speicher führst du den Savedialog garnicht aus ... Zitat:
|
Re: savedialog/opendialog
danke, geht trotzdem nimmer!
Delphi-Quellcode:
ciao!
procedure TForm1.Button6Click(Sender: TObject); ///laden
begin opendialog1.execute; AssignFile(F, opendialog1.filename); Reset(F); BlockRead(F, @eintrag, "hier hängt der compiler" 300 * SizeOf(TDaten)); Close(F); end; |
Re: savedialog/opendialog
versuch mal:
Delphi-Quellcode:
PS: will BlockRead überhaupt 'nen Pointer zu den Daten, oder ist das als Var definiert?
Var Size: Integer;
Size := 300 * SizeOf(TDaten); BlockRead(F, @eintrag, Size); |
Re: savedialog/opendialog
laut OH
Delphi-Quellcode:
laut System.pas
procedure BlockRead(var F: File; var Buf; Count: Integer [; var AmtTransferred: Integer]);
Delphi-Quellcode:
function _BlockRead(var f: TFileRec; buffer: Pointer; recCnt: Longint; var recsRead: Longint): Longint;
|
Re: savedialog/opendialog
laut OH
Delphi-Quellcode:
laut System.pas
BlockRead(F, eintrag, 300 * SizeOf(TDaten));
//oder Var R: Integer; // tatsächlich gelesene Bytes BlockRead(F, eintrag, 300 * SizeOf(TDaten), R);
Delphi-Quellcode:
Aber vermutlich weren wohl die OH-Varianten genutzt ... das in System.pas ist nur bestimmt nur die CompilerMagic-Variante (CompilerIntern).
Var R: Integer;
BlockRead(F, @eintrag, 300 * SizeOf(TDaten), R); Also wird das Erste von OH gut passen Ô.o |
Re: savedialog/opendialog
Sorry Leute, acuh so gehts nciht, wenn man das @ weglässt den compiliert es, aber dann versagt er beim speichern, fehlermeldung mit irgendwie EloutError.
Gibts denn da nicht ne andere Möglichkeit, irgendwie, den array in den file schreiben und dann nur den file speichern ohne Parameter? |
Re: savedialog/opendialog
Aber sicher gibt es die :mrgreen:
Nimm eine Collection, die Colection ist dein Array, dann brauchst du eine Itemklasse, die die Daten enthält, und schon ist alles einfacher :mrgreen: |
Re: savedialog/opendialog
hmmm :gruebel:
hab leider kein Delphi hier, um es selber mal zu testen, aber eigentlich sllte es doch funktionieren? Aber du könntest natürlich die Array-Daten in einen anderen Speicher (z.B. einen Stream) kopieren und diesen dann in einer Datei abspeichern. Und Das auslesen dann eben zuerst in den Stream und von dort die Daen zurück ins Array kopieren, aber wie gesagt solle es auch ohne einen derartigen Umweg gehen -.-'' |
Re: savedialog/opendialog
:wiejetzt: :?: :?: :duck: :coder2:
so eine collection, dann muss ich statt array[1..xxx] deien daten:collection[1..xxx]of TDaten deklarieren, und dann collection.item1:=edit1.text; ? oder wie :?: file.write? :?: |
Re: savedialog/opendialog
Collection:
Eine Collection ist eine Klasse. Wie TObjectList zum Beispiel. Die musst du dann erstellen, befüllen, speichern und wieder freigeben. Ersatz für ein Array of String könnte (ungetestet) etwa so aussehen:
Delphi-Quellcode:
TJsCollection & Co gibt's hier:
type
StringItem = class (TCollectionItem) private FStr: String; published property Str: String read FStr write FStr; end; var Coll: TJsCollection; ... // String hinzufügen with Coll.Add as StringItem do Str := 'Mein toller unbegenzter Daten-String'; // löschen usw. weis ich jetzt nicht genau, schau mal in die Hilfe von TCollection // speichern Coll.SaveToFile ('C:\Daten.dat'); // laden Coll.LoadFromFile ('C:\Daten.dat') ![]() Ach, und alci hat da auch ein Tutorial dazu, vielleicht lässt er dich ja mal reingucken ... ;) Gut, ich habs auch noch, aber frag' mal lieber alci ;-) |
Re: savedialog/opendialog
danke!
werde ich gleich mal ausprobieren, das geht hier nämlcih langsam über das in der schule gelernet hinaus! Danke Achso, kann jemand mir ein Buch empfhlen, womit man delphi vernünftig lernen kann? :dp: |
Re: savedialog/opendialog
|
Re: savedialog/opendialog
Hallo,
das ist zwar nicht direkt eine Antwort auf die ursprügliche Frage aber ein Telefonbuch ist doch eigentlich - nicht gleich erschrecken! - eine Datenbankanwendung. Zumindest seit Delphi 6 gibt es das ClientDataset. Schau in deinem Delphi nach, ob es diese Komponente gibt. Damit können solche Lösungen wie dieses Telefonbuch wunderbar gelöst werden. Das Speichen mit ClientDataset.SaveToFile(..) und Laden mit ClientDataset.LoadFromFile(..) ist ganz einfach. Und weiters möchte doch jeder in einem Telfonbuch suchen, sortieren usw. - alles vorhanden und - ich würde sagen - superschnell und kein Server erforderlich. Allerdings wenn man sich damit das erste mal beschäftigt ist sicher für diverse Details die OH zu beanspruchen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 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-2025 by Thomas Breitkreuz