Autor Beitrag
Friedhelm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Fr 22.11.02 14:06 
Hallo zusammen,

ich lege zur Laufzeit Kunden-Namen in Combobox fest, die mit Enter gespeichert werden. Geht auch.

Die EXE und die INI-Dateien kopiere ich in einen anderen Ordner.


Wird das Programm geschlossen und erneut aufgerufen, sind die Namen nicht mehr lesbar.
Was mache ich falsch?
Ist die ANgabe " Kunde.Ini" falsch??
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
//*********************************************** Ini Kunde
    begin
      
//Ini fuer Kunde erstellen

   ComINI := TIniFile.Create(ExtractFileDir(paramstr(0))+'\Kunde.ini');

  try
    for i := 1 to 10 do
      begin
        tmp1 := ComINI.ReadString('ComboBox9',inttostr(i),'');
        if tmp <> '' then ComboBox9.Items.Add(tmp1);
       // if tmp = '' then ShowMessage('nix drin');
      end;
  finally
    ComINI.Free;
  end;
  //********************************************* Ende


  //******************************************************


  begin
  if FileExists(ChangeFileExt(paramstr(0),'.ini')) then                //ComboBox zur Laufzeit aendern
    begin
         Form1.ComboBox9.Items.Clear;                     // ComboBox leeren

      ComINI := TIniFile.Create(ChangeFileExt(paramstr(0),'Kunde.ini'));
      try
        u2   := TStringList.Create;
        try
          ComINI.ReadSection('ComboBox9',u2);
          if u2.Count > 0 then
            for idy := 0 to u2.Count - 1 do
                Form1.ComboBox9.Items.Add(ComINI.ReadString('ComboBox9',u2.Strings[idy],''));
     finally
     u2.Free;
   end;


      finally
        ComINI.Free;
      end;


      idy := 0; while(true) do                                 // Leerstrings ausfiltern
                begin
                  if   Form1.ComboBox9.Items.Strings[idy] = '' then   Form1.ComboBox9.Items.Delete(idy);
                  inc(idy); if idy > (  Form1.ComboBox9.Items.Count - 1) then break;
                end;



       Form1.ComboBox9.ItemIndex := 0;                            

rocedure TForm1.ComboBox9KeyPress(Sender: TObject; var Key: Char);

const
  KEY_ENTER : char = #13;
var
  ComINI : TIniFile;
  idy : integer;
  u2 : TStringList;
begin
  if (Key = KEY_ENTER) and ( Form1.ComboBox9.Text <> '') and (Form1.ComboBox9.Items.IndexOf( Form1.ComboBox9.Text) = -1) then
    begin
      ComINI := TIniFile.Create(ChangeFileExt(paramstr(0),'Kunde.ini'));
      try
        u2 := TStringList.Create;
        try
          ComINI.ReadSectionValues('ComboBox9',u2);
          if u2.Count > 0 then
            if u2.IndexOf(Form1.ComboBox9.Text) <> -1 then exit; // Item schon vorhanden,
                                                     // beenden OHNE Speichern
        finally
          u2.Free;
        end;

        // letzten gültigen Zähler herausfinden
        idy := Form1.ComboBox9.Items.Count;  while(true) do
                                 if ComINI.ValueExists('ComboBox9',inttostr(idy)) then inc(idy)
                                   else break;

        // neuen String in die INI-Sektion einfügen
        ComINI.WriteString('ComboBox9',inttostr(idy),Form1.ComboBox9.Text);

              finally
        ComINI.Free;
      end;
    end;
end;


Dankr für den Tip

Gruss
Friedhelm
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 14:27 
Friedhelm hat folgendes geschrieben:
Ist die ANgabe " Kunde.Ini" falsch??

Das fragst du -als Entwickler des Programms!- uns? Du musst doch wissen, welchen Namen deine INI-Datei benutzt. Oder? :?
ausblenden Quelltext
1:
ChangeFileExt(paramstr(0),'Kunde.ini')					

macht aus deinem Programm, nennen wir´s mal "Project1.exe",
ausblenden Quelltext
1:
Project1Kunde.ini					

Ich glaube, in dem Fall ist es logisch, dass der Zugriff auf die INI scheitert.
Friedhelm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 47



BeitragVerfasst: Fr 22.11.02 14:36 
Hallo Mathias,

KLar, der Name ist schon richtig. NUr wenn ich die Exe mit den Ini-Dateien in einen ganz anderen Ordner kopiere und dann das Programm starte, wird die Comobox9 nicht mehr eingelesen - was ja vorher, im Entwicklungsordner funktionierte.
Muss ein Pfad angegeben werden?

Gruss
Friedhelm
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 14:40 
Pfad angeben ist immer gut, wenn man irgendwelche Dateien öffnen will.

