![]() |
problem mit felddatenspeicherung
hay,
ich hab mal versucht eine funktion in ein programm einzubauen, dass die eingaben speichern und öffnen kann. da ich etwas nicht allzu schweres verwenden will hab ich ich mich für die ini-files entschieden. natürlich hab ich gleich mal die SuFu gestartet und ich habe auch etwas gefunden unter anderem auch ein link zu nem tut. dann hab ich mal begonnen. zuerst hab ich die unit für die ini-files reingehauen und dann diesen code geschrieben:
Delphi-Quellcode:
der sollte ja eigentlich so was in die datei schreiben:
procedure TForm1.Button4Click(Sender: TObject);
var ini: TIniFile; begin ini:=TIniFile.create(ExtractFilePath(Application.exename)+Edit1.Text+'.btc'); ini.free; ini.WriteString('Programm:','Edit1.Text',Edit1.Text); end; Zitat:
mfG toredo |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var ini: TIniFile; begin ini:=TIniFile.create(ExtractFilePath(Application.exename)+Edit1.Text+'.btc'); ini.free; // <------------- ini.WriteString('Programm:','Edit1.Text',Edit1.Text); ini.free; <-- wenn, dann passt es hier hin. end; Du gibst die Instanz ja direkt wieder frei und wenn Du dann in das ini etwas hineinschreiben willst, gibt es die Instanz nicht mehr. Grüße Klaus |
Re: problem mit felddatenspeicherung
hay,
thx, ich dachte das muss ich schon nach dem erstellen der datei machen damit sie freigegeben wird um was reinzuschreiben... weisst du zufälligerweise auch grade wie ich bei ner ini einen kommentar hinzufügen kann? mfG toredo |
Re: problem mit felddatenspeicherung
Hallo,
Du zerstörst Ini in der zweiten Zeile und willst dann in der dritten auf etwas, was nicht mehr da ist zugreifen? Das kann nicht funktionieren ;) |
Re: problem mit felddatenspeicherung
mit TIniFile kann man meines Wissens keine Kommentare in das iniFile einfügen.
Grüße Klaus |
Re: problem mit felddatenspeicherung
so, ich bin jetzt wieder ein bissel weitergekommen:
beim lesen hab ich noch ein kleines problem:
Delphi-Quellcode:
eigentlich sollte das doch gehen, aber bei der zeile, bei der der feldinhalt für Edit1.Text gelesen wird funzt irgendwas nicht, was ich auch versteh weil die zeile auch nicht so richrig aussieht, aber ich find dne fehler nicht:s
procedure TForm1.Button5Click(Sender: TObject);
var ini: TIniFile; begin try form1.left:=ini.ReadString('Programmname:','Edit1.Text',Edit1.Text); finally ini.free; end; end; dann hab ich noch ne frage. ich konnte ja die ini-files bisher nicht lesen aber schreiben, und ich hab da so ein RichEdit-Feld auch in die ini schreiben lassen, da hat der text aber etwa 10zeilen wenn nicht sogar noch mehr. wenn ich das speichere gibts sowas: Zitat:
mfG toredo |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
Hast vergessen, die ini Instanz zu erstellen.
procedure TForm1.Button5Click(Sender: TObject);
var ini: TIniFile; begin try ini := TIniFile.create(....); // <---------------- form1.left:=ini.ReadString('Programmname:','Edit1.Text',Edit1.Text); finally ini.free; end; end; Das mit dem Richedit weiß ich nicht, ob Du das wieder wie gewünscht einlesen kannst. Musst es halt ausprobieren. Grüße Klaus |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
bei der zeile, bei der die variable gelesen werden sollte, kommt beim kompilieren "incompatible types: integer and string"...
procedure TForm1.Button5Click(Sender: TObject);
var ini: TIniFile; begin try ini := TIniFile.create(....); form1.left:=ini.ReadString('Programmname:','Edit1.Text',Edit1.Text); finally ini.free; end; end; aber eigentlich ist da ja gar kein integer. und beim auslesen hab cih noch en kleine frage, wieso muss ich wenn ich etwas lesen möchte drei dinge in die klammer schreiben, eigentlich solten zwei doch genügen: 1.um zu dem richtigen klammerteil ([w]) zu gelangen 2.um den variablennamen anzugeben, um bei der richtigen variable den wert zu holen. mfG toredo |
Re: problem mit felddatenspeicherung
Hallo toredo,
die Online-Hilfe ( ![]() Gruß Hawkeye |
Re: problem mit felddatenspeicherung
Zitat:
Für Integerwerte gibt es WriteInteger und ReadInteger Zitat:
Grüße Klaus |
Re: problem mit felddatenspeicherung
danke, ich habs jetzt endlich geschafft/verstanden.
danke für die gute und sehr schnelle hilfe mfG toredo -edit- etwas hab cih doch noch nicht geschafft... ich kann den richedit-text nicht abspeichern. gibt es da noch en möglichkeit ihn in die gleiche datei zu machen oder muss man ne zweite datei nehmen? mfG toredo |
Re: problem mit felddatenspeicherung
wenn Du den Richedit in ein TStream packen kannst,
solltest Du WriteBinaryStream und ReadBinaryStream verwenden können. Grüße Klaus |
Re: problem mit felddatenspeicherung
öhm, und wie kann ich den richedit in einen tstream packen?
mfG toredo |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
wobei ts vom Typ TStream istts := TStream.Create; // stream Instanz erzeugen Richedit1.PlainText:=false; // Textatribute werden mit in den Stream genommen RichEdit1.Lines.SaveToStream(ts); // Richedit wird in dem stream gespeichert // sichere den Stream in der ini Datei ts.Free; // stream Instanz freigeben Grüße Klaus |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
hm, es kommt eine fehlermeldung bei der zeile, bei der der code in die ini geschrieben werden sollte...
ts := TStream.Create;
Richedit2.PlainText:=false; RichEdit2.Lines.SaveToStream(ts); ini.WriteBinaryStream('1Beschreibung:','ts',ts); ts.free ini.free; mfG toredo |
Re: problem mit felddatenspeicherung
Zitat:
|
Re: problem mit felddatenspeicherung
wenn ich beim proggi auf den button klicke kommt eine fehlermeldung auf der was von stop oder so steht udn dan springe ich in dem "code"-editor auf die zeile, bei der gespeichert wird udn unten steht das:
Constructing instance of 'TStream' containing sbstract method 'TStream.Read' Constructing instance of 'TStream' containing sbstract method 'TStream.Write' mfG toredo |
Re: problem mit felddatenspeicherung
Korrektur:
ts sollte TMemoryStream sein, vor dem Speichern des ts in die IniDatei ts.position auf 0 setzen. bei TStream ist die read und write Methode abstract und muss so weit ich es weiß überschrieben werden. Grüße Klaus |
Re: problem mit felddatenspeicherung
ok, das speichern funzt jetzt:)
thx:) und wie kann ich das ganze wieder öffnen? mfG toredo |
Re: problem mit felddatenspeicherung
Online Hilfe lesen und ReadBinaryStream finden
und bei Richedit loadfromStream. Grüße Klaus |
Re: problem mit felddatenspeicherung
welche online-hilfe?
mfG toredo |
Re: problem mit felddatenspeicherung
nun, wenn Delphi installiert ist, ist in der Regel auch eine Hilfe dabei.
Grüße Klaus |
Re: problem mit felddatenspeicherung
ja das schon, nur ich dachte weil du was von ner online-hilfe gesagt hast, dass die hilfe halt online ist und end beim proggi selbst...
und mein delphi is auch englisch und da hab ich nur folgendes rausgekriegt: Zitat:
Delphi-Quellcode:
aber es kommt n'fehler bei der zeile in der gelesen werden sollte, da kommt string und stream sind irgendwie nicht kompatibel:S
ts:= TMemoryStream.Create;
try ts:=ini.ReadBinaryStream('Beschreibung:','ts',''); ts.position:=0; finally m.Free; mfG toredo |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
Wie Du in der Hilfe siehst ist ReadBinaryStream vom Syntax etwas anders als
ts:= TMemoryStream.Create;
try ini.ReadBinaryStream('Beschreibung:','ts',ts); ts.position:=0; finally m.Free; ReadString. Hier wird als dritter Parameter der Stream erwartet und nicht ein ''. ReadBinayStream liefert einen Integer zurück, den kannst Du verwerten mußt Du aber nicht. Grüße Klaus |
Re: problem mit felddatenspeicherung
thx, das problem ist jetzt gelöst, aber jetzt kommt auf der gleichen zeile, dass tmemorystring udn integer nicht kompatibel sind:S
weiss jemand wo es ein gutes tut über inis gibt, das sich mti dem allem befasst, das könnte ich nämlich gebrauchen:) mfG toredo |
Re: problem mit felddatenspeicherung
Du hast doch nicht etwa noch diese da stehen?
Delphi-Quellcode:
das kann auch nicht gehen, weil wie oben beschrieben
ts:=ini.ReadBinaryStream('Beschreibung:','ts','');
ini.ReadBinaryStream einen Integer zurückgibt. TMemoryStream und Integer vertragen sich halt so nicht. Das sollte eigentlich so aussehen.
Delphi-Quellcode:
ini.ReadBinaryStream('Beschreibung:','ts','');
Grüße Klaus |
Re: problem mit felddatenspeicherung
ok, das ende naht :-D
Delphi-Quellcode:
jetzt muss ich nur noch den text von ts zu nem string machen, weil bei der zeile RichEdit2.Text:=ts; kommt sonst ne meldung.
ts:= TMemoryStream.Create;
try ini.ReadBinaryStream('Beschreibung:','ts',ts); ts.position:=0; finally RichEdit2.Text:=ts; ts.Free; end; thx, dass ihr mich noch nicht aufgegeben habt :stupid: mfG toredo |
Re: problem mit felddatenspeicherung
Delphi-Quellcode:
Grüße
ts:= TMemoryStream.Create;
try ini.ReadBinaryStream('Beschreibung:','ts',ts); ts.position:=0; RichEdit2.lines.loadfromStream(ts); finally ts.Free; end; Klaus |
Re: problem mit felddatenspeicherung
thx, jetzt funzt alles :thumb:
hab noch en frage die nicht unbedingt beantwortet werden muss, da es nicht so wichtig ist. kann man auch machen, dass mehr als 1023 zeichen gespeichert werden können? wie schon gesagt, das ist nicht so wichtig, wäre aber geil:) thx für die gute hilfe , ohne euch (besonders ohne klaus01) hätte ich das nie geschafft:) mfG toredo |
Re: problem mit felddatenspeicherung
was ist denn auf 1023 Zeichen begrenzt?
TIniFile kann bis auf max 64KByte anwachsen, wenn es größer gewünscht wird auf TMemIniFile umsteigen. Grüße Klaus |
Re: problem mit felddatenspeicherung
Zitat:
mfG toredo -edit- ich hab mal was ausprobiert, ich hab nen text gesucht der bestimmt mehr als 1023 zeichen hat und ihn mal gespeichert und wieder geöffnet, das kam heraus: noch n'info:bei kleinen texten funzt alles perfekt. originaltext: Zitat:
Zitat:
mfG toredo |
Re: problem mit felddatenspeicherung
nun, bei mir in der Hilfe (delphi 6) steht die Einschränkung nicht.
Kannst ja mal bei WriteBinaryStream im TMemIniFile schauen ob es da auch die Einschränkung gibt. - und was versteht die Hilfe unter windows ini file? - oder ist die Hilfe auch für Kylix gedacht gewesen? RichEdit2.plainText:= false; dann werden auch die Formatanweisungen richtig interpretiert. Grüße Klaus |
Re: problem mit felddatenspeicherung
in der hilfe bei WriteBinaryStream steht nichts von 1023 zeichen...
RichEdit2.plainText:= false; hab ich drin, der text steht aber trozdem so komishc da wenns zu viele zeichen sind. hm, dne definition fürn windows ini file ist wahrscheinlich end so einfach aber ich glaub ich weiss wieso es ned funzt, wenn amn mehr als 1023 zeichen benuzen will: wenn man im editor a hinschreibt das kopiert und wieder einfügt dass es aa gibt udn dass wieder kopiert zu aaaa dund immer so weitermacht dann kommt man auf einmal auf eine neue zeile. und da könnte es probleme geben, weil eine zeile wahrscheinlich nur 1023zeichen lange ist... mfG toredo |
Re: problem mit felddatenspeicherung
das liegt an der Windows API die läßt nur 1023 Zeichen pro Zeile zu.
siehe hier -> ![]() daraus folgt: -> den text in mehreren keys speichern - umständlich -> den Text in ein seperates File speichern und den Dateinamen in der ini hinterlegen - schaut für mich sinnvoller aus Grüße Klaus |
Re: problem mit felddatenspeicherung
Zitat:
wenn das zu kompliziert ist, dann wäre es acuh schon ok, wenn es zwei files gibt, ist ja auch ned so schlimm. :? sry wegen gestern abend, meine eltern haben mir "befohlen" ins bett zu gehn, weil ich ja am nächsten tag bzw. heute ne prüfung habe... mfG toredo |
Re: problem mit felddatenspeicherung
ja, dann viel Glück bei der Prüfung.
zwei Files in einem Speichern geht schon, ist aber umständlich. Du mußt sie halt mit append zusammenführen, mußt sie aber auch bevor Du die ini lesen kannst wieder auseinanderfriemeln. save to file, ist doch eine Möglichkeit. Da kannst Du den Name der ini erfragen und mit dem gleichen Namen kannst Du ja auch das rtf File abspeichern (richedit.lines.savetofile()), nur halt mit einer anderen Extension test.ini und test.rtf . Grüße Klaus |
Re: problem mit felddatenspeicherung
ok, dann mache ich das mit den zwei dateien.
Zitat:
mfG toredo |
Re: problem mit felddatenspeicherung
Du machst Dir in der IniDatei
- eine Section z.B. RTF-File - einen Key z.B. Path mit dem value des Pfades wo die Datei abgelegt ist, oder abgelegt werden soll - eine key z.B. FileName mit dem value des Dateinamens das kannst Du mit WriteString und ReadString machen Das RicheEdit Feld kannst Du dann mit richedit1.lines.savetofile(<DeinPfad+Dateiname>) abspeichern Mit richedit.lines.loadfromfile((<DeinPfad+Dateiname>) kannst Du es wieder einlesen. Grüße Klaus |
Re: problem mit felddatenspeicherung
also sollte der abshcnitt der ini etwa so aussehen:
Code:
da die rtf ja im selben ordner wie die ini liegen sollte kann ich doch einfach den dateinamen eingben?
[RTF-File]
Path=texst.rtf wäre es dann aber nicht noch einfach wenn ich dne text aus der richedit einfachn in einer datei speichern lasse und wenn der open-dialog erscheint einfach die ini ausgesucht werden kann und dass dann einfach auch noch nach der .rtf datei gesucht wird, also so in etwa meine stelle ich mri das vor: speichern: 1.pfad wird ausgewählt 2.beide dateien werden gesprichert, in der einen alles ausser das richedit-feld udn in der zweiten einfach das rich-edit-zeugs. öffnen: 1.pfad wird ausgewählt 2.man wählt die ini aus und dann wird automatisch nahc der rtf gesucht udn diese dann halt auch geladen. dabei gäbe es aber zwei probs für mich: 1.das ist bestimmt einfach zu lösen. ich möchte dass wenn das proggi .ini gelesen hat, die .rtf datei ladet, dafür muss ich aber den dateinamen ohne die endung abschneiden können, was ich aber nicht kann. [erledigt]2.ich weiss nicht wie man den inhalt einer txt bzw rtf-datei in den richedit kriegt. mfG toredo |
Re: problem mit felddatenspeicherung
wenn Du die IniDatei mit dem OpenDialog geladen hast
kannst Du auf die Variable FileName des OpenDialogs zurückgreifen Diese liefert Dir den Name der ausgesuchten Datei. z.B. einBeispiel.ini dann kannst Du die Funktion ChangeFileExt ausführen um damit die Extension der iniDatei mit der Extension der rtfDatei zu tauschen. Die Funktion ChangeFileExt findest Du in der SysUtils Unit, diese mußt Du dann unter uses einbinden. rtfFileName:=changeFileExt('einBeispiel.ini','.rtf') dann kannst Du mit RichEdit.lines.loadFromFile(rtfFileName) die Datei laden. (wurde weiter oben aber schon mal erwähnt) Grüße Klaus [edit] rtf durch .rtf getauscht [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:17 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