Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Memofeld direkt speichern in bestimmter datei


M.wieMmanfred - So 15.02.09 18:45
Titel: Memofeld direkt speichern in bestimmter datei
hi, wie kann ich es schaffen, dass ein memofeld in eine ganz bestimmt datei gespeichert wird, und nicht erst das speichern fenster geöffnet wird???
und anders rum genauso, mit dem öffnen einer bestimmten datei???

Danke


JayEff - So 15.02.09 18:47


Delphi-Quelltext
1:
2:
Memo1.Lines.SaveToFile('C:\test.txt');
Memo1.Lines.LoadFromFile('C:\blah.txt');
Meinst du das? :)


M.wieMmanfred - So 15.02.09 18:56

jetzt funktioniert irgendwie gar nicht mehr und er gibt mir den fatalen fehler, dass die .exe nicht kompiliert werden kann.... -.-


JayEff - So 15.02.09 18:58

user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:
funktioniert [...] nicht
(TM), die aufschlussreichste Fehlerbeschreibung, seit es das DF gibt :zustimm:
Tut mir leid, aber ohne deinen Code und ohne die genauen Fehler kann ich dir nicht helfen :nixweiss:


M.wieMmanfred - So 15.02.09 19:02

habe bemerkt, das ist noch davor SaveDialog1.Execute setzen muss...
allerdings funktioniert es dann nicht, dass er es automatisch öffnet, bzw. speichert sondern wieder das Speichern-Fenster aufruft...


JayEff - So 15.02.09 19:05

Mir scheint, du verstehst die Zusammenhänge nicht.


Delphi-Quelltext
1:
2:
 SaveDialog1.Execute //Hier wird das Speichern-Fenster angezeigt.
Memo1.Lines.SaveToFile //hier wird gespeichert

Du kannst natürlich beides getrennt nutzen, die erste Zeile weglassen, aber selbstverständlich kannst du dann nicht auf SaveDialog1.FileName zugreifen, da dieser noch nicht gesetzt ist.

Soviel hat meine Kristallkugel ausgespuckt als ich sie befragt hab, aber leider muss die mal wieder in Reparatur, deinen Code konnte sie mir nicht anzeigen :nixweiss:


elundril - So 15.02.09 19:06

zeig mal bitte ein bisschen quellcode.

lg elundril


M.wieMmanfred - So 15.02.09 19:14


Delphi-Quelltext
1:
2:
3:
4:
procedure TLogin.FormCreate(Sender: TObject);
begin
  MemPasswort.Lines.LoadFromFile('C:\test.txt');
end;


also eigentlich nichts weltbewegendes, einfach beim programmaufruf soll das memofeld die daten vom letzten mal laden, aus einer file...
nun gibt er mir aber die fehlermeldung, wenn ich das mit dem execute wegelassen habe

Quelltext
1:
[Fataler Fehler] ProgrammLogin.dpr(6): Verwendete Unit 'LoginProgramm.pas' kann nicht compiliert werden                    


habe mich vorhin mit der .exe vertan.... sry...

das scheint ja nun daran zu liegen, wie du schon sagtest, dass savedialog1 noch nicht gesetzt ist und er nicht drauf zu greifen kann... aber wie kann ich denn drauf zugreifen, ohne, dass das lästige speichern-/öffnen-fenster angezeigt wird???


JayEff - So 15.02.09 19:25

user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:
das scheint ja nun daran zu liegen, wie du schon sagtest, dass savedialog1 noch nicht gesetzt ist und er nicht drauf zu greifen kann... aber wie kann ich denn drauf zugreifen, ohne, dass das lästige speichern-/öffnen-fenster angezeigt wird???
Daran liegts mit Sicherheit nicht, wenn dein Code genau so lautet(In deinem code steht nirgens SaveDialog1.Filename, du greifst also nicht auf den Speicherdialog zu). Genauso mit Sicherheit kann ich dir garantieren, dass der Fehler nicht im von dir geposteten Code liegt.


M.wieMmanfred - So 15.02.09 19:28


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:
28:
procedure TLogin.Button1Click(Sender: TObject);
var a,b : string;
    i, IntSchluessel : integer;