Versuch es mal so:
ausblenden 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 TForm1.FormCreate(Sender: TObject);
var
  ini: TIniFile;
  sPath, s: String;
begin
  sPath := ChangeFileExt(ParamStr(0), '.ini');
  ini := TIniFile.Create(sPath);
  try
    Caption := ini.ReadString('Sektion', 'Ident', 'nicht gefunden');
  finally
    ini.Free;
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  ini: TIniFile;
  sPath: String;
begin
  sPath := ChangeFileExt(ParamStr(0), '.ini');
  ini := TIniFile.Create(sPath);
  try
    ini.WriteString('Sektion', 'Ident', 'Value');
  finally
    ini.Free;
  end;
end;
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 17:24 
Luckie hat folgendes geschrieben:
Pfad angeben ist immer gut, wenn man irgendwelche Dateien öffnen will.

Dem kann ich nur zustimmen, bloß der Pfad steckt in dem Fall ja in "paramstr(0)" drin. Durch die Zeile:
ausblenden Quelltext
1:
ChangeFileExt(paramstr(0),'.ini')					

wird ja lediglich die Endung umbenannt, so dass aus
ausblenden Quelltext
1:
c:\LastCrap\Project1.exe					

eben
ausblenden Quelltext
1:
c:\LastCrap\Project1.ini					

wird. Mein Hinweis betraf die Codezeile von Friedhelm:
ausblenden Quelltext
1:
2:
3:
4:
5:
if FileExists(ChangeFileExt(paramstr(0),'.ini')) then
  begin
     { ... }

      ComINI := TIniFile.Create(ChangeFileExt(paramstr(0),'Kunde.ini'));

Da steckt IMO der Fehler. Du prüfst, ob z.B. eine Datei "c:\lastcrap\Project1.ini" existiert, greifst dann aber falsch zu und suchst nach einer "c:\lastcrap\Project1Kunde.ini".
Warum es im Entwicklungsordner funktioniert, weiß ich nicht. Vielleicht zieht sich dieser Fehler auch durch den Code, den du zum Speichern der INI nimmst, so dass sich in deinem Entwicklungsordner tatsächlich eine Datei
ausblenden Quelltext
1:
Project1Kunde.ini					

befindet? Natürlich ist PROJECT1 jetzt nur ein Dummyname, weil ich ja nicht weiß, wie dein Programm tatsächlich heißt.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 18:43 
1. Es ist nicht üblich zu prüfen ob es eine INI Datei gibt. Ist keine INI da, so gibt es keine Fehlermeldung. Man bekommt eben nur keine Werte, d.h. Value und sonstige Werte sind leer. Man kann natürlich in OnCreate des Formulars ein mal abfragen ob die INI im allgemeinen da ist, aber später zu fragen ist Unsinnig.

2. Hast du schon mal etwas von with ... do gehört?

ausblenden Quelltext
1:
         Form1.ComboBox9.Items.Clear;					


3. Du brauchst kein

if u2.Count > 0 then

weil wenn u2 leer ist wird

ausblenden Quelltext
1:
for idy := 0 to u2.Count - 1 do					


nicht ausgeführt.

4. Dann gibts hier mal tmp und mal tmp1

ausblenden Quelltext
1:
2:
3:
        tmp1 := ComINI.ReadString('ComboBox9',inttostr(i),''); 
        if tmp <> '' then ComboBox9.Items.Add(tmp1); 
       // if tmp = '' then ShowMessage('nix drin');


5 . Mal hast du

ausblenden Quelltext
1:
TIniFile.Create(ChangeFileExt(paramstr(0),'/Kunde.ini'));					


dann wieder

ausblenden Quelltext
1:
TIniFile.Create(ChangeFileExt(paramstr(0),'Kunde.ini'));					


das / ist der Unterschied.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 20:34 
Wo hast du die Zeile
ausblenden Quelltext
1:
TIniFile.Create(ChangeFileExt(paramstr(0),'/Kunde.ini'));					

gefunden, Popov? Also, ich würde mal sagen: selbstausgedachte Codezeilen kann man Friedhelm nicht als Fehler vorwerfen. :idea:
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Fr 22.11.02 22:26 
MathiasSimmack hat folgendes geschrieben:
Wo hast du die Zeile
ausblenden Quelltext
1:
TIniFile.Create(ChangeFileExt(paramstr(0),'/Kunde.ini'));					

gefunden, Popov? Also, ich würde mal sagen: selbstausgedachte Codezeilen kann man Friedhelm nicht als Fehler vorwerfen. :idea:


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
//*********************************************** Ini Kunde 
    begin 
      
//Ini fuer Kunde erstellen 

   ComINI := TIniFile.Create(ExtractFileDir(paramstr(0))+'\Kunde.ini'); 

...


Frag mich jetzt nicht wie aus den Backslash ein Slash wurde. Ich hab die Zeile nur in soweit angepackt, als das ich sie kopiert habe. Aber gehen wird mal davon aus, daß ich eine gespaltene Persönlichkeit bin und mein zweites Ich sich Julio Rodriguez nennt und ich das nur nicht weiss. Nehmen wir also an, daß dieser Julio aus dem Backslash ein Slash gemacht hat und mir nichts davon gesagt hat. In diesem Fall ist das ganze nur in grün. Es ändert nicht drann das in der einer Zeile ein Backslash ist und in der anderen ein Backslash vergessen wurde.

Es gibt also ein:

c:\delphi\projekte\kunde.ini

und ein

c:\delphi\projektekunde.ini
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 23.11.02 09:57 
Hallo Herr Julio Rodriguez. Bitte mal die Brille aufsetzen. Ich schreibe den Unterschied groß:
ausblenden Quelltext
1:
TIniFile.Create(EXTRACTFILEDIR(paramstr(0))+'\Kunde.ini');					

Das hat mit
ausblenden Quelltext
1:
TIniFile.Create(CHANGEFILEEXT(paramstr(0),'Kunde.ini'));					

nichts zu tun. :)

Und du kannst mir glauben, das stand schon immer da. Ich denke, der einzige, der was geändert hat, war Tino - die Codetags nämlich. Hätte Friedhelm heimlich seinen Code geändert, müsste da stehen "Beitrag x-mal bearbeitet". :wink:


Abgesehen davon ist der Slash oder Backslash an der Stelle unwichtig. Ob ich nun schreibe:
ausblenden Quelltext
1:
2:
3:
ExtractFilePath(paramstr(0)) + 'Kunde.ini'
ExtractFilePath(paramstr(0)) + '/Kunde.ini'
ExtractFilePath(paramstr(0)) + '\Kunde.ini'

die Datei wurde bei mir (D5) in allen drei Fällen im Pfad des Programms angelegt bzw. ausgelesen.

Nein! Ich denke, der Fehler liegt zwar in der Zeile:
ausblenden Quelltext
1:
TIniFile.Create(ChangeFileExt(paramstr(0),'Kunde.ini'));					

Aber nur deshalb, weil "ChangeFileExt" die Dateiendung umbenennt und nicht den Pfad des Ordners heraussucht. Friedhelm hat schlichtweg nicht aufgepasst (Schusseligkeitsfehler beim Programmieren).
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Sa 23.11.02 15:44 
Also den Julio muß ich wirklich in mir haben. Komisch, ich dachte immer, daß ich von meiner Krankheit irgendwie anders erfahre. Das es aber in einem Delphiforum sein wird hätte ich wirklich nicht gedacht. Sei's drum, hab ich eben einen Freund mehr ;)

Mir ist schon klar, daß nachträgliche Änderungen (spätestens wenn einer geantwortet hat) nicht ohne ein Hinweis bleiben, aber wenn man in einer Zeile, die man kopiert hat, ein Zeichern markiert und dieses ändert, sowas müßte man doch merken.

Anderes Thema.

Zitat:
Abgesehen davon ist der Slash oder Backslash an der Stelle unwichtig. Ob ich nun schreibe:
Code:
ExtractFilePath(paramstr(0)) + 'Kunde.ini'
ExtractFilePath(paramstr(0)) + '/Kunde.ini'
ExtractFilePath(paramstr(0)) + '\Kunde.ini'

die Datei wurde bei mir (D5) in allen drei Fällen im Pfad des Programms angelegt bzw. ausgelesen.


Wie war das? Selbstausgedachte Codezeilen kann man ...

ExtractFilePath ist was anderes wie ExtractFileDir. Der Unterschied ist ein Backslash an Ende. Auch ergeben deine drei Beispiele drei verschiedene Ergebnisse. Ich habs in D3 und D5 getestet. Eigentlich brauchte ich den Test nicht, aber ich habs trotzdem gemacht. Mein Selbstvertrauen ist eben nicht so groß wie von Julio und ich lasse mich uberzeugen.

Versuch bitte das:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage( ExtractFileDir(paramstr(0))+'\Kunde.ini' );
  ShowMessage( ChangeFileExt(paramstr(0),'Kunde.ini') );

  ShowMessage( ExtractFilePath(paramstr(0)) + 'Kunde.ini' );
  ShowMessage( ExtractFilePath(paramstr(0)) + '/Kunde.ini' );
  ShowMessage( ExtractFilePath(paramstr(0)) + '\Kunde.ini' );
end;