begin

  a := Edname.Text;
  b := EdPasswort.Text;
  If length(a) or length(b) = 0 then
    Begin
      Label3.Caption := 'Geben sie erst einen Namen und/oder ein Passwort ein';
    end
  else
    Begin
      MemName.Lines.Add(a);
      IntSchluessel:= StrToInt(SpinEdit1.Text);
      memPasswort.Lines.Clear;
      for i := 1 to Length(EdPasswort.Text) do
      memPasswort.Lines.Insert(i,VerschluesseleCeasar(EdPasswort.Text[i],IntSchluessel));
    end;
  MemPasswort.Lines.SaveToFile('C:\test.txt');
end;

procedure TLogin.FormCreate(Sender: TObject);
begin
  MemPasswort.Lines.LoadFromFile('C:\test.txt);
end;

end.


Delete - So 15.02.09 19:34

Zitat:

Delphi-Quelltext
1:
If length(a) or length(b) = 0 then                    

-->

Delphi-Quelltext
1:
If (length(a) = 0or (length(b) = 0then                    


jaenicke - So 15.02.09 19:35

Poste doch einmal den Fehler, der von dir gepostete fatale Fehler ist ja erst der Folgefehler, weil in dr Unit ein Fehler aufgetreten ist.

Ein Fehler ist jedenfalls das, auch wenn das glaube ich der Compiler schluckt:

Delphi-Quelltext
1:
If length(a) or length(b) = 0 then                    
Ausgewertet wird das dann (bitweise or :!: ) so:

Delphi-Quelltext
1:
If (length(a) or length(b)) = 0 then                    
Und das willst du ja nicht. Richtige Version siehe über mir. :mrgreen:

Einen Fehler, der zum Abbruch des Kompilierens führen würde, sehe ich gerade nicht, der wird wohl woanders als dort sein. :nixweiss:
Wie gesagt: Poste die Fehlermeldung.


JayEff - So 15.02.09 19:36

da sind 2 Fehler drin: In der letzten Prozedur dürfte die IDE die Fehlermeldung "Nicht abgeschlossener String" bringen: es fehlt ein '
und du fragst ab, ob Length(a) or Lenght(b) = null ist. Delphi rechnet nun:

Quelltext
1:
2:
3:
4:
   101101 (das sei mal length(a) in binär-darstellung
or 011001 (das sei length(b) in binär)
=========
   111101 (das ist das ergebnis length(a) or length(b)

Du musst wissen: or ist wie ein rechenzeichen, +, - oder sowas, und es wird auf binärebene ein logisches oder durchgeführt, siehe hierzu Wikipedia: http://de.wikipedia.org/wiki/Disjunktion
Die richtige Schreibweise hat dir DeddyH schon gepostet.

Die von dir gepostete Fehlermeldung von wegen "kann nicht kompiliert werden" ist sicherlich nicht die einzige, die er dir angezeigt hat. Die andere wäre interessanter gewesen ;)


Delete - So 15.02.09 19:36

Außerdem fehlt da ein Hochkomma.

Delphi-Quelltext
1:
2:
3:
4:
procedure TLogin.FormCreate(Sender: TObject);
begin
  MemPasswort.Lines.LoadFromFile('C:\test.txt');
end;


JayEff - So 15.02.09 19:40

user profile iconJayEff hat folgendes geschrieben Zum zitierten Posting springen:
da sind 2 Fehler drin: In der letzten Prozedur dürfte die IDE die Fehlermeldung "Nicht abgeschlossener String" bringen: es fehlt ein '

:motz:


Delete - So 15.02.09 19:42

:twisted:


jaenicke - So 15.02.09 19:42

Stimmt, da habe ich gar nicht drauf geachtet, weil das in der Originalfehlermeldung zuerst nicht so war: :shock:
user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
procedure TLogin.FormCreate(Sender: TObject);
begin
  MemPasswort.Lines.LoadFromFile('C:\test.txt');
end;
user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
[...]
end;

procedure TLogin.FormCreate(Sender: TObject);
begin
  MemPasswort.Lines.LoadFromFile('C:\test.txt);
end;

end.
Welches ist denn nun der echte Code?


M.wieMmanfred - So 15.02.09 19:46

so ich kann euch jetzt mal das zeigen, was ich bisher hab, dort gibt es keine einziges fehlermeldung (sorry wegen dem hochkommer, das war ein Flüchtigkeitsfehler... hatte ich danach erst behoben...)


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:
28:
29:
procedure TLogin.Button1Click(Sender: TObject);
var a,b : string;
    i, IntSchluessel : integer;
begin

  a := Edname.Text;
  b := EdPasswort.Text;
  Memo1.Lines.Add(b);
 If (length(a) = 0or (length(b) = 0then
    Begin
      Label3.Caption := 'Geben sie erst einen Namen und/oder ein Passwort ein';
    end
  else
    Begin
      MemName.Lines.Add(a);
      IntSchluessel:= StrToInt(SpinEdit1.Text);
      memPasswort.Lines.Clear;
      for i := 0 to memo1.Lines.Count-1 do
      memPasswort.Lines.Insert(i,VerschluesseleCeasar(memo1.Lines[i],IntSchluessel));
    end;
  MemPasswort.Lines.SaveToFile('C:\test.txt');
end;

procedure TLogin.FormCreate(Sender: TObject);
begin
  MemName.Lines.LoadFromFile('C:\test.txt');
end;

end.


jetzt habe ich kein einziges execute mehr drin... jetzt kommt auch keine fehlermeldung mehr, aber ich weiß trotzdem nicht, wie ich das hinbekomme mit dem automatschi saven, loaden von ner bestimmten datei...

sry, bin noch nicht so der profi^^


JayEff - So 15.02.09 19:49

user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:
aber ich weiß trotzdem nicht, wie ich das hinbekomme mit dem automatschi saven, loaden von ner bestimmten datei...
Du speicherst/lädtst doch schon von einer bestimmten Datei, nämlich C:\test.txt? :gruebel:


elundril - So 15.02.09 19:52

hast du schreibrechte für die c-platte?

lg elundril


M.wieMmanfred - So 15.02.09 19:55

eben das tut er ja nicht, sonst würde ich ja beim programmstart schon etwas in memPasswort vorfinden, ich habe das gefühl, als wenn das saven /loaden nichts bringen würde...

doch momentmal, Speichern tut er habe ich jetzt bemekrt, aber ich will ja, dass er zu anfang auch die datei wieder öffnet, damit sie nicht einfach nur überschrieben wirde, sondern alles enthalten bleibt..
aber eben das tut er nicht... -.-


JayEff - So 15.02.09 20:00

user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
  MemPasswort.Lines.SaveToFile('C:\test.txt');
  MemName.Lines.LoadFromFile('C:\test.txt');
Du speicherst den Inhalt des MemPasswort, und lädst es in das MemName :nixweiss: wundert dich, dass in MemPasswort nix steht?


M.wieMmanfred - So 15.02.09 20:05

habe ich auch vorhin bemerkt und auch schon geändert...
aber selbst wenn, da es ein und die selbe datei ist, müsste es im anderen memofeld angezeigt werden, tut es aber nicht...


jaenicke - So 15.02.09 20:12

Also ich verstehe nicht was du eigentlich machst. :gruebel:
Du hast 3 Memos und schiebst da Strings hin und her. Wozu?


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:
procedure TLogin.Button1Click(Sender: TObject);
var a,b : string;
    i, IntSchluessel : integer;
begin

  a := Edname.Text;
  b := EdPasswort.Text;
  Memo1.Lines.Add(b); // wird immer ausgeführt und nie wieder gelöscht
 If (length(a) = 0or (length(b) = 0then
    Begin
      Label3.Caption := 'Geben sie erst einen Namen und/oder ein Passwort ein';
    end
  else
    Begin
      MemName.Lines.Add(a);
        // wird immer wieder ausgeführt und nie wieder gelöscht
        // Der Wert wird aber nie benutzt
      IntSchluessel:= StrToInt(SpinEdit1.Text);
      memPasswort.Lines.Clear;
      for i := 0 to memo1.Lines.Count-1 do // das ist beim ersten Klick 0, dann 1, dann 2... 
        // bei jedem Klick wird ja der wert von b in das Memo gelegt, der aktuellste Wert steht ganz unten
      memPasswort.Lines.Insert(i,VerschluesseleCeasar(memo1.Lines[i],IntSchluessel));
    end;
  MemPasswort.Lines.SaveToFile('C:\test.txt'); // das speicherst du immer
end;
Eine feste Datei auf Laufwerk C: ist sicher nicht sinnvoll. Einstellungen gehören eigentlich nicht in das eigene Verzeichnis, aber das wäre schonmal ein Fortschritt. Welches das ist, findest du mit ExtractFilePath(ParamStr(0)) heraus.


Delete - So 15.02.09 20:12

Das sollte egal sein, es war ja kein Laufzeitfehler ;)
*Huch*, da war ja noch ne Seite, wo kommt die denn auf einmal her?


M.wieMmanfred - So 15.02.09 20:15

danke schonmal, aber es ging mir mehr darum, wie ich einen string aus einem editfeld einlese, verschlüssele und dann in ein memofeld wieder ausgebe...
Nehmen wir an, du willst dich in ein programm einloggen.
Musst dich aber erst registrieren. Gibst benutzername und kennwort ein
bestätigst.
Dann soll das Passwort ausgelesen werden, verschlüsselt werden, und in ein Memofeld reingeschrieben werden, wo hinterher noch andere passwörter von anderen benutzern verschlüsselt rein kommen sollen. In ein nderes Memofeld sollen die benutzernamen rein, das ist ja auch recht einfach.
Beide memofelder sollen dann nach der registrierung gespeichert werden in eine txt file, damit man irgendwann, wenn man das programm wieder starte, sich mit seinen benutzerdaten einlggen kann...


vllt. verstehst du nun worum es geht^^ ;)


es ist ja auch noch nicht fertig, da ich erstmal das mit dem öffnen richtig hinbekommen will^^

wie gesagt, kenn mich noch nicht so gut aus, fazit---> noob


jaenicke - So 15.02.09 20:23

user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:
vllt. verstehst du nun worum es geht^^ ;)
Schon, aber was machen dabei die Memofelder? Das sind visuelle Komponenten zur Anzeige / Eingabe von Text, was hat das mit der Verschlüsselung und Speicherung zu tun.

Das kannst du doch auch mit einer TStringList z.B. machen. Und eine reicht eigentlich auch, 3 müssens nicht sein.


M.wieMmanfred - So 15.02.09 20:26

es soll ja nicht gleich ein profiprogramm sein, und da ich mich mit TStringliste nicht auskenne, kann ich es auch nicht ;)


elundril - So 15.02.09 20:28

n guter zeitpunkt es zu lernen! früher oder später kommste nicht drum rum. außerdem kannst gleich dich mit INIs auseinandersetzen wenn du schon dabei bist. ;-)

lg elundril


Hybrid666 - So 15.02.09 20:53

user profile iconM.wieMmanfred hat folgendes geschrieben Zum zitierten Posting springen:

jetzt habe ich kein einziges execute mehr drin... jetzt kommt auch keine fehlermeldung mehr, aber ich weiß trotzdem nicht, wie ich das hinbekomme mit dem automatschi saven, loaden von ner bestimmten datei...

sry, bin noch nicht so der profi^^


Ich denke was du willst ist das OnFormCreate und das OnFormClose event, das erste wird aufgerufen (und der code ausgeführt der drinsteht) sobald deine Form erstellt wird (beim starten des Programms) und das zweite wird aufgerufen wenn du deine Form zumachst.

Beide Findest du wenn du im Object Inspector auf Form1 klickst und unten dann auf Events gehts...

Ich hoffe das hilft.

MfG


Dude566 - Mo 16.02.09 18:25

Du lädst die Daten doch beim Starten des Programmes, und beim Klicken des Buttons speicherst du den Inhalt des Memo Feldes.

Und eine StringList zu erstellen, dürfte auch nicht das Problem sein.